ios - 即使 "voip"中的 "UIBackgroundModes"中存在 "plist",iOS 应用程序在 iOS10 中设备重启后也不会自动启动

标签 ios iphone swift plist voip

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

Apple 文档明确提到:-

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

Values for the UIBackgroundModes array

Value : voip Description : The app provides Voice-over-IP services. Apps with this key are automatically launched after system boot so that the app can reestablish VoIP services. Apps with this key are also allowed to play background audio.

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. 在设备重启后,设备的屏幕至少解锁一次。

enter image description here

enter image description here

I even tried executing this GitHub example App with 36 stars to test Boot Launch. https://github.com/lithium3141/BootLaunch
But even this App does not restart on reboot when I tried on device.

因此,这让我想到 iOS10 最近是否发生了一些变化,或者我是否仍然遗漏了什么?

最佳答案

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

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

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

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

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

显然,我在这里推导出这整件事背后的基本原理,不能保证 Apple 真的按照这些思路思考,但这是有道理的:(旧版)VoiP 应用程序在reboot 是它需要建立连接,即它需要运行一些代码。有了不再需要的推送通知(操作系统基本上会在幕后为您执行此操作以获取这些通知),因此他们完全删除此功能以及整个遗留 VoiP 方法是有道理的。

您可以通过针对较旧的 SDK 进行编译(即按照问答建议使用 Xcode 7)来测试它,然后查看它是否会重新启动。一位苹果员工实际上解释说,操作系统确实在应用程序的构建 SDK 上有所区别,这对我来说完全违反直觉。显然在这种情况下,它会决定“嘿,这是一个较旧的应用程序,因此它希望重新启动,因为它的 SDK 是这样记录的”对于在 Xcode 7 上构建的应用程序和“哦,这个应用程序是一个新应用程序,所以我不否则不需要坚持旧的方式”。哇塞。


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

郑重声明:我能理解那些线程中愤怒的人。虽然这种变化可能有技术原因,但这种具体后果远非显而易见。如果一个方法被弃用,但项目仍然可以编译和运行,我不希望这样的过程以那种方式失败。这些应用程序不会崩溃,它们只是“被操作系统区别对待”,这并不完全相同。至少我原以为新 SDK 中的文档会更清楚这一点。

关于ios - 即使 "voip"中的 "UIBackgroundModes"中存在 "plist",iOS 应用程序在 iOS10 中设备重启后也不会自动启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43111249/

相关文章:

ios - Swift:标签文本问题(获取相同数组的不同计数)来自 API 的响应

ios - 检查设备是否支持模糊

iphone - 如何在 objective-c 中获取纬度和经度的当前位置

iphone - 在主 Bundle 之外访问

unit-testing - 如何在 Swift 中对 NSFetchedResultsController 进行单元测试

ios - TableView 不显示详细 View

ios - 将应用程序 (.ipa) 静默安装到 iPad

iphone - UIActivityIndi​​catorView 不工作(获取影响 UIActivityIndi​​catorView 的 Facebook 权限)

json - 如何从 json 对象初始化结构

ios - 如何检索存储在 PFUser.currentUser() 下的 PFObjects 自定义子类的数组