36

与此问题类似:如何在 applicationDidBecomeActive 上访问远程推送通知数据?

applicationDidBecomeActive但不同的是,当您在其中以及单击应用程序图标而不是推送通知时,如何访问通知数据。

流程是:如果点击push notificationdidReceiveRemoteNotification触发,但如果点击原app图标,只会applicationDidBecomeActive触发,didReceiveRemoteNotification不会被调用。

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

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

4

4 回答 4

38

您无法通过从主屏幕启动应用程序来获取远程推送有效负载。

如果推送数据对应用程序使用很重要,请在应用程序启动后从您的服务器加载。

于 2012-08-23T02:55:57.090 回答
6

@fannheyward 的答案是绝对正确的。通过点击应用程序图标启动应用程序时,您无法获取有效负载。

我有一个想法,如果您通过点击应用程序图标来知道在应用程序启动时某些通知处于待处理状态,该怎么办。有了这些知识,您的应用程序就可以从您的服务器获取有效负载。

您可以在每个此类通知中设置“徽章”,并且在 applicationDidBecomeActive 上您可以检查 [application applicationIconBadgeNumber] > 0 以了解某些通知处于活动状态。从您的服务器获取有效负载后,您可以将其设置为 0,如下所示

[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

请注意:这意味着当您的应用收到通知时,其上方会显示徽章。我不确定用户从设置中禁用徽章时的行为。

于 2012-08-30T17:18:19.277 回答
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 属性设置为 1

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

于 2015-10-23T09:20:28.770 回答
-7

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

NSDictionary *remoteNotif = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];   

    if(remoteNotif != nil){  
        //Handle your notification   
    }
于 2012-08-24T18:58:48.190 回答