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