当应用程序处于后台但未挂起时如何处理推送通知

How to handle push notification when app is in background but not suspended

我的应用程序收到推送通知,并显示相应的信息消息。但是,当我单击消息时,应用程序变为活动状态,但应用程序 didFinishLaunchingWithOptions 未被调用,我认为这是正确的,因为应用程序未暂停,它只是退出活动状态。问题是当应用程序进入前台时,我如何确保用户点击消息?

我想你要找的是这个应用委托方法:

- (void)application:(UIApplication *)application     
       didReceiveRemoteNotification:(NSDictionary *)userInfo

如果您的应用程序在后台运行,它将被调用,并且通知负载将在 userInfo 字典中传递。这与应用程序从冷启动启动时的情况形成对比,当此方法 not 被调用时,您反而检查负载的 launchOptions 字典。

但是 首选 方式来做到这一点,因为 iOS7 是使用这个:

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

当用户点击通知时调用此方法,无论应用是从冷启动还是从后台前台启动。因此,即使您不使用 completionHandler,它也提供了一种更一致的访问通知负载的方式。如果存在此方法,则不会调用旧方法。

如果我对问题的理解正确,你问的是如何确保应用程序被带到前台 作为用户“点击”的结果,即对推送通知采取行动.

当应用根本不是 运行 时,您可以像您提到的那样使用 -application:didFinishLaunchingWithOptions:。 launchOptions 字典包含 payload 等——我不会描述这个,因为你已经知道它是如何工作的。

但是,当应用 运行 时,不会调用该方法。相反, - application:didReceiveRemoteNotification: 被调用。顺便说一句,如果应用程序已经在前台,或者如果它在后台并且用户“单击”推送通知 banner/alert 以打开应用程序,则会调用此方法。否则它不会被调用:所以我相信这正是你要找的东西。

此方法提供的 userInfo 字典将包含通知数据,类似于 -application:didFinishLaunchingWithOptions: 更多临时处理。 (注意:userInfolaunchOptions 在语义上是不同的,但希望这是显而易见的。:))