【问题标题】:HKObserverQuery, background updates and privacy policyHKObserverQuery、后台更新和隐私政策
【发布时间】:2016-04-15 21:44:45
【问题描述】:

我正在尝试使用 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 或类似应用的解决方法吗?

非常感谢。

【问题讨论】:

    标签: ios swift healthkit


    【解决方案1】:

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

    【讨论】:

    • 这就是我的设想,所以我将实现一种使用 BTLE 从传感器获取节拍的方法。谢谢!
    • 我对 BLE 的体验是,在后台执行一定时间后,与设备的连接会丢失。大约后。在后台运行 4 小时 iOS 将通过您的 BLE 连接终止应用程序,从而导致不再有显示器更新。您是否有更可靠的 BLE 连接体验?
    猜你喜欢
    • 1970-01-01
    • 2013-11-10
    • 2019-10-11
    • 2018-06-08
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    相关资源
    最近更新 更多