我正在研究 RunKeeper 的 Breeze iOS 应用程序如何一直在后台运行。我们正在构建一些类似的东西(使用步骤数据,但用它做其他事情),我需要每隔几分钟对传入的数据进行一次简短的处理。
我注意到了一些事情。
Breeze 注册以下后台模式:
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>location</string>
<string>remote-notification</string>
</array>
起初我以为他们可能正在使用静默通知定期让应用程序恢复活力,但似乎系统会保持静默通知,除非设备已插入,因此限制了它在此应用程序中的使用。
在 Breeze 应用程序下的电池使用区域中显示背景位置。我们已经设置了后台位置更新,这在一段时间内效果非常好,但系统最终会暂停该应用程序。我们还设置了重要的位置更新,但这最多每 20 分钟左右让我们回来一次,如果有的话。然后我们在片刻之后再次被暂停。这对那个 API 是有意义的。
我注意到的另一件有趣的事情是,如果您从任务列表中手动终止 Breeze 应用程序,您会立即收到一条本地通知,告诉您重新启动该应用程序。也许这是来自 applicationWillTerminate,但是如果系统挂起应用程序,它会被调用吗?
最佳答案
科里,
我是 Breeze 的一名工程师,我可以让您深入了解它的工作原理。 Breeze 不会在后台连续运行,但它确实会通过您上面列出的所有方法(定位、后台获取和静默推送)频繁唤醒。
后台定位(关闭自动暂停)将使您几乎可以在后台连续执行,但由于 CPU 永远无法休眠,因此电池成本很高。我不会推荐它!
Breeze 允许自动暂停,并且当它积极使用“最佳”准确度的位置数据时,它还采用延迟更新。我们使用重要的位置更新只是因为需要重大位置更改才能在后台启动/停止标准位置服务的错误/缺点。当我们使用重要的位置服务时(通常在您静止一段时间后),我们会使用区域监控(地理围栏)再次触发更准确的位置数据。当应用程序被定位服务唤醒时,它会检查来自 M7 的运动数据,以确定应如何调整定位服务(以及其他高耗电事件)。
其次,我们使用后台获取来唤醒应用程序,执行相同的运动数据检查。后台提取全天进行,您可以指定提取之间的时间间隔,但这并不能保证。 Breeze 主要使用最小间隔,但有自己的速率限制,因此每次唤醒时都不会执行大量工作。当手机处于唤醒状态时(并且通常在用户打开手机并正在做其他事情时),后台获取会更频繁地发生。
正如您所注意到的,最终的应用程序唤醒是静默推送。这本质上是一种回退,如果我们的服务器有一段时间没有收到客户端应用程序的消息,将使用静默推送来唤醒应用程序。我们的经验不是静默推送仅交付给插入的应用程序,但它们肯定不能保证可靠。
applicationWillTerminate 本地通知主要用于 iOS7 的故障保护,通过任务列表终止应用程序将阻止它接收静默推送通知。我相信iOS8不再是这种情况。
感谢您对 Breeze 的关注,这是一款非常有趣的产品!
关于ios - RunKeeper 的 Breeze 应用程序如何在后台保持运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28326446/