HKObserverQuery
有以下方法支持在后台接收更新:
- initWithSampleType:predicate:updateHandler:
updateHandler
有一个completionHandler
,它有以下文档:
此块被传递给更新处理程序。您必须调用此块一旦处理完传入数据。正在调用此block告诉HealthKit您已成功收到背景数据。如果您不调用此块,HealthKit将继续尝试使用退避算法启动您的应用程序。如果您的应用程序未能响应三次,HealthKit认为您的应用程序无法接收数据,并停止向您发送后台更新。
从其他帖子来看,围绕这个处理程序似乎有很多困惑。以下是我对它的一些问题:
- 什么时候应该调用处理程序?如果打得太晚,那么HK可能会认为该应用程序从未收到查询更新,导致您使用后台更新3-trikes后退算法。文档指出,应该在处理其他查询之后调用它。根据运行这些查询所需的时间,听起来你可能会危险地接近后台更新
- 为什么需要这样做?难道系统不应该知道应用程序已经启动并收到后台更新吗?当在后台使用
CoreBluetooth
时,它只会在后台唤醒您的应用程序10秒。无需调用任何处理程序或处理后台更新3-strikes - 如果你点击3次后台更新,HK停止发送更新,这是永久的吗?香港是否再次开始发送后台更新?如果有一个错误阻止调用处理程序,现在你已经修复了它,该怎么办?应用程序是否一直无法接收更新?或者,当应用程序重新启动或更新时,它会重置吗
- 在调用处理程序之前,HK是否一直在后台运行您的应用程序?这是其目的的一部分还是只是副作用?如果这是其目的的一部分,我们可以运行多久才能停止(并达到第一次后台更新罢工)
何时应该调用处理程序?
完成工作后再打电话。您的代码不应该执行复杂的操作。应用程序在后台,用户看不到发生了什么变化。你只需设置一个"标志",即用户启动应用程序后,数据会被更新并进行复杂的操作。如果您的决定通知了用户,或者不是基于复杂的操作,那么请尝试重构代码,以便预先计算所有必要的数据(例如,在UserDefaults中),并简单地用这些数据提取额外的数据。所以,1-2秒就足够你计算了。
为什么需要这样做?
所有这样的处理程序都有完成闭包。iOS需要它们来了解您的应用程序是否正常工作。如果你的应用程序占用了太多的CPU时间,那么iOS可能会变慢。因此,苹果希望确保iOS在应用程序不好的情况下运行良好。
如果你点击后台更新三击,HK停止发送更新,这是永久的吗?
否。
香港是否再次开始发送后台更新?
是。但这取决于许多因素。它可能会在1-2天后再次尝试调用您的应用程序。如果没有任何变化,它将很少称之为。
HK是否会让您的应用程序在后台运行,直到调用处理程序为止?
这是未知的。这取决于许多因素。如果iPhone正在充电,它可能会让你的应用程序运行更长时间,只是为了估计是否调用了完成句柄。如果你的iPhone没有充电,电池电量接近0%,那么iOS更有可能会杀死你的应用程序。因此,在调用完完成处理程序之后,不应该再执行任何工作。尽量保持简单。
建议
您应该尽快处理新数据。如果你需要获取大量数据,那么尝试优化它,并在应用程序处于前台时预先计算它,然后保存在某个地方(UserDefault),并使用新数据和缓存的数据来做出决定(例如,通知用户一些事情;我相信你需要后台更新)。
1-2秒或更短的时间是进行后台更新的好时机。