我知道这在很多地方都有涉及,但我无法弄清楚。我使用 Urban Airship 进行推送通知。一切似乎都很好,除了当我的应用程序在后台时 -didReceiveRemoteNotification
没有被调用。它在前台工作 - 我能够正确处理消息。如果从通知中心点击消息,我可以从启动选项中获取消息。但是在后台时,它发送的消息 - iOS 显示警报 -didReceiveRemoteNotification
不会被调用。当我点击我的应用程序图标(不是从通知中心内)时,应用程序进入前台,我不知道通知存在。有任何想法吗?
4 回答
application:didReceiveRemoteNotification:
仅当您将content-available
带有值的键添加1
到通知有效负载中时,才会在后台调用。如果是 Urban Airship,您可以在设置选项卡下发送测试推送。推送通知的示例负载:
{
"aps": {
"alert": "aaaa",
"badge": "+1",
"content-available": "1"
},
"device_tokens": [
"86BA71E361B849E8312A7B943BA6B26A74AB436381CF3FEE3CD9EB436A12A292"
]
}
苹果在他的文档中明确提到了......
对于触发下载操作的推送通知,通知的有效负载必须包含其值设置为 1 的内容可用键。当该键存在时,系统会在后台唤醒应用程序(或将其启动到后台)并调用应用委托的 application:didReceiveRemoteNotification:fetchCompletionHandler: 方法。您对该方法的实现应该下载相关内容并将其集成到您的应用程序中。 https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
从 APNS 编程指南:
让我们回顾一下操作为应用程序传递本地通知或远程通知时的可能场景。
当应用程序未在前台运行时会发送通知。在这种情况下,系统会显示通知、显示警报、标记图标,可能还会播放声音。
作为呈现通知的结果,用户点击警报的操作按钮或点击(或点击)应用程序图标。如果点击操作按钮(在运行 iOS 的设备上),系统会启动应用程序并且应用程序调用其委托的 application:didFinishLaunchingWithOptions: 方法(如果已实现);它传入通知负载(用于远程通知)或本地通知对象(用于本地通知)。
如果在运行 iOS 的设备上点击应用程序图标,应用程序会调用相同的方法,但不会提供有关通知的信息。
我相信最后一句话描述了您的情况,并解释了为什么您的应用程序没有收到有关通知的信息。
方法didFinishLaunchingWithOptions:(NSDictionary *)launchOptions参数 launchOptions 字典键之一是UIApplicationLaunchOptionsRemoteNotificationKey,它保存按下的推送通知信息。
初始化游览主根控制器后,您可以推送收到的信息。我将它保存到某个属性,然后在视图初始化后将其推送。
if (launchOptions) {
if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]) {
self.notificationToMakeAction = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
}
}