从 iOS 12 开始,CLLocationManager 不再在后台无休止地运行。该应用程序会在随机时间终止而没有崩溃日志。这在 iOS 12 之前运行良好。
为了演示这个问题,我在这里创建了一个示例应用程序
演示应用程序只是启动一个 CLLocationManager 并让它在后台运行。在后台运行时,我们通过记录它来跟踪它。问题是该应用程序被iOS终止。创建演示应用程序来演示此问题。
重现步骤
- 在设备上运行应用程序
- 对位置管理器的访问权限
- 将应用程序置于后台
- 等待 1-48 小时
结果:
- 该应用程序已终止
应用程序在随机时间后无故终止。
预期结果:
- 该应用程序仍在运行。
它应该如何工作
苹果工程师证实了这一点:
一旦 CLLocationManager 更新在前台启动并且您完成了所有工作以使其在后台运行,位置更新应该在后台无休止地运行,直到:
- 应用程序是强制退出
- 设备已重新启动
- 应用停止位置更新
- app 释放 CLLocationManager 对象
- 应用程序崩溃
- iOS由于内存不足而终止应用程序,
- locationManager 对象被释放、过度释放或覆盖。你应该确保你的视图控制器没有被实例化,然后重置 locationController 类。如果在应用程序处于后台时发生这种情况,您将重新启动更新,这将导致应用程序最终被暂停。您应该确保 locationController 是一个单例。
- 应用程序崩溃。检查您正在测试的设备上是否有崩溃日志
- 由于内存不足,iOS 正在终止应用程序。在这种情况下,您会在显示您的应用程序被终止的设备上找到 JetsamEvent 日志。您可以检查时间戳并找到您的应用程序停止工作的时间。