24

从 iOS 12 开始,CLLocationManager 不再在后台无休止地运行。该应用程序会在随机时间终止而没有崩溃日志。这在 iOS 12 之前运行良好。

为了演示这个问题,我在这里创建了一个示例应用程序

演示应用程序只是启动一个 CLLocationManager 并让它在后台运行。在后台运行时,我们通过记录它来跟踪它。问题是该应用程序被iOS终止。创建演示应用程序来演示此问题。

重现步骤

  1. 在设备上运行应用程序
  2. 对位置管理器的访问权限
  3. 将应用程序置于后台
  4. 等待 1-48 小时

结果:

  1. 该应用程序已终止

应用程序在随机时间后无故终止。

预期结果:

  1. 该应用程序仍在运行。

它应该如何工作

苹果工程师证实了这一点:

一旦 CLLocationManager 更新在前台启动并且您完成了所有工作以使其在后台运行,位置更新应该在后台无休止地运行,直到:

  • 应用程序是强制退出
  • 设备已重新启动
  • 应用停止位置更新
  • app 释放 CLLocationManager 对象
  • 应用程序崩溃
  • iOS由于内存不足而终止应用程序,
  • locationManager 对象被释放、过度释放或覆盖。你应该确保你的视图控制器没有被实例化,然后重置 locationController 类。如果在应用程序处于后台时发生这种情况,您将重新启动更新,这将导致应用程序最终被暂停。您应该确保 locationController 是一个单例。
  • 应用程序崩溃。检查您正在测试的设备上是否有崩溃日志
  • 由于内存不足,iOS 正在终止应用程序。在这种情况下,您会在显示您的应用程序被终止的设备上找到 JetsamEvent 日志。您可以检查时间戳并找到您的应用程序停止工作的时间。
4

2 回答 2

29

更新的答案:

Apple 在 iOS 12.2 beta 2 (16E5191d) 中修复了此错误

原始分析和错误检测:

我们与 Apple 开发人员技术支持一起使用 Sysdiagnose 文件分析了此问题。按照这些指南,您可以安装配置文件以在您的设备上进行更多登录。我不确切知道这些日志是如何工作的以及在哪里可以找到这个问题,但 Apple 为我做了这件事,并带来了第一个分析:

关于您在 2018 年 10 月 22 日 01:01:12:587 观察到的暂停事件,这就是我所看到的(在您上次记录活动后大约一分钟)

[CllocationManag:2725] 以描述终止:{ owner = ; 目标 = rw.sp.flitsmeister.frameworks.CllocationManagerBackgroundTest; }

这基本上是因为您的应用程序已终止,因为系统需要驱动器空间,并杀死了一堆应用程序,因此它可以删除它们的 /tmp 和 /Library/Caches 目录。我已经看到这个过程在 iOS 12 中更加激进,但是看到你使用的是 256GB 的设备,并且清理后有大约 179GB 的可用空间,我很难相信这是合理的。

在发送了更多的系统诊断和重现案例后,Apple 尽力分析并得出以下结论:

不幸的是,我没有带来好消息。

事实证明,目前在 iOS 12 中,有一种新机制会在系统需要释放资源时定期终止长时间运行的后台应用程序。目前,这个过程有点过于激进,我正在与相关团队合作,以使其表现得更好。

所以,在这一点上,我希望你提交一份错误报告。解释症状。并确保您将 sysdiagnose 文件与错误报告一起上传。(我已经把你的寄了,但也有新的也没有什么坏处)。请让我知道错误编号。

因此,这意味着当前在 iOS 12 中,您的应用程序不会在后台无休止地运行。我已经填写了一个错误报告,号码是 45581276,并且会尽量保持这个线程的更新。

于 2018-10-26T09:04:02.737 回答
3

当应用程序进入后台时,我尝试清除 /tmp 和 /Library/Caches 目录,而行为没有任何变化。当应用程序处理后台位置而没有任何更改时,我也定期尝试相同的方法。

于 2018-11-12T22:28:31.550 回答