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 }