正确使用HKObserverQuery的后台更新completionHandler

HKObserverQuery有以下支持在后台接收更新的方法:

 - initWithSampleType:predicate:updateHandler: 

updateHandler有一个completionHandler ,它有以下文档 :

这个块被传递给更新处理程序。 处理传入数据后,您必须立即调用此块。 调用此块告诉HealthKit您已经成功接收到背景数据。 如果您不调用此块,HealthKit将继续尝试使用退出algorithm启动您的应用程序。 如果您的应用程序未能响应三次,HealthKit会假定您的应用程序无法接收数据,并停止向您发送后台更新。

从看其他post看来,围绕这个处理程序有很多困惑。 以下是我对它的一些问题:

  • 什么时候该处理程序被叫? 如果调用时间太晚,HK可能会认为该应用程序从未收到查询更新,导致您点击后台更新3-strike back-offalgorithm。 该文档指出,应该在处理其他查询之后调用它。 根据运行这些查询需要多长时间,这听起来像你可以危险地接近后台更新罢工。
  • 为什么这需要? 系统不知道该应用程序已经启动,并已收到后台更新? 当在后台使用CoreBluetooth时,它CoreBluetooth在后台将您的应用程序唤醒10秒。 无需调用任何处理程序或处理后台更新3 – 罢工。
  • 如果你点击后台更新3-strike,香港停止发送更新是永久的? 香港有没有开始发送后台更新? 如果有一个错误,阻止处理程序被调用,现在你已经修复它。 该应用程序卡住从未收到更新? 或者当应用程序重新启动或更新时重置?
  • 香港是否让您的应用程序在后台运行,直到处理程序被调用? 这是其目的还是仅仅是一个副作用? 如果这是其目的的一部分,我们可以运行多长时间才能停止(并击中第一次后台更新)?

Interesting Posts