iOS检索远程通知负载

时间:2015-04-19 23:28:26

标签: ios push-notification apple-push-notifications

我已经实现了UIApplicationDelegate方法-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler来处理推送通知,它运行正常。在某些情况下,我需要检索推送通知的有效负载。但有时这种委托方法不会被调用。

我有一个关于在这种情况下检索有效负载(userInfo)的问题:

应用程序在后台运行或未启动。应用程序收到推送通知,显示横幅,播放声音,显示消息,增加应用程序图标徽章,并在iOS通知中心中显示推送通知。如果用户在显示通知时或在通知中心点按通知,则会启动应用,并调用didReceiveRemoteNotification:方法。

但是,如果用户只是点按应用图标并以正常方式启动应用,则不会调用该方法,我无法检索userInfo

来自Apple的documentation on handling push notifications:

  

当应用未在前台运行时,会发送通知。在这种情况下,系统会显示通知,显示提醒,标记图标,或者播放声音,也许显示一个或多个操作按钮供用户点击。

     

用户点按iOS 8通知中的自定义操作按钮。在这种情况下,iOS调用application:handleActionWithIdentifier:forRemoteNotification:completionHandler:或application:handleActionWithIdentifier:forLocalNotification:completionHandler:。在这两种方法中,您都会获得操作的标识符,以便您可以确定用户点击的按钮。您还可以获得远程或本地通知对象,以便您可以检索处理操作所需的任何信息。

     

用户点按提醒中的默认按钮或点击(或点击)应用图标。如果点击默认操作按钮(在运行iOS的设备上),系统将启动应用程序并且应用程序调用其委托的应用程序:didFinishLaunchingWithOptions:方法,传入通知有效内容(用于远程通知)或本地通知对象(用于本地通知)。虽然application:didFinishLaunchingWithOptions:不是处理通知的最佳位置,但是此时获取有效负载使您有机会在调用处理程序方法之前启动更新过程。

     

如果通知是远程的,系统也会调用application:didReceiveRemoteNotification:fetchCompletionHandler:。

     

如果在运行OS X的计算机上单击了应用程序图标,应用程序将调用委托的applicationDidFinishLaunching:方法,其中委托可以获取远程通知有效负载。 如果在运行iOS的设备上点按了应用图标,该应用会调用相同的方法,但不提供有关通知的信息。

突出显示的部分有点说没有明显的方法以这种方式访问​​推送通知的有效负载。那么有办法解决这个问题吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

这是iOS的默认行为。除非用户通过点击通知打开您的应用,否则您永远不会知道有效负载。

答案 1 :(得分:0)

如果要向移动应用程序发送自定义数据(最多2048字节)或命令,则可以使用静默推送通知。 在推送通知中将“content-available”设置为1,以便您的应用获得一些时间处理数据,并将自定义内容添加到通知中。

我还使用静默推送通知来触发我的应用程序通过REST HTTP调用进行更新,因为我的数据可能大于最大大小...唯一的缺点是如果你是电池或处理器,Apple可能会阻止你的后台活动密集。始终提供视觉推送通知。

我最讨厌的东西是视觉推送通知,比如'你有新消息',有时我没有数据连接时点击这个消息,应用程序不会显示消息...你可以通过以下方式解决这个问题发送带数据的静默推送通知,并且仅当数据可以从服务器获取时,或者  正确存储,以防您可以在通知中发送所有内容,您可以设置本地通知。

明智地选择视觉和静音推送通知是我唯一的建议。

请查看以下链接以获取更多官方Apple信息:https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CreatingtheNotificationPayload.html