首页 > 解决方案 > Xamarin - IOS - CLLocationManager - 手机进入睡眠状态时计时器停止

问题描述

我有一个在后台使用 CLLocationManager 的应用程序。它按预期工作。我正在尝试多种方法来优化电池,因为它需要提供接近实时的位置更新。我知道当 CLLocationManager 配置为在后台工作时,每次发生位置更新时我的应用都会唤醒。

所以我正在考虑做这样的事情:当位置更新到达并且我的事件处理程序被调用时,我处理位置,停止位置更新并开始一个计时器,它将在 15 秒后再次启动位置更新。

只要手机没有休眠或应用程序在后台,这效果就很好。当手机进入睡眠状态时,计时器停止。有没有办法避免这种情况?我在想,也许当我停止位置更新时,IOS 认为该应用程序不再允许在后台运行,因此它停止所有代码执行,但实际上我不知道发生了什么。有人有线索吗?

编辑:我已经测试了 Michal 的以下解决方案,它就像一个魅力。即使定时器在 15 秒内过去,对电池的影响也很大。我的应用曾经在几个小时内消耗 50% 的电量。现在它甚至不消耗5%。

这是我使用的顺序:

  1. 创建一个 LocationManager 并将其设置为在后台以最佳精度工作
  2. 当第一个 GPS 定位到达时,将精度设置为 3 公里并启动一个计时器,该计时器在 15 秒内经过
  3. 当计时器滴答作响时,将精度设置回最佳并将所有接收到的位置上传到服务器。

标签: iosxamarintimercllocationmanager

解决方案


查看 Apple 文档的这一页:pausesLocationUpdatesAutomatically。它描述了您可以暂停位置更新然后恢复它。它仍然没有解决您的问题,然后还有一个附加说明:

对于具有使用中授权的应用程序,暂停位置更新会结束对位置更改的访问,直到应用程序再次启动并能够重新启动这些更新。如果您不希望完全停止位置更新,请考虑禁用此属性并将位置准确度更改为 kCLLocationAccuracyThreeKilometers 当您的应用程序移动到后台时。这样做可以让您继续以省电的方式接收位置更新。

也许您可以使用此技巧并执行以下操作:

1) 首先根据您的实际需要设置精度(NearestTenMeters

2)当位置更新到来时,处理它,将位置精度设置为ThreeKilometers,然后设置一个 15 分钟的计时器,之后您应该将精度更改回 NearestTenMeters


推荐阅读