我正在尝试使用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或类似的应用程序可以解决此问题吗?

非常感谢。

最佳答案

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

关于ios - HKObserver查询,后台更新和隐私政策,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36657328/

10-12 13:36