CLLocationManager 运行 在后台和省电

CLLocationManager running in background & power saving

我正在研究 iOS 示踪剂。即使应用程序不在前台,它也必须 运行 并接收位置,即我使用后台模式 "Location updates"。但是,如果可能的话,最好保护电池。特别是,如果设备不移动,则无需接收位置。

当我需要在后台获取位置时,有没有办法节省电量?标志 pausesLocationUpdatesAutomatically 非常接近我正在寻找的东西,但在后台暂停应用程序对我来说是一个表演障碍。

你要找的是this

- allowDeferredLocationUpdatesUntilTraveled:timeout:

If your app is in the background and the system is able to optimize its power usage, the location manager tells the GPS hardware to store new locations internally until the specified distance or timeout conditions are met. When one or both criteria are met, the location manager ends deferred locations by calling the locationManager:didFinishDeferredUpdatesWithError: method of its delegate and delivers the cached locations to the locationManager:didUpdateLocations: method.

例如;

[locationManager allowDeferredLocationUpdatesUntilTraveled:100.0f timeout:CLTimeIntervalMax];

所以基本上它会通过在特定时间后将位置更新作为位置集合发送而不是每次设备注册移动时都触发位置更新回调来节省一些处理能力。

并且您可以通过以下回调方法接收位置更新;

-(void)locationManager:(CLLocationManager *)manager didFinishDeferredUpdatesWithError:(NSError *)error

使用 Laky 提到的 "deferred location updates" 可能是为必须 运行 在后台且不能暂停的应用程序节省电量的唯一可能方法。我只想总结一下我在试验这个功能时学到的东西:

  • 暂停应用程序是不允许的,即 属性 pausesLocationUpdatesAutomatically 可以在 CLLocationManager 实例上设置为 NO 并延迟位置更新无论如何都会工作。

  • 调用allowDeferredLocationUpdatesUntilTraveled: timeout:时必须指定一些距离和一些超时作为参数。如果您提供的值太低,该功能将不会生效。 80 秒的超时时间太短,90 秒就可以了。 90米的距离太低了,100米就OK了。 (在 iPhone 5、iOS 8.4.1 上测试)

  • 我不确定如果应用程序仅在后台运行,此功能是否生效。到目前为止我还没有观察到它。但是锁屏后可以生效

  • 该功能不会在锁屏后立即生效。你必须等一会儿。我的观察是 30 - 150 秒。

  • 有时系统有时不会批量发送位置更新。我的测试应用程序 运行 在屏幕锁定的情况下在后台运行了 13 个小时,其中 38% 的时间是一个接一个地接收位置信息。在 运行 的剩余 62% 时间里,它只收到了一批位置(至少包含两个元素的集合)。设备根本没动

  • 如果设备通过对接电缆连接到 Mac 和调试器中的应用 运行s,该功能将不会生效。

  • 并非所有设备都支持此功能,例如iPhone 4 或 iPad 2.

  • 不支持它
  • 我做了一些测量来测试节省了多少电量。我 运行 iPhone 5,iOS 8.4.1 上的一个应用程序在后台锁定屏幕。该应用程序仅启动 CLLocationManager 并保存有关接收到的位置数据的统计信息(使用 NSUSerDefaults),以便您可以在下次应用程序启动时查看。 Wifi 连接已禁用,蜂窝数据已启用。电池已充满电,没有其他应用正在 运行ning。设备没有移动,它被放置在有 GPS 信号的地方。通过延迟位置更新(最小距离 900 米和超时 90 秒),电池在 15.25 小时内完全耗尽。没有延迟位置更新,需要 13 个小时。