8

我正在开发 iOS 跟踪器。即使应用程序不在前台,它也必须运行并接收位置,即我使用后台模式“位置更新”。但是,如果可能的话,最好保护电池。特别是,如果设备不移动,则无需接收位置。

  • 我试图设置distanceFilteronCLLocationManager实例,但它并没有节省电力,它只是减少了位置更新的数量。
  • 我无法手动停止和启动位置管理器,因为如果在后台,应用程序将被暂停。
  • 我尝试使用pausesLocationUpdatesAutomatically设置为YES(默认打开)的位置管理器,但如果应用程序处于后台并且位置更新已暂停,则应用程序将暂停并且即使设备再次开始移动也不会唤醒。

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

4

2 回答 2

16

使用 Laky 提到的“延迟位置更新”可能是为必须在后台运行且不能暂停的应用程序节省电量的唯一可能方法。我只是想总结一下我在尝试此功能时所学到的知识:

  • 可以禁止暂停应用程序,即pausesLocationUpdatesAutomatically可以将属性设置为NOon instance ofCLLocationManager并且延迟的位置更新无论如何都会起作用。

  • 当调用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 个小时。

于 2015-09-07T08:05:59.517 回答
6

你要找的是这个

- allowDeferredLocationUpdatesUntilTraveled:timeout:

如果您的应用程序在后台并且系统能够优化其电源使用,则位置管理器会告诉 GPS 硬件在内部存储新位置,直到满足指定的距离或超时条件。当满足一个或两个条件时,位置管理器通过调用其委托的 locationManager:didFinishDeferredUpdatesWithError: 方法结束延迟位置,并将缓存的位置传递给 locationManager:didUpdateLocations: 方法。

前任;

[locationManager allowDeferredLocationUpdatesUntilTraveled:100.0f timeout:CLTimeIntervalMax];

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

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

-(void)locationManager:(CLLocationManager *)manager didFinishDeferredUpdatesWithError:(NSError *)error
于 2015-08-24T12:05:00.643 回答