CLLocationManager didRangeBeacons 停止在前台工作

Posted

技术标签:

【中文标题】CLLocationManager didRangeBeacons 停止在前台工作【英文标题】:CLLocationManager didRangeBeacons stops working in foreground 【发布时间】:2019-03-12 20:16:50 【问题描述】:

我有一个信标测距应用程序,该应用程序以前在前台和后台都可以长时间(几天)正常工作。现在,即使在前景中,它也会突然停止显示任何信标。通常,它可以正常工作 18 到 20 分钟,然后停止并显示我的信标范围为 0 RSSI(使用 xcode 日志窗口中的调试消息查看),即使信标只有几英尺远并且之前注册了 RSSI 值-60。几秒钟后,它将继续每秒触发 didRangeBeacons 事件,但信标数组为空。

我看到另一个线程 here 关于 ios 12.1 有一个错误导致测距在后台停止并且 12.2 beta 2 有一个修复,所以我将用于测试的 iPad 从 12.1 更新到 12.2 beta 4 但是还是有这个问题。

当设备进入此状态时,我可以停止应用程序并重新运行它,它会再次运行大约 20 分钟:

当我的应用程序仍在运行并在 xCode 中观看我的消息时,我可以切换到 iPad 上的设置屏幕。打开设置屏幕后,我可以立即看到调试消息再次开始显示信标。我可以切换回我的应用,它会继续工作大约 20 分钟,然后再次失败。

我确实将 CLLocationManager pausesLocationUpdatesAutomatically 设置为 false。

这听起来像是蓝牙正在关闭,但它非常令人困惑。

更新:

我发现如果屏幕关闭/锁定,该应用程序将继续在后台运行数小时。它仅在屏幕处于打开状态时才会停止工作,无论是前台还是后台。

我已尝试重置测试 iPad 并重置网络设置和位置权限,但观察到的性能没有变化。

这看起来与 Apple 首次发布 iOS 10 并破坏信标测距时发生的情况相同。

更新 2:

检查以下 CLLocationManager 事件,当测距停止时,它们都没有被触发:

didFailWithError

测距信标DidFailForRegion

locationManagerDidPauseLocationUpdates

didExitRegion

didChangeAuthorizationStatus

此外,在循环中运行 gpx 文件以模拟位置更改不会改变观察到的错误。

【问题讨论】:

【参考方案1】:

发现此问题似乎与硬件有关。在 iPad Mini 上测试有问题,而在 iPhone XS 上测试则没有(都使用 OS 12.2)。

而且,奇怪的是,使用来自不同制造商的 iBeacons(但具有相同的广告设置)也可以解决此问题。在这种情况下,使用 iPad 或手机就可以了。

【讨论】:

以上是关于CLLocationManager didRangeBeacons 停止在前台工作的主要内容,如果未能解决你的问题,请参考以下文章

为啥'CLLocationManager.locationServicesEnabled()'默认为真?

Xcode 6 GM - CLLocationManager

CLLocationManager 和 CLGeoCoder

CLLocationManager:没有调用 didChangeAuthorization 和 didRangeBeacons

CLLocationManager 最后一个已知位置

CLLocationManager 从不调用委托方法[重复]