通过单击应用程序图标直接启动应用程序时未获取推送通知数据

Push notification data not getting when app launched directly by clicking app icon

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

  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 return nil 当您通过触发应用程序图标进入应用程序时。

场景二中,您可以通过以下方式获取推送通知信息

-(void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
      if (userInfo) {

          [self handlePushMessage:userInfo];
      }
}

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

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

  1. 如果应用程序处于终止状态并且收到通知并且用户通过应用程序图标触发应用程序(而不是来自推送通知)

    • 如果应用程序处于终止状态,则推送通知负载只能在用户点击推送通知本身时移交给应用程序。如果用户从应用程序图标启动应用程序,则通知负载不会传递给应用程序
  2. 如果应用程序在后台并且收到通知并且用户通过应用程序图标(而不是来自推送消息)进入应用程序,在这种情况下也是如此

    • 如果您的目标是 iOS7 及以上,那么您需要为远程通知启用后台模式。请检查下方 link 以便即使应用程序处于后台时也能获得通知负载

    当应用处于前台、后台和挂起状态时,将调用上述应用委托方法。

当应用被杀死和直接点击应用图标而不是在通知中心推送通知时,无法获取通知负载。

在目标设置的功能中启用 "Remote Notifications" 在后台模式下。即使应用程序在后台,这也会获取通知数据。另外,确保实施:

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

在您的应用委托中。