我正在开发一个应用程序来监控重要的位置更改,以便在后台获取用户的位置。我已成功实施了locationManager.startMonitoringSignificantLocationChanges
的{{1}}以及locationManager:didUpdateLocations
和locationManager: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事件的传递,或以某种方式降低其频率?如果是这样,怎么样?
答案 0 :(得分:5)
延迟更新的目的是在处理来自GPS的1 Hz位置更新时节省主CPU消耗的电量。通过延迟更新,CPU保持睡眠状态,同时GPS芯片每秒累积一次GPS位置(1 Hz)。
使用重要位置更改(SLC),系统不使用GPS。它基于单元塔三角测量确定位置,在发生重大变化之前不会唤醒CPU。
这两个功能是互斥的,您不能推迟重要位置更改的更新,因为GPS芯片不参与SLC。