应用程序:didReceiveRemoteNotification:fetchCompletionHandler不调用

它出现了函数application:didReceiveRemoteNotification:fetchCompletionHandler在应用程序强制退出时不被调用。 我的印象是,无论应用程序处于什么状态,函数都会被调用,但只有当应用程序已经在后台运行时才会调用该函数。 如果还没有使用新的iOS 7远程通知背景模式运行,有没有办法在后台唤醒应用程序?

application:didReceiveRemoteNotification:fetchCompletionHandler:即使应用程序被挂起,根本不运行,后台或活动,也会被调用。 另外值得注意的是该方法仅适用于iOS 7。 这是苹果文档 。

但是,如果应用程序被强行closures(即通过与应用程序切换杀),应用程序将不会启动。 (见答案 ) 编辑:我再次检查了这一点在iOS 7.1上,看看他们是否解决这个问题,但仍然是这样的情况下,如果应用程序手动杀死,应用程序将不会被唤醒和application:didReceiveRemoteNotification:fetchCompletionHandler:不会叫做

当接收到推送时,应用程序仅在需要调用application:didReceiveRemoteNotification:fetchCompletionHandler:程序时被唤醒application:didReceiveRemoteNotification:fetchCompletionHandler:方法(即,您必须在推送通知有效载荷中设置“content-available”标志。 如果用户通过点击通知打开应用程序,该方法将被再次调用。

编辑:没有在iOS 8上检查过。有其他人吗?

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //Remote Notification Info NSDictionary * remoteNotifiInfo = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]; //Accept push notification when app is not open if (remoteNotifiInfo) { [self application:application didReceiveRemoteNotification: remoteNotifiInfo]; } return YES; } 

应用程序应该启动,即使它没有运行。 苹果文档说:

当此值出现并且推送通知到达设备时,系统将通知发送到您的应用程序( 如果需要 ,请启动它 ),并在给用户显示任何内容之前给它一些时间来处理通知。 (iOS应用程序编程指南)

当推送通知到达时,系统会向用户显示通知,并在后台启动应用程序(如果需要),以便可以调用此方法。 (UIApplicationDelegate协议参考)

与application:didReceiveRemoteNotification:方法不同,该方法仅在应用程序运行时调用,系统将调用此方法,而不pipe应用程序的状态如何。 如果您的应用程序被暂停或未运行 ,则在调用该方法之前,系统会唤醒或启动您的应用程序并将其置于后台运行状态。 (UIApplicationDelegate协议参考)

但是,当使用“content-available”进行testing时:1推送应用程序在未运行时从未启动。 当应用程序被暂停它的作品。

你有没有发现自己的解决scheme?

当你的应用程序已经强制退出该方法没有被调用。 相反,像(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions被调用。

如果通过点击通知popup窗口中的“打开”来打开该应用程序,则通知位于launchOptions

获取这样的推送通知字典:

 NSDictionary * pushNotificationUserInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if (pushNotificationUserInfo) { // call your handler here } 

如果您强制退出应用程序切换器的应用程序,它将不会在后台(通过任何方式)被唤醒,直到下一次启动。 当您强制退出应用程序时,即使后台事件通常已经唤醒,您也正在有效地向操作系统表示您不希望此应用程序运行。

这在testing中值得注意,因为您可能会强制退出应用程序,以便在应用程序未运行时检查是否通过推送通知启动。 事实上,你使用武力退出将是它不能发射的原因。

正如苹果所记载的那样,新的多任务处理API(提取和远程通知)只有在应用程序处于挂起/后台/前台状态时才能工作。

  • 后台/前台状态,然后application:didReceiveRemoteNotification:fetchCompletionHandler将被触发。

  • Suspended状态下,则-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions将启动-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

  • 非运行状态(你的情况), application:didReceiveRemoteNotification:fetchCompletionHandler永远不会被触发。

有关应用程序状态的更多信息,请参阅Apple文档 。

在Swift 2.0中,我已经解决了我的问题,就像这个背景

 if let remoteNotification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? NSDictionary { pushNotificationAction(remoteNotification as [NSObject : AnyObject]) }