在后台接收推送通知

我知道这是覆盖了很多地方,但我不明白这一点。 我使用Urban Airship来推送通知。 一切似乎都很好,除了当我的应用程序在后台 – didReceiveRemoteNotification没有得到调用。 它在前台工作 – 我能够正确处理消息。 如果从通知中心点击消息,我可以从启动选项中获取消息。 但在后台发送消息时,iOS会显示警报 – didReceiveRemoteNotification不会被调用。 当我点击我的应用程序图标(不是来自通知中心内)的应用程序来到前台,我不知道通知是存在的。 有任何想法吗?

从APNS编程指南:

让我们回顾一下当操作为应用程序传递本地通知或远程通知时可能出现的情况。

通知在应用程序未在前台运行时传递。 在这种情况下,系统会显示通知,显示警报,标记图标,可能会播放声音。

作为提示通知的结果,用户点击警报的动作button或点击(或点击)应用程序图标。 如果点击操作button(在运行iOS的设备上),系统启动应用程序,应用程序调用其代理的应用程序:didFinishLaunchingWithOptions:方法(如果已实施); 它传入通知负载(用于远程通知)或本地通知对象(用于本地通知)。

如果在运行iOS的设备上点击应用程序图标,应用程序将调用相同的方法, 但不提供有关通知的信息

我相信最后一句话描述了你的情况,并解释了为什么你的应用程序没有得到关于通知的信息。

application:didReceiveRemoteNotification:只有当您将具有值1 content-available密钥添加到通知有效content-available时,才会在后台调用。 在城市飞艇的情况下,您可以在设置选项卡下发送testing推送。 推送通知的示例有效负载:

 { "aps": { "alert": "aaaa", "badge": "+1", "content-available": "1" }, "device_tokens": [ "86BA71E361B849E8312A7B943BA6B26A74AB436381CF3FEE3CD9EB436A12A292" ] } 

苹果已经在他的文档中明确提到过….

对于触发下载操作的推送通知,通知的有效内容必须包含内容可用密钥,其值设置为1.当该密钥存在时,系统在后台唤醒应用程序(或将其启动到后台)以及调用应用程序委托的应用程序:didReceiveRemoteNotification:fetchCompletionHandler:方法。 该方法的实现应下载相关内容并将其集成到您的应用程序中。 https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

didReceiveRemoteNotification仅在前台应用程序调用,或者应用程序刚刚启动或从后台向前台购买

链接在苹果和一些问题

方法didFinishLaunchingWithOptions:(NSDictionary *)launchOptions参数launchOptions其中一个字典键是UIApplicationLaunchOptionsRemoteNotificationKey ,它包含按下的推送通知信息。

游览主根控制器初始化后,您可以推送收到的信息。 我把它保存到一些属性,然后在查看被初始化后推送它。

 if (launchOptions) { if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]) { self.notificationToMakeAction = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; } }