application:didReceiveRemoteNotification:fetchCompletionHandler Not Called

时间:2013-09-17 17:29:08

标签: ios objective-c ios7 apple-push-notifications

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

8 个答案:

答案 0 :(得分:51)

即使应用程序暂停,根本没有运行,后台运行或处于活动状态,

application:didReceiveRemoteNotification:fetchCompletionHandler:也会被调用。另外值得注意的是,该方法仅适用于iOS 7。这是apple documentation

但是,如果应用程序被强行关闭(即通过使用应用程序切换器进行查杀),该应用程序将启动。(请参阅SO answer编辑:我在iOS 7.1上再次检查了这一点,看看他们是否解决了这个问题,但仍然存在这样的情况:如果手动杀死该应用,应用将不会被唤醒,application:didReceiveRemoteNotification:fetchCompletionHandler:将会不被称为

当接收推送时,只有“如果需要”唤醒应用才能调用application:didReceiveRemoteNotification:fetchCompletionHandler:方法(即您必须在推送通知有效负载内设置“content-available”标志。请参阅{{ 3}})。如果用户然后通过点击通知打开应用程序,则该方法将再次被称为

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

答案 1 :(得分:23)

- (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;
}

答案 2 :(得分:3)

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

  

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

     

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

     

与应用程序不同:didReceiveRemoteNotification:方法,仅在调用时调用   您的应用正在运行,无论您的应用状态如何,系统都会调用此方法。如果   您的应用暂停或未运行,系统唤醒或启动您的应用并置入   它在调用方法之前进入后台运行状态。   (UIApplicationDelegate协议参考)

然而,当使用“content-available”进行测试时:1推送应用程序在未运行时永远不会启动。当应用程序暂停时,它可以正常工作。

你发现自己是一个解决方案吗?

答案 3 :(得分:3)

当您的应用被强制退出时,不会调用该方法。相反,像往常一样,调用(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

如果通过点击打开应用程序"打开"在通知弹出窗口中,通知在launchOptions内。

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

NSDictionary * pushNotificationUserInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

if (pushNotificationUserInfo)
{
  // call your handler here
}

答案 4 :(得分:1)

正如Apple所记录的那样,新的多任务API(提取和远程通知)仅在应用处于暂停/后台/前景状态时才有效。

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

  • 已暂停状态下,-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions将被触发。

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

有关应用状态的更多信息,请参阅Apple documentation

答案 5 :(得分:1)

如果您强制退出应用程序切换器中的某个应用程序,则不会在后台(通过任何方式)唤醒该应用程序,直到下次启动它为止。当您强制退出应用程序时,您实际上是在向操作系统说明您不希望此应用程序运行,即使后台事件通常会将其唤醒。

这在测试期间值得关注,因为您可能已强制退出应用程序,以便在应用程序未运行时检查是否通过推送通知启动了该应用程序。事实上,您使用强制退出将是为什么无法启动的原因。

答案 6 :(得分:1)

对于Swift 2.0中的关注我已经解决了我的问题,就像这是背景

if let remoteNotification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? NSDictionary {

    pushNotificationAction(remoteNotification as [NSObject : AnyObject])
}

答案 7 :(得分:0)

我最近遇到了同样的问题,我发现Apple更新了他们的文档并说:

  

但是,如果用户强行退出,系统不会自动启动您的应用。在这种情况下,用户必须重新启动您的应用程序或重新启动设备,然后系统才会再次尝试自动启动您的应用。

application(_:didReceiveRemoteNotification:fetchCompletionHandler:)

所以我猜当应用程序被强制退出杀死时,没有办法做任何事情?