我想在后台使用位置更新和使用" 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%的电池
我想念它吗?
答案 0 :(得分:0)
从您的日志中,我无法判断它是否正在推迟。您至少需要查看error.code
中locationManager:didFinishDeferredUpdatesWithError:
的内容,并了解locations
kCLErrorDeferredFailed
则表示GPS无法使用,或者位置管理员此时无法获得位置修复。 kCLErrorDeferredNotUpdatingLocation
。kCLErrorDeferredDistanceFiltered
如果您设置了距离过滤器(您没有这样做)。 kCLErrorDeferredAccuracyTooLow
如果你的准确度低于10米(看起来你的确够了)。 kCLErrorDeferredCanceled
如果发生其他错误(您的应用位于前台,您的手机正在充电,您还有另一个使用连续位置的应用)。我鼓励你看(CLLocationManager's reference)
另外,请记住,仅当操作系统有机会节省电池时才会推迟推迟。这开始于手机进入低功耗待机模式。即使存在后台网络请求,您也可能无法获得位置延迟,因为CPU在后台处于活动状态。 (有些人在不同的论坛上说,背景音频播放也会使手机无法进入完全待机状态,因此可能无法推迟定位)。