ios - CoreMotion 在后台更新

标签 ios core-location core-motion apple-m7

借助最新 iOS 设备中的 M7 芯片,当用户使用 CMMotionActivityManager 从静止状态变为运行、步行等状态时,可以通过编程方式获得通知。 Stava 和 Runkeeper 都用它来 auto-pause GPS polling (关闭 GPS 天线)当它检测到用户没有通过 M7 移动时,然后在他们再次移动时重新启用 GPS 更新。它能够在应用程序处于后台状态时执行此操作,这是这里的关键。

我在复制此功能时遇到的问题是,如果我在我的应用程序处于后台时关闭 GPS 更新,我将停止接收事件更新,并且无法再检测到用户何时通过 M7 再次移动以打开 GPS回来。

如果我让 GPS 始终处于运行状态,我将在应用处于后台的整个过程中继续从 Core Motion 获取运动更新。

我假设他们不是在玩白噪音或其他一些廉价的技巧来保持活跃。他们是怎么做到的?

最佳答案

RunKeeper 实际上确实使用音频技巧来保持清醒。如果你打开应用程序包并检查他们的 Info.plist,你会看到它注册了背景音频模式。这就是他们如何定期发出关于您的距离、速度和配速的音频通知。这也是他们如何在您运行期间保持清醒,同时最大限度地减少电池消耗。

如果您注意到在使用 RunKeeper 时位置服务图标(状态栏中的三角形)完全消失,那么他们肯定没有使用任何类型的位置跟踪来完成后台执行。即使激活地理围栏和重要的位置变化监控也会导致位置服务图标出现。

他们也不使用 M7 来保持清醒,因为它不能那样工作。来自 M7 相关 CoreMotion API 的更新不会将您的应用程序从 sleep 中唤醒。当他们的应用程序确实唤醒时,他们将能够查询运动事件和步数历史记录,并可能尝试计算一些东西,但我怀疑它是否那么准确。

最后您应该注意到,自动暂停 API 是在 iPhone 5s 和 M7 芯片发布之前的 iOS 6 中引入的。它们是正交的概念。

关于ios - CoreMotion 在后台更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20083032/

相关文章:

ios - 在 Swift 中为 mapView 上的每个注释显示不同的图像

iOS:使用 "malloc"自动释放分配的内存?

iOS 标准定位服务 vs 显着变化定位服务 vs 区域监控

iphone - CLLocationManager 地理编码地址字符串 :inRegion not working to constrain region (ios5)

ios - 是否可以将 SKScene 与 UIView Controller 一起使用?

iphone - 无法从 iphone 照片库中保存 UIImage

ios - Xcode 两个项目——一个用于业务逻辑,另一个用于 UI?

ios - 在 Swift 中定位用户位置

iOs 8、核心运动和骑行事件