静止时触发 startMonitoringSignificantLocationChanges

startMonitoringSignificantLocationChanges triggering when stationary

我有一个客户申请要求我使用 startMonitoringSignificantLocationChanges() 方法,但是当我静止不动并且有一段时间没有移动时,它仍然会触发。

我的位置管理器代码如下:

        locationManager = CLLocationManager()
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestAlwaysAuthorization()
        locationManager.distanceFilter = 1500
        locationManager.startUpdatingLocation()
        locationManager.delegate = self
        locationManager.startMonitoringSignificantLocationChanges()
        locationManager.allowsBackgroundLocationUpdates = true
        locationManager.pausesLocationUpdatesAutomatically = false

然后我的didUpdateLocations

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let location: CLLocation = locations.last!
        print("Location: \(location)")

        print("SIGNIFICANT CHANGE")

    }

当我旅行时,它按预期每 1500 米打印一次,但它在意外时触发,我找不到解决方案或可能的问题。

您不能依赖 startMonitoringSignificantLocationChanges() 来获得一致的结果。如果你去一个信号塔密度低的区域,在它被触发之前你必须移动的距离将再次改变。这是一种低功耗的定位方法,可靠性低。

话虽这么说,它在你没有移动时触发是不寻常的。也许您的设备切换了手机信号塔?也许这是一个错误。提交一份报告,制作一个小型测试项目,然后将其与您的日志文件一起发送给 Apple。

我不知道您的要求,但一种解决方案是保存(在实例变量中并作为文件)最后找到的位置并比较该位置与新位置之间的距离,看看您是否真的移动过很长的路要走。另一种是使用区域监控。

activityType会有帮助吗?

既然你用它来旅行,你可能会忽略步行或非汽车运动?

如果这不是一个选项,您可以尝试在 didUpdateLocations 中计算 CLLocation 对象的 horizontal/vertical 准确性。如果它不在阈值内则忽略(这可能会导致一些漏报)