iOS推送通知 - 如何在单击应用程序图标而不是通知时获取通知数据

时间:2012-08-23 02:37:22

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

与此问题类似:How do I access remote push notification data on applicationDidBecomeActive?

但不同的是,当您在applicationDidBecomeActive时,如果您点击了应用图标而不是推送通知,您将如何访问通知数据。

流程为:如果您点击push notification,则会触发didReceiveRemoteNotification,但如果您点击原始应用图标,则只会触发applicationDidBecomeActive并{{1不会被调用。

我正在寻找后一种情况,以便如何访问推送通知数据。

(两种情况都假设应用程序处于后台并且尚未被杀死。)

4 个答案:

答案 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

  • 从服务器端,确保将content-available属性设置为值

为此,我还必须检查后台获取框。

答案 3 :(得分:-7)

您应该在appDelegate的launchWithOptions方法中获取通知,如下所示:

NSDictionary *remoteNotif = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];   

    if(remoteNotif != nil){  
        //Handle your notification   
    }