2015-04-19 34 views
4

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

我有一个关于在这种情况下获取的有效载荷(userInfo)问题:

无论是在背景或没有推出运行该应用程序。该应用程序收到推送通知,显示横幅,播放声音并显示消息,增加应用程序图标徽章,并可在iOS通知中心看到推送通知。如果用户在显示通知时或在通知中心点击该通知,则应用程序启动,并调用didReceiveRemoteNotification:方法。

然而,如果用户只需轻按应用程序图标和开展正常的方式应用,该方法不叫了,我不能检索userInfo

从苹果公司的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的设备上轻击应用程序图标,应用程序将调用相同的方法,但不提供有关通知的信息。

高亮的部分有点说有访问推送通知的有效载荷以这种方式没有明显的方式。那么有没有办法解决这个问题?

谢谢!

+0

您可以用一种无声的通知? –

回答

3

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

0

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

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

事情我最讨厌的是视觉推送通知,如“你已经有了一个新的消息”,关于这一点我有时点击时没有数据连接和应用程序将不会显示我的消息......你可以解决这个问题通过发送带数据的静默推送通知,并且只有当数据可以从服务器获取时,或者可以正确存储以防万一您可以在通知中发送全部数据时,您可以设置本地通知。

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

查看以下链接了解更多苹果官方信息:https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CreatingtheNotificationPayload.html