是否可以在监控重要位置更改时推迟位置更新?

时间:2016-04-15 18:19:47

标签: ios core-location

我正在开发一个应用程序来监控重要的位置更改,以便在后台获取用户的位置。我已成功实施了locationManager.startMonitoringSignificantLocationChanges的{​​{1}}以及locationManager:didUpdateLocationslocationManager:didFailWithError方法。

然而,SLC实际上比我需要的更准确。根据Apple的文档 - 并且通过我的测试证实 - slc大约每500米触发一次位置更新,并在5到10分钟之间触发。因此,我在代理人的CLLocationManagerDelegate方法中实施了locationManager.allowDeferredLocationUpdatesUntilTravelled:timeout,如本指南所述:http://apple.co/1W4gqEJ

这是我的代码:

didUpdateLocations

不幸的是,位置管理员从不推迟更新。调用var deferringUpdates = false func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { for location in locations { NSLog("Significant location change recorded:\n%@", location) } if let location = locations.first { let secondsAgo: NSTimeInterval = location.timestamp.timeIntervalSinceNow // Only process the location if it is very recent (less than 15 seconds old). if abs(secondsAgo) < 15.0 { saveExtendedUserInfo(withLocation: location) } } if !deferringUpdates { manager.allowDeferredLocationUpdatesUntilTraveled(810, timeout: 600) deferringUpdates = true NSLog("Deferring location updates...") } } func locationManager(manager: CLLocationManager, didFailWithError error: NSError) { NSLog(error.localizedDescription) } func locationManager(manager: CLLocationManager, didFinishDeferredUpdatesWithError error: NSError?) { deferringUpdates = false if let deferralError = error { NSLog(deferralError.localizedDescription) } } 后,代理会立即执行allowDeferredUpdatesUntilTravelled:timeout并生成didFinishDeferredUpdatesWithError kCLErrorDomain 12

为什么我会收到该错误?这似乎意味着延迟更新服务不会将监控重要位置更改识别为“更新位置”。是否有可能推迟slc事件的传递,或以某种方式降低其频率?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:5)

延迟更新的目的是在处理来自GPS的1 Hz位置更新时节省主CPU消耗的电量。通过延迟更新,CPU保持睡眠状态,同时GPS芯片每秒累积一次GPS位置(1 Hz)。

使用重要位置更改(SLC),系统使用GPS。它基于单元塔三角测量确定位置,在发生重大变化之前不会唤醒CPU。

这两个功能是互斥的,您不能推迟重要位置更改的更新,因为GPS芯片不参与SLC。