【发布时间】:2016-03-30 18:20:57
【问题描述】:
在构建了我想要的 iOS 应用后,我意识到由于定位服务,它消耗了太多的电池。
背景:每当用户移动 10 米(30 英尺)时,我的应用都会通过网络调用服务器。这会触发didUpdateLocation 函数。当该功能被触发时,我使用NSURLSession 将用户坐标发送到服务器,就是这样。
现在的问题在于,我无法在第一次更新后通过调用locationManager.stopUpdatingLocation() 关闭定位服务硬件,因为当用户决定再次移动时,我不会获得任何后续更新。此外,当应用程序在后台监控移动时,定位服务会保持活动状态,这也会影响电池寿命。当谈到这里的文档和其他问题时,我已经阅读了关于这个问题的几乎所有内容。
许多其他问题建议使用NSTimer 并在经过一段时间后调用startUpdatingLocation(),并且我收到了第一个位置更新并在我的didUpdateLocation 函数中调用stopUpdatingLocation。所以我尝试了以下方法:
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: 方法。处理任何新位置后,如果您想推迟将来的更新直到满足距离或时间条件,请调用此方法。如果有新事件到达并且您的应用在后台,则会缓存这些事件并适当延迟它们的传递。
【问题讨论】:
-
不会发生(至少跨越广泛的设备功能)。为什么您需要每 10m 24/7?谁会对使用这个应用程序感兴趣? NATimer 是您研究中唯一出现的东西吗?
-
该应用程序会丢弃您一整天去哪里的图钉。这就像追溯你的脚步之类的事情。这只是为了好玩。我已经看到其他应用程序这样做并以相对的方式有效地执行此操作,例如移动、优步等。
标签: ios swift core-location cllocationmanager