我正在尝试使用HealthKit API编写一个心率监控器。
我有一个极地H7,它正在将数据写入健康商店。我实现了使用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)
}但是当应用程序转到后台或者我锁定手机(即时密码)时,应用程序就会停止接收更新。
阅读文档我看到:
HealthKit数据仅保存在用户设备上的本地。为了安全起见,当设备被锁定时,HealthKit存储将被加密。HealthKit存储只能被授权的应用程序访问。因此,当应用程序在后台启动时,您可能无法从商店读取数据;然而,应用程序仍然可以将数据写入商店,即使手机被锁定。HealthKit暂时缓存数据,并在手机解锁后将其保存到加密的存储区。
然而,当我使用Runstastic时,当我改变心脏区时,我会收到声音提示;Nike+Running以相同的方式跟踪所有的心率。那隐私政策怎么可能呢?
我有点迷路了,文档对接收背景/锁定更新(如果可能的话)有些困惑。我在这里读到了所有相关的答案,但没有人是结论性的,而拥有更多信息的这谈到了背景获取,这在文档中没有提到。
是否有任何关于如何实现这一目标的资源或教程?甚至有可能吗?运行程序或类似的应用程序可以解决这个问题吗?
非常感谢。
发布于 2016-04-16 23:51:29
当设备被锁定时,应用程序无法接收HealthKit数据,因为数据当时是加密和不可访问的。当设备锁定时,其他响应心率变化的应用程序很可能是直接从BT心率监视器读取数据,而不是从HealthKit读取数据。
https://stackoverflow.com/questions/36657328
复制相似问题