我正在研究iOS示踪剂。即使应用程序不在前台,它也必须运行和接收位置,即我使用后台模式“位置更新”。但是,如果可能的话,安全电池也没关系。特别是,如果设备不移动,则无需接收位置。
distanceFilter
实例上设置CLLocationManager
,但它不会节省电量,只会减少位置更新次数。pausesLocationUpdatesAutomatically
设置为YES
(由deafult启用),但如果应用处于后台且位置更新暂停,则应用暂停即使设备再次开始移动也不会唤醒。当我需要在后台获取位置时,有没有办法省电?标志pausesLocationUpdatesAutomatically
与我正在寻找的非常接近,但在后台暂停应用程序对我来说是一个显示阻止。
答案 0 :(得分:16)
使用Laky提到的“延迟位置更新”可能是如何为必须在后台运行且无法暂停的应用程序节省电量的唯一可行方法。我只是想总结一下在试验这个功能时学到的东西:
可以禁止停用该应用,即可以在pausesLocationUpdatesAutomatically
的实例上将属性NO
设置为CLLocationManager
,并且延迟的位置更新仍然有效。
调用allowDeferredLocationUpdatesUntilTraveled: timeout:
一定距离时,必须将某些超时指定为参数。如果提供的值太低,则该功能将不会生效。超时80秒太低,90秒就可以了。距离90米太低,100米就可以了。 (在iPhone 5,iOS 8.4.1上测试)
如果应用只是在后台,我不确定此功能是否生效。到目前为止我还没有观察到它。但是,如果屏幕被锁定,它可能会生效。
屏幕锁定后,此功能不会立即生效。你必须等一会儿。我的观察结果是30-150秒。
系统有时无法批量提供位置更新。我的测试应用程序在后台运行了13个小时,屏幕锁定,38%的时间它一个接一个地收到位置。只剩下62%的运行时间它接收批次的位置(至少有两个元素的集合)。该设备完全没有移动。
如果设备通过对接线连接到Mac并且应用程序在调试器中运行,则此功能将不会生效。
所有设备均不支持此功能,例如iPhone 4或iPad 2不支持它。
我做了一些测量来测试节省了多少电量。我在iPhone 5上运行了一个应用程序,iOS 8.4.1在后台屏幕锁定。该应用只会启动CLLocationManager
并保存有关收到的位置数据的统计信息(使用NSUSerDefaults
),以便您可以在下次应用启动时查看。禁用Wifi连接,启用蜂窝数据。电池充满了热情,没有其他应用程序在运行。设备没有移动,它被放置在有GPS信号的地方。随着延迟的位置更新(最小距离900米,超时90秒),电池在15.25小时内完全耗尽。如果没有延期的位置更新,则需要13个小时。
答案 1 :(得分:6)
您要找的是this
- allowDeferredLocationUpdatesUntilTraveled:timeout:
如果您的应用位于后台,系统可以进行优化 它的用电量,位置管理员告诉GPS硬件存储 内部的新位置,直到指定的距离或超时 条件得到满足。满足一个或两个标准时,位置 经理通过致电来结束递延的地点 locationManager:didFinishDeferredUpdatesWithError:其方法 委托并将缓存的位置传递给 locationManager:didUpdateLocations:method。
离;
[locationManager allowDeferredLocationUpdatesUntilTraveled:100.0f timeout:CLTimeIntervalMax];
所以基本上它会通过在特定时间之后将位置更新作为位置集合发送而不是每次设备注册移动时触发位置更新回调来节省一些处理能力。
您可以通过以下回调方法接收位置更新;
-(void)locationManager:(CLLocationManager *)manager didFinishDeferredUpdatesWithError:(NSError *)error