小编典典

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

all

我正在通过使用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永远不会调用委托方法。

WWDC 视频 Whats New With Multitasking (来自 WWDC 2013
的#204)显示了这一点:在此处输入图像描述

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

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

所以真正的问题是:

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


阅读 97

收藏
2022-06-10

共1个答案

小编典典

更新2:

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

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

总而言之,iOS 8 中的新框架 PushKit 是一种新的推送通知机制,即使您的应用被从应用切换器中滑出,它也可以静默地将您的应用启动到后台而没有视觉警报提示,令人惊讶的是您甚至看不到它从应用切换器。

来自 Apple 的 PushKit 参考:

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

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


UDPDATE1:

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

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


尽管 WWDC 视频没有明确说明这一点,但在开发者论坛上的快速搜索发现了这一点:

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

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

那个帖子是由苹果员工写的,所以我认为我可以相信这些信息是正确的。

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

2022-06-10