即使“plist”中的“UIBackgroundModes”中存在“voip”,iOS设备在iOS10中重启设备后也不会自动启动

我需要我的VoIP应用程序重新启动设备后自动启动。

苹果公司明确提到:

(=========编辑:这是从官方的苹果文档,请先看看这个评论或回答,应用程序无法启动没有用户交互或无声的推送通知,也看看下面的Github项目,人们已经validation了这种行为)

UIBackgroundModes数组的值

价值:voip说明:该应用程序提供IP语音服务。 这个密钥的应用程序会在系统启动后自动启动,以便应用程序可以重新build立VoIP服务。 此键的应用程序也可以播放背景audio。

https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW1

以下是Apple Docs的屏幕截图。

我已经确保:

  1. 应用程序在设备关机时运行。
  2. VoIP存在于plistCapabilities部分。
  3. 通过在main方法和application:didFinishLaunchingWithOptions:方法中将文件添加到文件,确保应用程序在设备重新启动后肯定不会启动。
  4. 设备重新启动后,设备的屏幕至less解锁一次。

在这里输入图像说明

在这里输入图像说明

我什至尝试执行这个GitHub示例应用程序与36星,以testing启动启动。 https://github.com/lithium3141/BootLaunch
但即使这个应用程序不重新启动时重新启动,当我尝试在设备上。

因此,这导致我想如果iOS10最近有什么变化,或者我还在这里丢失东西?

好的,我进一步调查了一下,但是首先我要指出的是,我没有通过真正为此构build项目来validation这一点,因为现在对我来说太耗费时间了。

我发现这个 (在评论中已经提到), 这个 ,最重要的是这个技术问答 。

我特别从苹果技术人员在这些主题中的各种评论中收集到的信息,看起来iOS 10的行为确实发生了变化。 这意味着,如果您将构build与最新SDK(即iOS 10库)关联起来,那么在以前版本的iOS中连接到VoiP服务器的相同代码将不再执行此操作。

现在,就你而言,你并不需要真正的VoiP连接,对吧? 你只是对“重启后启动”function感兴趣,对吗? 至less你链接的演示项目并没有实际的setKeepAliveTimeout:handler:连接,例如setKeepAliveTimeout:handler:方法甚至没有实现。 我知道这个特定的问题没有在链接的讨论中讨论,或者在Q&A中提到,但是:

这是有道理的,再加上整个传统VoiP的行为,重启function也消失了。 如果您切换到Push-Kit VoiP,您的应用程序在重新启动后不需要启动,一旦下一个远程通知到达(VoiP通知具有高优先级,所以应该没有延迟)就会重新启动。

很明显,我在这里推断了整个事情背后的原因,并不能保证苹果真正的想到这一点,但这是有道理的:一个(传统的)VoiP应用程序在重启后重新启动的全部原因是它需要build立连接 ,即需要运行一些代码。 随着推送通知不再是必要的(操作系统基本上是为了让你在后台获得这些通知),所以它是有道理的,他们删除了这个function以及整个传统的VoiP方法。

您可以通过编译针对较旧的SDK(即使用Xcode 7作为Q&Abuild议)来testing,然后看它是否重新启动。 那一位苹果员工实际上解释说,操作系统确实区分了构build应用程序的SDK,这对我来说完全是反直觉的。 显然在这种情况下,它会决定“嘿,这是一个更老的应用程序,所以它期望重新启动,因为它的SDK被logging在这种方式”的应用程序构buildXcode 7和“哦,这个程序是一个新的,所以我不否则就不要坚持旧的方式。 Wowsies。


TL; DR :对我来说,看起来好像是的,iOS SDK改变了这种行为,同时放弃了旧的,通知不多的VoiP方法。 针对新的SDK进行编译将导致应用程序在重新启动后不能重新启动。

logging :我能理解那些线程中的愤怒的人。 虽然这种变化可能有技术上的原因,但这一具体后果远不是那么明显。 如果一个方法被弃用,但是该项目仍然编译和运行,我不会期望这样的过程以这种方式失败。 这些应用程序不会崩溃,他们只是“不同的操作系统”,这不完全相同。 至less我会期望在新的SDK中,文档更清晰。

当应用程序处于终止模式时,仅在推送工具包安静通知时才会在后台调用,并且必须为推送工具包生成证书,而不是使用正常的APNS通知和正常的推送通知证书。

从后端,你的有效载荷必须是这样的。

 $body['aps'] = array( 'content-available'=> 1, 'alert' => $message, 'sound' => 'default', 'badge' => 0, ); 

一旦你得到pushkit有效载荷,然后用声音文件安排本地通知,你的应用程序将在后台被调用,直到你的声音文件播放(最多30秒),然后你必须完成你的后台任务。

请一步一步参考一下推箱子集成的一些重要细节

https://github.com/hasyapanchasara/PushKit_SilentPushNotification

应用程序的生命周期 – 当应用程序被终止,并推送套件有效负载

  • 首先

    didFinishLaunchingWithOptions //将会调用

  • 然后

    didReceiveIncomingPushWithPayload //负载方法获取调用

  • 那么如果你有本地通知

    didReceiveLocalNotification //接收本地通知

  • 然后

    handleActionWithIdentifier //处理方法,如果你有行动button(本地)

  • 那么如果你有远程通知

    didReceiveRemoteNotification //接收远程通知

  • 然后

    handleActionWithIdentifier //处理方法,如果你有动作button(远程)

注意 –不用点击应用程序图标或接收推送工具的有效载荷,您的应用程序将永远不会自动撤销/打开/ repoen。 如果你想要你的应用程序是基于VOIP的,应用程序在设备重新启动后会被撤销。 不可能。