如何避免 iOS 11 上的 gps 跟踪出现间隙

How to avoid gaps in gps tracking on iOS 11

我在跟踪应用程序中遇到问题,但仅限于 iOS 11。该应用程序在特定条件下会在后台被动记录您的 GPS 位置。

iOS 11 上出现的问题是 CLLocationManager 似乎随机停止报告 GPS 事件 10 到 900+ 秒。

位置管理器设置如下:

    let locationManager = CLLocationManager()
    locationManager.allowsBackgroundLocationUpdates = true
    locationManager.pausesLocationUpdatesAutomatically = false
    locationManager.startMonitoringSignificantLocationChanges()
    locationManager.desiredAccuracy = 10
    locationManager.activityType = .automotiveNavigation

认为线程 CoreLocation 正在管理和使用所有回调可能是负担过重。

我尝试过委派给不同的线程进行处理,因此该应用不会占用 CoreLocations 资源。这是使用如下设置的操作队列完成的:

    let queue = OperationQueue()
    queue.maxConcurrentOperationCount = 1
    queue.qualityOfService = .userInitiated

使用该操作队列的回调:

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        queue.addOperation {
            // process locations
        }
    }

引入操作队列无助于避免间隙,但它确实做到了,当间隙发生时,位置管理器会报告一堆(不同的)具有相同时间戳的位置。

具有相同时间戳的位置并不是所有缺失的位置,即如果有 200 秒的间隔,我可能只会得到 15 个具有相同时间戳的位置。

我希望这里有人能告诉我为什么会这样,以及我可以做些什么来避免这些差距。

提前致谢。

经过多次审查、试验、与 Apple 的讨论,我们现在似乎已经解决了这个问题。即使当跟踪开始时应用程序在前台时,Apple 也只会保证 GPS 跟踪后台。我们应用的修复正在更改以下内容:

        locationManager.startMonitoringSignificantLocationChanges()

...至:

        locationManager.stopMonitoringSignificantLocationChanges()
        locationManager.startMonitoringSignificantLocationChanges()

理论上,在启动期间将 true 应用于 "monitoring" 设置时,应用程序的设置会损坏。如果首先将 "monitoring" 设置为 false,然后再设置为 true,则不会发生损坏。

此修复程序已在数百人的应用商店应用程序中上线,后台跟踪工作正常。