HKAnchoredObjectQuery在后台无法可靠地返回

时间:2016-06-23 11:21:20

标签: ios swift health-kit

我试图让我的应用程序在观察到新数据输入时将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)
}

2 个答案:

答案 0 :(得分:1)

根据HealthKit文档:

  

与观察者查询不同,这些更新包括项目列表   已被添加或删除;但是,锚定对象查询不能   注册后台交付。有关更多信息,请参阅   HKAnchoredObjectQuery

可以注册后台投放的唯一查询是HKObserverQuery

答案 1 :(得分:0)

我相信这是因为当您的应用在后台被唤醒时,您在应用再次暂停之​​前执行的时间非常有限。如果您使用UIBackgroundTaskIdentifier,您应该能够确保您的应用程序运行足够长的时间来完成获取HKAnchoredObjectQuery的结果。