我通过在推送通知上使用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
标记的推送通知,该应用未启动和{{1永远不会调用委托方法。
WWDC视频多任务的新功能(来自WWDC 2013的#204)显示:
它表示当收到带有didRecieveRemoteNotification
标志的推送通知时,应用程序将“启动到后台”。
为什么我的应用无法启动到后台?
所以真正的问题是:
用户强制退出应用后,iOS会执行后台任务吗?
答案 0 :(得分:211)
UPDATE2:
你可以使用iOS 8中引入的新PushKit框架来实现这一目标。虽然PushKit用于VoIP。因此,您的使用应该与VoIP相关,否则存在拒绝应用的风险。 (见this answer)。
<强> UDPDATE1: 强>
iOS8 的文档已经澄清。可以阅读文档here。以下是相关摘录:
使用此方法处理应用的传入远程通知。 与
application:didReceiveRemoteNotification:
方法不同 只有当您的应用程序在前台即系统中运行时才会调用 当您的应用在前台运行或运行时调用此方法 背景。此外,如果您启用了远程通知 在后台模式下,系统启动你的应用程序(或从中唤醒它) 暂停状态)并在推送时将其置于后台状态 通知到了。 但是,系统不会自动进行 如果用户强行退出,请启动您的应用。在那种情况下, 用户必须重新启动应用程序或在系统之前重新启动设备 尝试再次自动启动您的应用。
虽然WWDC视频没有明确说明这一点,但在开发者论坛上进行快速搜索可以解决这个问题:
https://devforums.apple.com/message/873265#873265(需要登录)
另请注意,如果您从应用切换器中删除了应用 (即向上滑动以杀死应用程序)然后操作系统将永远不会重新启动 应用程序,无论推送通知或后台获取。在这种情况下 用户必须手动重新启动应用程序一次,然后再从中重新启动 指向后台活动将被调用。 - pmarcos
这篇文章是由Apple员工发布的,所以我认为我可以相信这些信息是正确的。
所以看起来当应用程序从应用程序切换器中被杀死时(通过向上滑动),即使对于预定的后台提取,该应用程序也永远不会启动。
答案 1 :(得分:68)
您可以将“管理方案”中的目标启动设置更改为Wait for <app>.app to be launched manually
,这样您就可以通过在application: didReceiveRemoteNotification: fetchCompletionHandler:
中设置断点并发送推送通知来触发后台启动来进行调试。
我不确定它是否会解决问题,但它现在可以帮助您进行调试。
答案 2 :(得分:36)
答案是肯定的,但不应该使用&#39;背景提取&#39;或者&#39;远程通知&#39;。 PushKit是您想要的答案。
总之,ios 8中的新框架PushKit是一种新的推送通知机制,它可以默默地将您的应用程序启动到后台,即使您的应用程序因从应用程序切换器中滑出而被杀死,也没有视觉警报提示,令人惊讶的是您甚至无法从应用切换器中看到它。
来自Apple的PushKit参考:
PushKit框架为您的iOS应用程序提供了类 接收来自远程服务器的推送。推送可以是以下两种类型之一: 标准和VoIP。标准推送可以像下一样发送通知 在以前版本的iOS中。 VoIP推送提供额外的功能 VoIP应用程序所需的标准推送之上的功能 在显示之前执行按下的按需处理 通知用户。
要部署此新功能,请参阅本教程:https://zeropush.com/guide/guide-to-pushkit-and-voip - 我已在设备上对其进行了测试,并且按预期工作。
答案 3 :(得分:14)
实际上,如果您需要测试后台提取,则需要在方案中启用一个选项:
另一种测试方法:
以下是有关此新功能的完整信息: http://www.objc.io/issue-5/multitasking.html
答案 4 :(得分:3)
我已经尝试了几天不同的变种,我想有一天我让它在后台重新启动应用程序,即使用户刷卡杀死,但不,我不能复制这种行为
不幸的是,这种行为与以前完全不同。在iOS 6上,如果你从摇晃的图标中杀死了应用程序,它仍会在SLC触发器上重新唤醒。现在,如果你通过刷卡杀死,那就不会发生。
这是一种不同的行为,如果用户在iOS 6上杀死它们,他们将继续从我们的应用程序获取有用信息,现在不会。
我们需要轻推我们的用户现在重新打开应用程序,如果他们已经刷过它来杀死它并仍然期待我们曾经给他们的一些通知行为。我担心当用户刷掉应用程序时,这对用户来说并不明显。毕竟,它们可能基本上是清理或者想要重新排列最小化的应用程序。
答案 5 :(得分:2)
这可能对您有所帮助
在大多数情况下,系统在强制使用后不会重新启动应用 退出用户。一个例外是位置应用程序,在iOS 8和iOS中 之后被用户强制退出后重新启动。其他 但是,用户必须明确启动应用程序或重新启动应用程序 应用程序之前的设备可以自动启动进入 系统的背景。当启用密码保护时 设备,系统不会在后台启动应用程序之前 用户首先解锁设备。
答案 6 :(得分:2)
For **iOS13**
For background PUSHES in iOS13 you must set below parameters
apns-priority = 5
apns-push-type = background
Required for WatchOS
Highly recommended for Other platforms