iOS 9推迟位置更新无法正常工作

时间:2016-06-09 00:41:05

标签: swift background location

我想在后台使用位置更新和使用" allowDeferredLocationUpdatesUntilTraveled"

但它现在确实延迟了位置,它每隔几秒发生一次(它基于准确性),它由locationManager中的条件触发:didFinishDeferredUpdatesWithError:

我是根据document

测试的

我设置了位置更新后台模式

override func viewDidLoad() {
    super.viewDidLoad()
locationManager = CLLocationManager()


    if CLLocationManager.authorizationStatus() == .NotDetermined{
        locationManager.requestAlwaysAuthorization()
    }

    locationManager.delegate = self

    locationManager.pausesLocationUpdatesAutomatically = false
    locationManager.activityType = CLActivityType.Fitness

    locationManager.allowsBackgroundLocationUpdates = true
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.distanceFilter = kCLDistanceFilterNone

    locationManager.startUpdatingLocation()
   }



func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
   if UIApplication.sharedApplication().applicationState == .Background && !self.bDeferringUpdates // && CLLocationManager.deferredLocationUpdatesAvailable()
    {

        self.bDeferringUpdates = true;
          self.locationManager.allowDeferredLocationUpdatesUntilTraveled(CLLocationDistanceMax, timeout: 60*60)  


    }



}


    func locationManager(manager: CLLocationManager, didFinishDeferredUpdatesWithError error: NSError?) {

    self.bDeferringUpdates = false


}

有人说它在调试模式或查询模式下没有用,所以我在没有充电的情况下测试了它。

我记录了事件,但它发生在每一秒都没有推迟。

日志在下面

2016-06-09 02:51:39 - didUpdateLocations
2016-06-09 02:51:40 - didUpdateLocations
2016-06-09 02:51:41 - didUpdateLocations
2016-06-09 02:51:42 - didUpdateLocations
2016-06-09 02:51:43 - didUpdateLocations
2016-06-09 02:51:44 - didUpdateLocations
2016-06-09 02:51:45 - didUpdateLocations
2016-06-09 02:51:46 - didUpdateLocations
2016-06-09 02:51:47 - didUpdateLocations
2016-06-09 02:51:48 - didUpdateLocations
2016-06-09 02:51:49 - didUpdateLocations
2016-06-09 02:51:49 - didFinishDeferredUpdatesWithError
2016-06-09 02:51:50 - didUpdateLocations
2016-06-09 02:51:50 - allowDeferredLocationUpdatesUntilTraveled
2016-06-09 02:51:51 - didUpdateLocations
2016-06-09 02:51:52 - didUpdateLocations
2016-06-09 02:51:53 - didUpdateLocations
2016-06-09 02:51:54 - didUpdateLocations

我在上午1:52到8:03进行了测试,没有充电

凌晨1点52分,100%电池, 上午8:03,电池电量为87%

在6小时内耗尽13%的电池

我想念它吗?

1 个答案:

答案 0 :(得分:0)

从您的日志中,我无法判断它是否正在推迟。您至少需要查看error.codelocationManager:didFinishDeferredUpdatesWithError:的内容,并了解locations locationManager:didUpdateLocations数组中的位置点数>

错误

  • kCLErrorDeferredFailed则表示GPS无法使用,或者位置管理员此时无法获得位置修复。
  • 如果您未能启动位置管理器更新,则
  • kCLErrorDeferredNotUpdatingLocation
  • kCLErrorDeferredDistanceFiltered如果您设置了距离过滤器(您没有这样做)。
  • kCLErrorDeferredAccuracyTooLow如果你的准确度低于10米(看起来你的确够了)。
  • kCLErrorDeferredCanceled如果发生其他错误(您的应用位于前台,您的手机正在充电,您还有另一个使用连续位置的应用)。

我鼓励你看(CLLocationManager's reference

另外,请记住,仅当操作系统有机会节省电池时才会推迟推迟。这开始于手机进入低功耗待机模式。即使存在后台网络请求,您也可能无法获得位置延迟,因为CPU在后台处于活动状态。 (有些人在不同的论坛上说,背景音频播放也会使手机无法进入完全待机状态,因此可能无法推迟定位)。