监控重大位置变化时是不是可以推迟位置更新?

Posted

技术标签:

【中文标题】监控重大位置变化时是不是可以推迟位置更新?【英文标题】:Is it possible to defer location updates when monitoring significant location changes?监控重大位置变化时是否可以推迟位置更新? 【发布时间】:2016-04-15 18:19:47 【问题描述】:

我正在开发一个应用程序来监控重大的位置变化,以便在后台获取用户的位置。我已经成功实现了locationManager.startMonitoringSignificantLocationChanges 以及我的CLLocationManagerDelegatelocationManager:didUpdateLocationslocationManager:didFailWithError 方法。

但是,SLC 实际上比我需要的更准确。根据 Apple 的文档 - 并由我的测试证实 - slc 大约每 500m 和 5 到 10 分钟触发一次位置更新。因此,我在委托的didUpdateLocations 方法中实现了locationManager.allowDeferredLocationUpdatesUntilTravelled:timeout,如本指南中所述:http://apple.co/1W4gqEJ。

这是我的代码:

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,即CLError.DeferredNotUpdatingLocation

为什么会出现这个错误?这似乎意味着延迟更新服务不会将监视重大位置更改视为“更新位置”。是否可以推迟 slc 事件的传递,或者以某种方式降低它们的频率?如果有,怎么做?

【问题讨论】:

嘿。我正在实施同样的事情。你是怎么做到的?你能帮我解决这个问题吗?如何以及在哪里使用此方法 .allowDeferredUpdatesUntilTravelled: 根据用户的速度超时? 【参考方案1】:

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

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

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

【讨论】:

以上是关于监控重大位置变化时是不是可以推迟位置更新?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 标准定位服务 vs 重大变化定位服务 vs 区域监控

监控 CLLocationManager 重大位置更改时应用程序不会重新启动 - iPhone

监视重大位置更改时不会调用“didUpdateLocations”

至少每 15 分钟不会触发重大位置变化

目标 c - 重大的位置变化

触发重大位置变化更新和给定位置准确性所需的行进距离