应用程序消耗过多电池
Posted
技术标签:
【中文标题】应用程序消耗过多电池【英文标题】:App consuming too much battery 【发布时间】: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 是您研究中唯一出现的东西吗? 该应用程序会丢弃您一整天去哪里的图钉。这就像追溯你的脚步之类的事情。这只是为了好玩。我已经看到其他应用程序这样做并以相对的方式有效地执行此操作,例如移动、优步等。 【参考方案1】:你有两个选择:
-
使用
allowDeferredLocationUpdatesUntilTraveled:timeout:
使用重大的位置变化
尝试第一个,如果设备上不可用,则必须牺牲 10m 目标
【讨论】:
allowDeferredLocationUpdatesUntilTraveled:timeout
我确实详细看过这个。我会用我的viewDidLoad
打电话吗?这就是我目前打电话给startUpdatingLocation()
的地方。
在开始位置跟踪之前设置,注意委托更新【参考方案2】:
我最终通过使用地理围栏解决了这个问题。我创建了一个CLCircularRegion
并调用startMonitoringForRegion(_:)
。每次用户离开该区域(10 米)时,我都会向服务器发出请求以查看他现在的位置并更新该区域。这几乎不使用电池,这正是我正在寻找的。查看CLLocationManager
、CLLocationManagerDelegate
和CLCircularRegion
类,了解如何执行此操作。我希望这对某人有用。
【讨论】:
以上是关于应用程序消耗过多电池的主要内容,如果未能解决你的问题,请参考以下文章
Android:使用电池历史学家诊断应用程序过度电池消耗的来源