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

San*_*aus 217 push-notification apple-push-notifications ios ios7

我通过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);

}
Run Code Online (Sandbox Code Playgroud)

当应用程序在后台运行时,它可以正常工作.(收到通知,应用程序触发"看起来像我收到通知"本地通知,因为上面的代码应该这样做).

但是,当应用程序未运行并且收到带有content-available标志的推送通知时,应用程序不会启动,并且didRecieveRemoteNotification永远不会调用委托方法.

WWDC视频最新的多任务处理(来自WWDC 2013的#204)显示了这一点:在此输入图像描述

它表示当收到带有content-available标志的推送通知时,应用程序将"启动到后台" .

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

所以真正的问题是:

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

San*_*aus 213

UPDATE2:

可以使用iOS 8中引入的新PushKit框架实现这一点.虽然PushKit用于VoIP.因此,您的使用应该与VoIP相关,否则存在拒绝应用的风险.(见这个答案).


UDPDATE1:

iOS8的文档已经澄清.文档可以在这里阅读.以下是相关摘录:

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


虽然WWDC视频没有明确说明这一点,但在开发者论坛上进行快速搜索可以解决这个问题:

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

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

该帖子是由Apple员工发布的,所以我认为我可以相信这些信息是正确的.

所以看起来当应用程序从应用程序切换器中被杀死时(通过向上滑动),即使对于预定的后台提取,应用程序也永远不会启动.

  • 如果收到静音推送,则无需在应用切换器中显示该应用.它可以在后台启动而无需将其添加到应用程序切换器,并允许运行并"执行其操作"然后退出.保持活动时间过长的应用程序将以与已有的相同方式被杀死. (3认同)
  • 对我来说,当启动选项不是 nil 时,在“didFinishLaunchingWithOptions”中添加操作完成了工作。我在这里有与“didreceiveRemoteNotification”相同的方法 (2认同)

run*_*mad 70

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

我不确定它会解决这个问题,但它可能会帮助你进行调试.

截图


小智 37

答案是肯定的,但不应使用"后台获取"或"远程通知".PushKit是您想要的答案.

总之,ios 8中的新框架PushKit是一种新的推送通知机制,它可以默默地将您的应用程序启动到后台,即使您的应用程序被从应用程序切换器中轻扫,也没有可视警报提示,令人惊讶的是您甚至无法看到它来自app切换器.

来自Apple的PushKit参考:

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

要部署此新功能,请参阅本教程:https://zeropush.com/guide/guide-to-pushkit-and-voip - 我已在设备上对其进行了测试,并且按预期工作.

  • 在我看来,你必须将你的应用设置为使用VoIP.如果你的应用程序实际上不是一个VoIP应用程序,它会不会在审查期间被拒绝? (9认同)
  • 不幸的是,了解Apple的验证过程,应用程序被拒绝是合乎逻辑的. (6认同)
  • 用于VoIP.如果不为用户使用VoIP,这将大大增加拒绝审核的风险. (3认同)

Dan*_*nil 15

实际上,如果您需要测试后台提取,则需要在scheme中启用一个选项:

启用bg fetch

另一种测试方法: 模拟bg fetch

以下是有关此新功能的完整信息:http: //www.objc.io/issue-5/multitasking.html