在构建我想要的iOS应用程序之后,我意识到由于位置服务而耗费太多电池。
背景:每次用户移动10米(30英尺)时,我的应用程序都会通过网络呼叫服务器。这会触发didUpdateLocation
功能。当触发该功能时,我使用NSURLSession
将用户坐标发送到服务器,这真的是关于它的。
现在的问题在于,我无法在第一次更新后通过调用locationManager.stopUpdatingLocation()
来关闭位置服务硬件,因为当用户决定再次移动时,我不会获得任何后续更新。此外,位置服务保持活动状态,而应用程序在后台监控移动,也会拖延电池寿命。在文档和其他问题上,我已经阅读了关于这个问题的几乎所有内容。
许多其他问题建议使用NSTimer
并在经过一段时间后调用startUpdatingLocation()
并且我已收到第一个位置更新并在我的{stopUpdatingLocation
中调用didUpdateLocation
{1}}功能。所以我尝试了以下内容:
let timerAction = NSTimer(timeInterval: 6.0, target: self, selector: #selector(MapViewController().startLocationServices), userInfo: nil, repeats: true)
timerAction.fire()
func startLocationServices() {
self.locationManager.startUpdatingLocation()
}
由于某种原因,这并没有奏效。但是我的问题真正关注的是当我必须使用distanceFilter = 10.0
监控用户在前景和背景中的移动时,如何节省电池并使我的应用真正节能?
任何关于你所做的事情或你会推荐什么的建议都会受到极大的追捧和赞赏。
谢谢!
修改
@wain建议使用allowDeferredLocationUpdatesUntilTraveled:timeout:
,
在调用此方法之前开始传递位置更新。调用此方法的最常见位置是在委托的locationManager:didUpdateLocations:方法中。处理完任何新位置后,如果您希望推迟将来的更新,直到满足距离或时间条件,请调用此方法。如果新事件到达且您的应用程序位于后台,则会缓存事件并适当延迟交付。
答案 0 :(得分:2)
您有两个选择:
allowDeferredLocationUpdatesUntilTraveled:timeout:
尝试第一个,如果设备上没有,你必须牺牲你的10米目标
答案 1 :(得分:2)
我最终通过使用地理围栏解决了这个问题。我创建了CLCircularRegion
并致电startMonitoringForRegion(_:)
。每当用户离开该区域(10米)时,我向服务器发出请求以查看他现在的位置并更新该区域。这使用很少甚至没有电池,正是我正在寻找的。查看有关如何执行此操作的CLLocationManager
,CLLocationManagerDelegate
和CLCircularRegion
类。我希望这对某人来说会派上用场。