ios - Xamarin - IOS - CLLocationManager - 手机进入睡眠状态时计时器停止
问题描述
我有一个在后台使用 CLLocationManager 的应用程序。它按预期工作。我正在尝试多种方法来优化电池,因为它需要提供接近实时的位置更新。我知道当 CLLocationManager 配置为在后台工作时,每次发生位置更新时我的应用都会唤醒。
所以我正在考虑做这样的事情:当位置更新到达并且我的事件处理程序被调用时,我处理位置,停止位置更新并开始一个计时器,它将在 15 秒后再次启动位置更新。
只要手机没有休眠或应用程序在后台,这效果就很好。当手机进入睡眠状态时,计时器停止。有没有办法避免这种情况?我在想,也许当我停止位置更新时,IOS 认为该应用程序不再允许在后台运行,因此它停止所有代码执行,但实际上我不知道发生了什么。有人有线索吗?
编辑:我已经测试了 Michal 的以下解决方案,它就像一个魅力。即使定时器在 15 秒内过去,对电池的影响也很大。我的应用曾经在几个小时内消耗 50% 的电量。现在它甚至不消耗5%。
这是我使用的顺序:
- 创建一个 LocationManager 并将其设置为在后台以最佳精度工作
- 当第一个 GPS 定位到达时,将精度设置为 3 公里并启动一个计时器,该计时器在 15 秒内经过
- 当计时器滴答作响时,将精度设置回最佳并将所有接收到的位置上传到服务器。
解决方案
查看 Apple 文档的这一页:pausesLocationUpdatesAutomatically。它描述了您可以暂停位置更新然后恢复它。它仍然没有解决您的问题,然后还有一个附加说明:
对于具有使用中授权的应用程序,暂停位置更新会结束对位置更改的访问,直到应用程序再次启动并能够重新启动这些更新。如果您不希望完全停止位置更新,请考虑禁用此属性并将位置准确度更改为 kCLLocationAccuracyThreeKilometers 当您的应用程序移动到后台时。这样做可以让您继续以省电的方式接收位置更新。
也许您可以使用此技巧并执行以下操作:
1) 首先根据您的实际需要设置精度(NearestTenMeters)
2)当位置更新到来时,处理它,将位置精度设置为ThreeKilometers,然后设置一个 15 分钟的计时器,之后您应该将精度更改回 NearestTenMeters
推荐阅读
- excel - 将至少具有某些值的单元格分组
- python - 我将如何制作一个可以在 Python 中存储用户输入的字典?
- c# - 通过 c# .net 更新 excel 值,允许 excel 计算值
- assembly - GCC ARM 乘法优化
- unity3d - 如何使用着色器裁剪 WebcamTexture?
- ruby-on-rails - 允许访问子域上的一个页面,如果尝试访问其他页面重定向到主域
- google-cloud-platform - Google Cloud Storage 存储桶抛出错误“要计费的项目与已关闭的计费帐户相关联。”
- python - 如何在Python中的两个字符串之间拆分每个单独的值
- java - 如何在微服务的多个实例之间维护 SseEmitters 列表?
- laravel - Laravel:使用 Faker 播种嵌套的设置表