我通过使用推送通知上的内容可用标志来触发后台取回。我启用了取回和远程通知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视频《多任务处理有什么新发现》(2013年WWDC视频第204条)显示:

它说,当收到带有内容可用标志的推送通知时,应用程序将“启动到后台”。

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

所以真正的问题是:

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


当前回答

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

另一种测试方法是:

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

其他回答

你可以在“管理方案”中更改目标的启动设置为等待<app>。这允许你通过在application: didReceiveRemoteNotification: fetchCompletionHandler:中设置一个断点来调试,并发送推送通知来触发后台启动。

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

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

另一种测试方法是:

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

这可能对你有帮助

In most cases, the system does not relaunch apps after they are force quit by the user. One exception is location apps, which in iOS 8 and later are relaunched after being force quit by the user. In other cases, though, the user must launch the app explicitly or reboot the device before the app can be launched automatically into the background by the system. When password protection is enabled on the device, the system does not launch an app in the background before the user first unlocks the device.

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

这几天我一直在尝试不同的变体,我想有一天我让它在后台重新启动应用程序,甚至当用户滑动杀戮时,但我不能复制这种行为。

不幸的是,现在的行为与以前大不相同。在iOS 6上,如果你从晃动的图标中关闭应用程序,它仍然会在SLC触发器上被重新唤醒。现在,如果你通过滑动来杀人,就不会发生这种情况。

这是一种不同的行为,如果用户在iOS 6上杀死了应用,他们将继续从我们的应用中获得有用的信息,现在不会了。

如果用户已经通过滑动关闭了应用,并且仍然期待着我们曾经提供给他们的一些通知行为,我们需要敦促他们重新打开应用。我担心当用户将应用移走时,这一点并不明显。毕竟,他们可能正在清理或想要重新排列显示为最小化的应用程序。

答案是肯定的,但不应该使用“后台取回”或“远程通知”。PushKit是你想要的答案。

综上所述,ios 8的新框架PushKit是一种新的推送通知机制,即使你的应用在应用切换器中被杀死,它也可以在后台无声地启动你的应用,没有任何视觉提醒提示,令人惊讶的是你甚至无法从应用切换器中看到它。

苹果的PushKit参考:

PushKit框架为你的iOS应用程序提供类 接收来自远程服务器的推送。push有两种类型: 标准和VoIP。标准推送也可以传递通知 在之前的iOS版本中。VoIP推送提供额外的 VoIP应用程序所需的标准推送功能之上 控件之前执行按需处理推送 通知用户。

要部署这个新功能,请参考本教程:https://zeropush.com/guide/guide-to-pushkit-and-voip -我已经在我的设备上测试了它,它可以正常工作。