繁体   English   中英

application:didReceiveRemoteNotification:fetchCompletionHandler Not Called

[英]application:didReceiveRemoteNotification:fetchCompletionHandler Not Called

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

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

但是,如果应用程序被强行关闭(即通过使用应用程序切换器进行查杀),该应用程序将无法启动。 (参见答案编辑:我在iOS 7.1上再次检查了这一点,看看他们是否修复了这个问题,但仍然存在这样的情况:如果手动杀死应用程序,应用程序将不会被唤醒并且application:didReceiveRemoteNotification:fetchCompletionHandler:不会叫做

当接收推送时,应用程序仅在“需要时”唤醒以调用application:didReceiveRemoteNotification:fetchCompletionHandler: method(即您必须在推送通知有效负载内设置“content-available”标志。参见SO回答 )。 如果用户然后通过点击通知打开应用程序,则将再次调用该方法。

编辑:没有在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;
}

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

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

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

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

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

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

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

如果通过在通知弹出窗口中点击“打开”来打开应用程序,则通知在launchOptions

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

NSDictionary * pushNotificationUserInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

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

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

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

  • Suspended状态下,然后-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions将触发-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

  • Not Running状态(您的情况), application:didReceiveRemoteNotification:fetchCompletionHandler永远不会被触发。

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

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

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

对于Swift 2.0中我关注的问题,我已经解决了我的问题

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

    pushNotificationAction(remoteNotification as [NSObject : AnyObject])
}

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

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

应用程序(_:didReceiveRemoteNotification:fetchCompletionHandler :)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM