我试图让我的应用程序在观察到新数据输入时将HealthKit数据与我们的数据库同步。 Despite some ambiguity in the logic我相信我已成功为样本类型启用了后台投放,并让观察者在需要时做出反应。
但是,在观察者的updatehandler中,我需要创建一个HKAnchoredObjectQuery
来获取HealthKit的最新结果,但是当我的应用在后台运行时,这些查询无法可靠地返回。通常当我在HealthKit中添加样本点时,锚定的查询只会被执行,但只有当我将应用程序带回前台时它们才会返回。
其他时候他们立即返回,而我不必激活应用程序。一个可能的问题是我的所有观察者查询都会触发其updatehandler,从而创建多个可能返回或不返回的AnchoredObjectQueries。我在链接的帖子中进一步解释了,因为它可能是无关的。
这是我从HKObserverQuery的updatehandler调用的函数示例:
func synchronizeRecentData(sampleType: HKSampleType, observerQuery: HKObserverQuery) {
let completionHandler: (HKAnchoredObjectQuery, [HKSample]?, Int, NSError?) -> Void = {
[unowned self] query, results, newAnchor, error in
if error != nil {
abort()
}
// Update queryAnchor
self.queryAnchors[sampleType] = newAnchor
guard let receivedNewSamples = results as? [HKQuantitySample] else {
abort()
}
// Handle received samples here
}
let query = HKAnchoredObjectQuery(type: sampleType,
predicate: nil,
anchor: self.queryAnchors[sampleType]!,
limit: HKObjectQueryNoLimit,
completionHandler: completionHandler)
healthKitStore.executeQuery(query)
}
答案 0 :(得分:1)
根据HealthKit文档:
与观察者查询不同,这些更新包括项目列表 已被添加或删除;但是,锚定对象查询不能 注册后台交付。有关更多信息,请参阅 HKAnchoredObjectQuery
可以注册后台投放的唯一查询是HKObserverQuery
答案 1 :(得分:0)
我相信这是因为当您的应用在后台被唤醒时,您在应用再次暂停之前执行的时间非常有限。如果您使用UIBackgroundTaskIdentifier,您应该能够确保您的应用程序运行足够长的时间来完成获取HKAnchoredObjectQuery的结果。