首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HKObserverQuery、背景更新和隐私策略

HKObserverQuery、背景更新和隐私策略
EN

Stack Overflow用户
提问于 2016-04-15 21:44:45
回答 1查看 406关注 0票数 1

我正在尝试使用HealthKit API编写一个心率监控器。

我有一个极地H7,它正在将数据写入健康商店。我实现了使用HKObserverQuery (不缺少对completionHandler()的调用)、HKSampleQuery和为正在查询的类型调用HKHealthStore.enableBackgroundDeliveryForType启用后台更新的目标。

代码语言:javascript
复制
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)
}

但是当应用程序转到后台或者我锁定手机(即时密码)时,应用程序就会停止接收更新。

阅读文档我看到:

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

然而,当我使用Runstastic时,当我改变心脏区时,我会收到声音提示;Nike+Running以相同的方式跟踪所有的心率。那隐私政策怎么可能呢?

我有点迷路了,文档对接收背景/锁定更新(如果可能的话)有些困惑。我在这里读到了所有相关的答案,但没有人是结论性的,而拥有更多信息的谈到了背景获取,这在文档中没有提到。

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

非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-16 23:51:29

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36657328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档