应用程序消耗过多电池

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 米)时,我都会向服务器发出请求以查看他现在的位置并更新该区域。这几乎不使用电池,这正是我正在寻找的。查看CLLocationManagerCLLocationManagerDelegateCLCircularRegion 类,了解如何执行此操作。我希望这对某人有用。

【讨论】:

以上是关于应用程序消耗过多电池的主要内容,如果未能解决你的问题,请参考以下文章

Android:使用电池历史学家诊断应用程序过度电池消耗的来源

Android:有没有办法知道我们的应用程序消耗的电池电量?

在后台播放音乐时减少电池消耗

如何找出android设备中每个应用程序的电池消耗[重复]

是否可以在ios中找到应用程序的电池消耗?

在 iOS 中检查我的应用的电池消耗