如何避免 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,则不会发生损坏。
此修复程序已在数百人的应用商店应用程序中上线,后台跟踪工作正常。
我在跟踪应用程序中遇到问题,但仅限于 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,则不会发生损坏。
此修复程序已在数百人的应用商店应用程序中上线,后台跟踪工作正常。