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