如果用户强行退出,iOS会在后台启动我的应用程序吗?


219

我通过content-available在推送通知中使用该标志来触发后台获取。我有fetchremote-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永远不会调用委托方法。

WWDC视频多任务处理的新功能(WWDC 2013的#204)显示了以下内容:在此处输入图片说明

它说收到带有content-available标志的推送通知时,应用程序“启动到后台” 。

为什么我的应用程序没有启动到后台?

因此,真正的问题是:

用户强制退出应用后,iOS会执行后台任务吗?


您如何检查应用程序是否在后台启动?
runmad 2013年

1
@runmad我登录了一堆废话- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
圣诞老人

您如何记录它,仅是NSLog?您必须在您的应用方案设置中将“启动”设置为手动(请参见答案)
13年

@runmad看到对答案的评论
圣诞老人

@HaimBenchimol Djd您收到对错误报告的答复吗?我还没有提交自己的错误报告。
圣诞老人,

Answers:


215

UPDATE2:

可以使用iOS 8中引入的新PushKit框架实现此目的。尽管PushKit用于VoIP。因此,您的用法应与VoIP相关,否则存在被应用拒绝的风险。(请参阅此答案)。


UDPDATE1:

该文档已针对iOS8进行了澄清。该文档可在此处阅读。以下是相关摘录:

使用此方法可以为您的应用处理传入的远程通知。与application:didReceiveRemoteNotification:仅在应用程序在前台运行时才调用的方法不同,系统在应用程序在前台或后台运行时才调用此方法。此外,如果启用了远程通知后台模式,则系统将启动您的应用程序(或将其从挂起状态唤醒),并在推送通知到达时将其置于后台状态。但是,如果用户强制退出应用程序,系统不会自动启动您的应用程序。在这种情况下,用户必须重新启动您的应用程序或重新启动设备,然后系统才会尝试再次自动启动您的应用程序。


尽管WWDC视频并未明确指出,但在开发者论坛上进行的快速搜索显示了这一点:

https://devforums.apple.com/message/873265#873265(需要登录)

另外请记住,如果您从应用程序切换器中杀死应用程序(即向上滑动以杀死该应用程序),则无论推送通知或后台获取如何,操作系统都将永远不会重新启动该应用程序。在这种情况下,用户必须手动重新启动应用一次,然后从那时开始将调用后台活动。- pmarcos

该帖子是由一名Apple员工撰写的,所以我认为我可以相信此信息是正确的。

因此,看起来当应用程序从应用程序切换器中被杀死(通过向上滑动)时,该应用程序将永远不会启动,即使是预定的后台抓取也是如此。


2
对我来说,当启动选项不是nil时,在“ didFinishLaunchingWithOptions”中添加操作就可以了。我在这里使用的方法与“ didreceiveRemoteNotification”中的方法相同
harsh.prasad

@ harsh.prasad很有意思。问题是当应用切换器中的应用被杀死时,该应用无法启动。
圣诞老人,

3
如果收到无提示推送,则无需在应用切换器中显示该应用。它可以在后台启动,而无需将其添加到应用程序切换器中,并且可以运行并“执行其操作”,然后退出。处于活动状态太长时间的应用程序将按照已经存在的方式被杀死。
MindJuice 2014年

1
@chrizstone解决方案是这是预期的行为,您对此无能为力。
圣诞老人

1
@JPK嗯,推送通知本身不受影响。它只是在执行后台任务,在被强制退出后将无法正常工作。
圣诞老人

70

您可以在“管理方案”中将目标的启动设置更改为Wait for <app>.app to be launched manually,这可以通过在其中设置断点application: didReceiveRemoteNotification: fetchCompletionHandler:并发送推送通知以触发后台启动来进行调试。

我不确定它是否可以解决问题,但目前可能会帮助您进行调试。

屏幕截图


因此这有所帮助,但问题仍然存在
圣诞老人

奇怪。我认为您已经仔细检查了所有Flash是否已在您的plist中设置,等等?
2013年

另外,我知道我已将所有设置正确,因为当应用程序在后台运行时,一切运行正常。只是在应用程序完全不运行时,它根本没有运行。
2013年

我想知道推送通知启动触发器是否由系统确定。例如,如果iOS认为现在不是启动应用程序的好时机,则可以将其推迟到以后。也许尝试关闭所有正在运行/后台的应用程序,看看会发生什么?我只是在这一点上猜测:-/
runmad

刚刚尝试过。像往常一样没有任何反应。我可能会在开发论坛上问。
2013年

37

答案是肯定的,但不应使用“背景提取”或“远程通知”。PushKit是您想要的答案。

总而言之,iOS 8中的新框架PushKit是新的推送通知机制,即使您的应用因从应用切换器中滑出而被杀死,它也可以在没有视觉警报提示的情况下将应用静默地启动到后台。从应用切换器。

Apple的PushKit参考:

PushKit框架为您的iOS应用提供了类,以接收来自远程服务器的推送。推送可以是以下两种类型之一:标准和VoIP。标准推送可以像在以前的iOS版本中一样传递通知。VoIP推送提供了VoIP应用程序所需的标准推送之上的其他功能,以在向用户显示通知之前对推送进行按需处理。

要部署此新功能,请参阅以下教程:https : //zeropush.com/guide/guide-guide-to-pushkit-and-voip-我已经在设备上对其进行了测试,并且可以正常工作。


9
在我看来,您必须将应用设置为使用VoIP。如果您的应用程序实际上不是VoIP应用程序,那么它不会在审核过程中被拒绝吗?
duncanc4 2015年

6
不幸的是,知道了Apple的验证过程后,该应用程序被拒绝是合乎逻辑的。
基帕·桑托斯

3
用于VoIP。如果用户不使用VoIP,则将大大增加拒绝审核的风险。
克里斯

看起来大型供应商正在以此为借口在后台运行内容,而Apple则对此视而不见。成为Android的一项功能。
TCB13'4

PushKit保留用于VoIP,文件提供程序和监视并发症。它不适用于此答案描述的用例。


4

几天来,我一直在尝试各种不同的变体,而且有一天,我想让它在后台重新启动应用程序,即使用户轻描淡写也是如此,但我无法复制这种行为。

不幸的是,这种行为与以前大不相同。在iOS 6上,如果您通过摇晃的图标杀死了该应用程序,则它仍会在SLC触发器上被重新唤醒。现在,如果您通过刷卡杀死,那不会发生。

这是一种不同的行为,如果用户在iOS 6上将其杀死,则可以继续从我们的应用程序中获取有用信息的用户现在不会。

如果用户轻扫了应用程序并杀死了它们,并且仍然期望我们以前给予他们的某些通知行为,那么我们需要立即推动用户重新打开该应用程序。我担心当用户将某个应用程序滑走时,这对于用户来说不会很明显。毕竟,他们可能基本上正在清理或希望重新排列显示为最小的应用程序。


2
那就是我们所做的(applicationWillTerminate),但是我不认为它在内存清除期间发出了通知,至少在iOS 7上没有。我确实注意到它在重启OS升级之前就显示了该通知,但是很少见,看起来似乎还不错。
snarshad 2014年

“在iOS 6上,如果您通过摇晃的图标杀死了该应用程序,则它仍会在SLC触发器上被重新唤醒。现在,如果通过滑动操作杀死该应用程序,则不会发生。” 现在确实发生了,这是iOS 7早期版本中的临时回归
。– funkybro

3

这可能对您有帮助

在大多数情况下,系统在用户强行退出应用后不会重新启动应用。位置应用程序是一个例外,位置应用程序在iOS 8及更高版本中被用户强行退出后重新启动。但是,在其他情况下,用户必须明确启动应用程序或重新启动设备,然后系统才能将应用程序自动启动到后台。在设备上启用密码保护后,系统不会在用户首次解锁设备之前在后台启动应用程序。

资料来源:https : //developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.