与此问题类似:How do I access remote push notification data on applicationDidBecomeActive?
但不同的是,当您在applicationDidBecomeActive
和时,如果您点击了应用图标而不是推送通知,您将如何访问通知数据。
流程为:如果您点击push notification
,则会触发didReceiveRemoteNotification
,但如果您点击原始应用图标,则只会触发applicationDidBecomeActive
并{{1不会被调用。
我正在寻找后一种情况,以便如何访问推送通知数据。
(两种情况都假设应用程序处于后台并且尚未被杀死。)
答案 0 :(得分:36)
您无法通过从主屏幕启动应用来获得远程推送有效负载。
如果推送数据对于应用程序使用很重要,请在启动应用程序后从服务器加载。
答案 1 :(得分:6)
@fannheyward的答案绝对正确。通过点击应用程序图标启动应用程序时无法获得有效负载。
我有一个想法,如果您通过点击应用图标启动应用时,您会知道某些通知处于待处理状态。有了这些知识,您的应用程序就可以从您的服务器获取有效负载。
您可以在每个此类通知中设置“徽章”,并在applicationDidBecomeActive上设置[application applicationIconBadgeNumber]> 0知道某些通知是活动的。从服务器获取有效负载后,您可以将其设置为0,如下所示
[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
请注意:这表示您的应用在收到通知时会在其上显示徽章。用户从设置中禁用徽章时,我不确定该行为。
答案 2 :(得分:4)
如果您的应用程序目标是通过iOS7,则只有在应用程序处于活动状态时才能执行。
在Xcode的功能设置中,您应启用后台模式>远程通知,并在下面编写代码。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
// save userInfo in NSUserDefaults
completionHandler( UIBackgroundFetchResultNoData );
}
如果您想对其进行测试,请使用https://github.com/acoomans/SimulatorRemoteNotifications
为此,我还必须检查后台获取框。
答案 3 :(得分:-7)
您应该在appDelegate的launchWithOptions方法中获取通知,如下所示:
NSDictionary *remoteNotif = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];
if(remoteNotif != nil){
//Handle your notification
}