通过单击应用程序图标直接启动应用程序时,无法推送通知数据

我有一个场景,其中应用程序将获得推送通知,并需要在我的应用程序的主屏幕中显示消息,因为我将消息数组保存到我的应用程序委托的用户默认值,一切正常,但在以下条件下它不起作用

  1. 如果应用程序处于被杀死状态并且发出通知并且用户通过应用程序图标触发应用程序(而不是来自推送通知)

  2. 如果应用程序在后台并且通知来了,用户也通过应用程序图标(不是来自推送消息)进入应用程序

然后我搜索了解决方案,并了解了静音推送通知(用于后台模式),没有别的,所以我需要知道如何通过推送通知处理所有方案,我的appdelegete是

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSDictionary *remoteNotif = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]; if (remoteNotif) { [self handlePushMessage:remoteNotif]; } return YES; } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { [self handlePushMessage:userInfo]; } -(void)handlePushMessage :(NSDictionary*)userInfo{ //method to handle push message } 

提前致谢

这是一个常见问题:如果用户未通过显示的通知打开您的应用程序,则无法获取相关信息。

*许多应用程序采用的可能解决方案是检查远程服务器是否有未读通知(例如,检查未设置的读取日期字段)。

在场景1. NSDictionary *remoteNotif = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]; 当你通过触发应用程序图标进入应用程序时, remoteNotif返回nil

在方案2中。您可以通过以下方法获取推送通知信息

 -(void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { if (userInfo) { [self handlePushMessage:userInfo]; } } 
  1. 如果应用程序处于被杀死状态并且发出通知并且用户通过应用程序图标触发应用程序(而不是来自推送通知)

    • 如果应用程序处于被杀死状态,那么当用户点击推送通知本身时,推送通知有效负载只能被移交给应用程序。 如果用户从应用程序图标启动应用程序,则通知有效内容将不会传递给应用程序
  2. 如果应用程序在后台并且通知来了,用户也通过应用程序图标(不是来自推送消息)进入应用程序

    • 如果您的目标是iOS7及更高版本,那么您需要为远程通知启用后台模式。 请检查以下链接,以便即使应用程序处于后台也能获得通知有效负载

    didReceiveRemoteNotification无法在后台运行

    当应用程序处于前台,后台和挂起状态时,会调用上面提到的app delegate方法。

当应用程序被终止时以及直接点击应用程序图标而不是通知中心的推送通知时,无法获取通知有效负载。

在目标设置的function中,在后台模式下启用“远程通知”。 即使应用程序在后台,这也会获取通知数据。 另外,请确保实施:

 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler; 

在你的应用程序委托中。