【发布时间】:2013-12-03 16:24:31
【问题描述】:
借助最新 iOS 设备中的 M7 芯片,用户可以使用 CMMotionActivityManager 在用户从静止状态变为跑步、步行等时以编程方式获得通知。当它检测到用户没有通过 M7 移动时,Stava 和 Runkeeper 都使用它来auto-pause GPS polling(关闭 GPS 天线),然后在他们再次移动时重新启用 GPS 更新。它能够在应用程序处于后台状态时执行此操作,这是这里的关键。
我在复制此功能时遇到的问题是,如果我在我的应用程序处于后台时关闭 GPS 更新,我将停止接收活动更新,并且无法再检测到用户何时再次通过 M7 移动以打开 GPS重新开始。
如果我让 GPS 一直运行,我将在应用程序处于后台的整个时间里继续从 Core Motion 获取运动更新。
我假设他们没有玩白噪声或其他廉价技巧来保持活跃。他们是怎么做到的?
【问题讨论】:
-
见this answer。将
desiredAccuracy设置为 3 公里会关闭 GPS,但应用程序会继续运行。 -
@progrmr 试了一下 - GPS 指示器在 3k 处保持活动状态。 Runkeeper 和 Strava 都会在静止时关闭 GPS 指示器(这几乎意味着调用 stopUpdatingLocation)。他的方法似乎只依赖于 3k = cell-tower 轮询。但是 3k 并不能保证只有小区,而且在弱小区位置,这仍然是我想避免的消耗。
-
这有点棘手,但我想象一个三元组解决方案。如果您使用 beginBackgroundTaskWithName:expirationHandler 和 backgroundTimeRemaining 检查来自 CoreMotion 的 UIAccelerometer 数据,并在出现前向运动的事件时重新激活 GPS,或者在 backgroundTimeRemaining 或 significationLocationChange 终止时重新激活 GPS 会怎样?
-
@Parrots..@Jan 你找到什么了吗?我正在寻找同样的东西。
标签: ios core-location core-motion apple-m7