如果用户强制退出,iOS会将我的应用程序启动到后台吗?
我通过使用推送通知上的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
委托方法。
WWDCvideoWhats New With Multitasking (来自WWDC 2013的#204)显示了这一点:
它说,当有content-available
标志接收到推送通知时,应用程序“启动到后台”。
为什么我的应用程序不能启动到后台?
所以真正的问题是:
在用户强制退出应用后,iOS会执行后台任务吗?
更新:这听起来像你可以实现这个使用iOS 8中引入的新的PushKit框架。(请参阅此答案 )。
虽然WWDC的video没有说明这一点,但是在开发者论坛上快速search一下:
https://devforums.apple.com/message/873265#873265 (需要login)
另外请记住,如果您从应用程序切换器中删除应用程序(即向上滑动杀死应用程序),则操作系统不会重新启动应用程序,无论是推送通知还是后台提取。 在这种情况下,用户必须手动重新启动应用程序一次,然后从这一点开始,后台活动将被调用。 – pmarcos
那篇文章是苹果公司的员工,所以我想我可以相信这个信息是正确的。
所以看起来应用程序从应用程序切换器(通过向上滑动)被杀害时,应用程序将永远不会启动,即使是预定的后台提取。
iOS 8更新:文档已经澄清iOS 8的。文档可以在这里阅读。 这是一个相关的摘录:
使用此方法处理传入的应用程序的远程通知。 与
application:didReceiveRemoteNotification:
不同的是application:didReceiveRemoteNotification:
只在应用程序在前台运行时调用,方法是当您的应用程序在前台或后台运行时调用此方法。 另外,如果启用了远程通知后台模式,系统将启动您的应用程序(或将其从暂停状态唤醒),并在推送通知到达时将其置于后台状态。 但是,如果用户强制退出,系统不会自动启动您的应用程序。 在这种情况下,用户必须重新启动应用程序或在系统尝试再次自动启动应用程序之前重新启动设备。
您可以在“pipe理scheme”中将您的目标的启动设置更改为Wait for <app>.app to be launched manually
,这允许您通过在application: didReceiveRemoteNotification: fetchCompletionHandler:
设置断点进行debuggingapplication: didReceiveRemoteNotification: fetchCompletionHandler:
并发送推送通知以触发后台启动。
我不确定它会解决这个问题,但它可以帮助您现在进行debugging。
答案是YES,但不应该使用“后台提取”或“远程通知”。 PushKit是你想要的答案。
总而言之,ios 8中的新框架PushKit是新的推送通知机制,即使您的应用程序被从应用程序切换器中删除而死亡,您也可以悄悄地将您的应用程序启动到后台,而不会出现任何视觉警报提示,令人惊讶的是甚至看不到它从应用程序切换器。
苹果的PushKit参考:
PushKit框架为iOS应用程序提供了接收远程服务器推送的类。 推送可以是两种types之一:标准和VoIP。 标准推送可以像以前版本的iOS一样提供通知。 VoIP推送在标准推送之上提供额外的function,VoIP应用程序在向用户显示通知之前执行推送的按需处理。
要部署这个新function,请参阅本教程: https : //zeropush.com/guide/guide-to-pushkit-and-voip – 我已经在我的设备上testing过了,它按预期工作。
实际上,如果你需要testing背景获取,你需要在scheme中启用一个选项:
另一种方式你可以testing它:
这是关于这个新function的完整信息: http : //www.objc.io/issue-5/multitasking.html
我已经尝试了几天的不同变种,我曾经想过有一天我会在后台重新启动应用程序,即使用户刷卡杀死,但是我不能复制这种行为。
不幸的是,这种行为比以前大不相同。 在iOS 6上,如果您将应用程序从抖动图标中删除,则仍然会在SLC触发器上重新唤醒。 现在,如果你用刷子杀死,那不会发生。
这是一种不同的行为,如果用户在iOS 6上杀了它,他们会继续从我们的应用程序获得有用的信息,现在不会。
我们需要推动我们的用户现在重新打开应用程序,如果他们已经刷新杀死它,并仍然期待我们曾经给他们的一些通知行为。 我担心,当用户刷一个应用程序时,这对用户来说并不明显。 毕竟,他们可能基本上正在清理或想要重新排列显示最小化的应用程序。
我不知道这是推送通知或不,因为我不尝试这个,但你可以试试这个,这是从苹果开发者的网站,也是WhatsApp使用这个。
这是推送通知的VoIP技术。
请在这里检查。 这个苹果开发者网站。
请检查find的最好的例子。 这里