HKObserverQuery,后台更新和隐私政策

时间:2016-04-15 21:44:46

标签: ios swift health-kit

我正在尝试使用HealthKit API编程心率监测器。

我有一个Polar H7,它正在将数据写入Health商店。我使用HKObserverQuery(没有遗漏调用completionHandler()),HKSampleQuery并启用后台更新来实现我的目标,为我查询的类型调用HKHealthStore.enableBackgroundDeliveryForType

private func queryForHeartRate() {

    guard let sampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate) else {
        executeCompletionHandler(value: nil, error: nil)
        return
    }

    let observerQuery = HKObserverQuery(sampleType: sampleType, predicate: nil) { [unowned self] query, completionHandler, error in

        guard error == nil else {
            self.executeCompletionHandler(value: nil, error: error)
            return
        }

        self.queryHeartRateSample(sampleType)
        completionHandler()
    }

    healthStore.executeQuery(observerQuery)
}

private func queryHeartRateSample(sampleType: HKSampleType) {

    let timeSortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false)
    let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: nil, limit: 1, sortDescriptors: [timeSortDescriptor], resultsHandler: { [unowned self] (sampleQuery, results, error) in

        guard error == nil else {
            self.executeCompletionHandler(value: nil, error: error)
            return
        }

        guard let samples = results as? [HKQuantitySample] where !samples.isEmpty else {
            self.executeCompletionHandler(value: nil, error: error)
            return
        }

        guard let lastSample = samples.last else {
            self.executeCompletionHandler(value: nil, error: error)
            return
        }

        let heartBeat = lastSample.quantity.doubleValueForUnit(self.heartBeatsPerMinuteUnit)
        self.executeCompletionHandler(value: heartBeat, error: nil)
    })

    healthStore.executeQuery(sampleQuery)
}

但是,当应用程序进入后台或我锁定手机(即时密码)时,应用程序将停止接收更新。

阅读docs我看到了:

  

HealthKit数据仅保存在用户设备的本地。为安全起见,HealthKit存储在设备锁定时加密。 HealthKit商店只能由授权的应用程序访问。因此,当您的应用在后台启动时,您可能无法从商店中读取数据;但是,即使手机被锁定,应用仍然可以将数据写入商店。 HealthKit会暂时缓存数据,并在手机解锁后立即将其保存到加密存储中

但是,当我使用Runstastic时,我会在改变心脏区域时收到声音建议; Nike + Running以同样的方式跟踪所有心率。如何通过该隐私政策实现这一目标?

我有点迷失,文档有点混淆接收后台/锁定更新所需的内容(如果可能)。我在SO中阅读了所有相关的答案,但没有人是决定性的,而有更多信息的那个this,讲的是背景提取,文档中没有提到的事情。

是否有任何资源或教程如何实现这一目标?甚至可能吗?有Runtastic或类似的应用程序解决此问题吗?

非常感谢你。

1 个答案:

答案 0 :(得分:1)

当设备被锁定时,您的应用无法接收HealthKit数据,因为此时数据已加密且无法访问。在设备锁定时响应心率变化的其他应用很可能直接从BT心率监测器读取数据,而不是HealthKit。