即使使用" voip"出现在" UIBackgroundModes"在" plist"中,在iOS10中重启设备后iOS App不会自动启动

时间:2017-03-30 07:29:08

标签: ios iphone swift plist voip

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

Apple文档清楚地提到: -

(=========编辑:这是来自官方的Apple文档,请在评论或回答之前看一下,如果没有用户交互或静默推送通知,App无法启动。还有看看下面的Github项目,人们已经验证了这种行为)

  

UIBackgroundModes数组的值

     

价值:voip 说明:该应用提供Voice-over-IP服务。   使用此密钥的应用会在系统启动后自动启动   该应用程序可以重新建立VoIP服务。使用此密钥的应用是   也允许播放背景音频。

     

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

Here is a screenshot from Apple Docs.

我确保: -

  1. 当设备断电时,应用程序正在运行。
  2. VoIP出现在plistCapabilities部分。
  3. 通过main方法和application:didFinishLaunchingWithOptions:方法向文件中添加日志,确保设备重启后肯定无法启动应用。
  4. 设备重启后,设备屏幕至少解锁一次。
  5. enter image description here

    enter image description here

      

    我甚至尝试用36颗星执行这个GitHub示例App进行测试   启动启动。 https://github.com/lithium3141/BootLaunch
      但是,当我尝试使用设备时,即使这个应用程序也不会在重启时重新启动。

    因此,这让我想到最近iOS10中是否有某些内容发生了变化,或者我在这里仍然遗漏了什么?

2 个答案:

答案 0 :(得分:6)

好的,我对此进行了进一步调查,但首先我应该指出我没有通过实际尝试为此构建项目来验证这一点,因为现在对我来说太费时了。

我找到this(已在评论中提及),this,最重要的是this tech Q&A

我收集的内容尤其是那些线程中Apple技术人员的各种评论,看来iOS 10的行为确实发生了变化。这意味着,如果您将构建与最新的SDK(即iOS 10库)链接,那么在过去的iOS版本中连接到VoiP服务器的相同代码将不再这样做。

现在,在您的情况下,您实际上并不需要真正的VoiP连接,对吗?你只是对"重启后启动"功能,对吗?至少您链接的演示项目实际上并没有进行任何VoiP连接,例如,setKeepAliveTimeout:handler:方法甚至没有实现。 我知道这个具体问题没有在链接线程中讨论或在Q& A中解决,但是:

有意义的是,与整个传统的VoiP行为一起,重启功能也会消失。如果您切换到Push-Kit VoiP,您的应用程序在重新启动后不需要启动,它会在下一个远程通知到达时重新启动(并且VoiP通知具有高优先级,因此据说没有延迟)。

显然我在这里扣除了这一切背后的理由并且不能保证Apple真的按照这些思路进行思考,但这是有道理的:(传统)VoiP应用程序被重新启动的全部原因重新启动后,它需要建立连接,即它需要运行一些代码。使用不再需要的推送通知(操作系统基本上会在幕后为您提供这些通知),因此他们完全删除了此功能以及整个传统的VoiP方法。

您可以通过针对较旧的SDK进行编译来测试这一点(即使用Xcode 7作为Q& A建议)并查看它是否重新启动。那个苹果工作人员实际上解释说操作系统确实在应用程序的构建SDK上有所区别,这对我来说完全违反直觉。显然在这种情况下,它会决定"嘿,这是一个较旧的应用程序,所以它希望重新启动因为它的SDK被记录的方式"对于基于Xcode 7和&#34的应用程序,哦,这个应用程序是新的,所以我不需要坚持旧的方式"除此以外。 Wowsies。

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

记录:我能理解那些线索中愤怒的人。虽然可能存在技术原因导致这种变化,但这一具体后果并不明显。如果一个方法被弃用,但项目仍然编译并运行,我不希望这样的过程以这种方式失败。这些应用程序不会崩溃,它们只是被操作系统处理得不同,而且不完全相同。至少我希望新文档中的文档更清晰。

答案 1 :(得分:0)

只有使用推送工具包静音通知才能在终止模式下调用应用程序,并且必须为推送工具包生成证书,而不是正常的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 //处理程序方法,如果你有动作按钮(本地)

  • 然后,如果您有远程通知

    didReceiveRemoteNotification //收到远程通知

  • 然后

    handleActionWithIdentifier //处理程序方法,如果您有操作按钮(远程)

注意 - 如果不点击应用图标或接收推送工具包有效负载,您的应用将永远不会自动撤销/打开/重新启动。如果您希望您的应用程序是基于VOIP的,则应用程序会在设备重启后撤消。不可能。