我正在通过使用content-available推送通知上的标志来触发后台获取。我启用了fetch和。remote-notification UIBackgroundModes
content-available
fetch
remote-notification
UIBackgroundModes
这是我在 AppDelegate.m 中使用的实现:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { NSLog(@"Remote Notification Recieved"); UILocalNotification *notification = [[UILocalNotification alloc] init]; notification.alertBody = @"Looks like i got a notification - fetch thingy"; [application presentLocalNotificationNow:notification]; completionHandler(UIBackgroundFetchResultNewData); }
当应用程序在后台运行时,它可以正常工作。 (收到通知并且应用程序触发了“看起来我收到通知”本地通知,正如上面的代码应该做的那样)。
但是, 当应用程序没有运行 并且收到带有content-available标志的推送通知时, 应用程序不会启动 并且didRecieveRemoteNotification永远不会调用委托方法。
didRecieveRemoteNotification
WWDC 视频 Whats New With Multitasking (来自 WWDC 2013 的#204)显示了这一点:
它说当收到带有content-available标志的推送通知时,应用程序“启动到后台”。
为什么我的应用程序没有在后台启动?
所以真正的问题是:
用户强制退出应用后,iOS 会执行后台任务吗?
更新2:
您 可以 使用 iOS 8 中引入的新 PushKit 框架来实现这一点。虽然 PushKit 用于 VoIP。因此,您的使用应该与 VoIP 相关,否则存在应用被拒绝的风险。(见这个答案)。
答案是肯定的,但不应使用“后台获取”或“远程通知”。PushKit 是您想要的答案。
总而言之,iOS 8 中的新框架 PushKit 是一种新的推送通知机制,即使您的应用被从应用切换器中滑出,它也可以静默地将您的应用启动到后台而没有视觉警报提示,令人惊讶的是您甚至看不到它从应用切换器。
来自 Apple 的 PushKit 参考:
PushKit 框架为您的 iOS 应用程序提供类以接收来自远程服务器的推送。推送可以是以下两种类型之一:标准和 VoIP。标准推送可以像在以前的 iOS 版本中一样传递通知。VoIP 推送在标准推送之上提供附加功能,VoIP 应用程序在向用户显示通知之前执行推送的按需处理。
要部署此新功能,请参阅本教程:https ://zeropush.com/guide/guide-to-pushkit-and-voip - 我已经在我的设备上对其进行了测试,它可以按预期工作。
UDPDATE1:
该文档已针对 iOS8 进行了澄清。可以在此处阅读文档。这是一个相关的摘录:
使用此方法为您的应用处理传入的远程通知。与application:didReceiveRemoteNotification:仅在您的应用程序在前台运行时调用的方法不同,系统在您的应用程序在前台或后台运行时调用此方法。此外,如果您启用了远程通知后台模式,系统会启动您的应用程序(或将其从挂起状态唤醒)并在推送通知到达时将其置于后台状态。 但是,如果用户强制退出,系统不会自动启动您的应用程序。 在这种情况下,用户必须重新启动您的应用程序或重新启动设备,然后系统才会再次尝试自动启动您的应用程序。
application:didReceiveRemoteNotification:
尽管 WWDC 视频没有明确说明这一点,但在开发者论坛上的快速搜索发现了这一点:
https://devforums.apple.com/message/873265#873265(需要登录)
另外请记住,如果您从应用切换器中终止您的应用(即向上滑动以终止该应用),那么无论推送通知或后台获取如何,操作系统都不会重新启动该应用。在这种情况下,用户必须手动重新启动应用程序一次,然后从那时起将调用后台活动。- pmarcos
那个帖子是由苹果员工写的,所以我认为我可以相信这些信息是正确的。
所以看起来当应用程序从应用程序切换器中被终止(通过向上滑动)时,应用程序将永远不会启动,即使对于预定的后台提取也是如此。