iOS推送通知 – 当您点击应用程序图标而不是通知时如何获取通知数据

类似于这个问题: 如何访问applicationDidBecomeActive上的远程推送通知数据?

但是不同之处在于,如何在applicationDidBecomeActive访问通知数据,以及是否单击了应用程序图标而不是推送通知。

stream程如下:如果点击push notification则会触发didReceiveRemoteNotification ,但是如果您单击原始应用程序图标,则只会触发applicationDidBecomeActive并且不会调用didReceiveRemoteNotification

我正在寻找后面的情况,所以我如何访问推送通知数据。

(这两种情况下,假设应用程序在后台,并没有被杀害。)

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

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

@fannheyward答案是绝对正确的。 点击应用程序图标启动应用程序时无法获得有效载荷。

我有一个想法,如果你知道,通过点击应用程序图标启动应用程序时,有一些通知正在等待。 有了这些知识,您的应用程序就可以从服务器获取有效载荷

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

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

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

如果您的应用程序目标是iOS7以上,只有当应用程序在背景中活着时才可以执行。

在Xcode的function设置中,您应该启用背景模式>远程通知,并在下面写入代码。

 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { // save userInfo in NSUserDefaults completionHandler( UIBackgroundFetchResultNoData ); } 

如果你想testing它,使用https://github.com/acoomans/SimulatorRemoteNotifications将会很有帮助;

  • 从服务器端,请确保将内容可用属性值设置为1

为了这个工作,我还必须检查背景获取框。

你应该在appDelegate中的launchWithOptions方法中得到这样的通知:

 NSDictionary *remoteNotif = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]; if(remoteNotif != nil){ //Handle your notification }