我想使用HealthKit API编程心率监视器。HKObserverQuery,后台更新和隐私政策
我有一个极地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)
}
但是,当应用程序被切换到后台或者我锁定手机(即时密码)的应用程序停止接收更新。
读docs我看到:
的HealthKit数据仅在用户的设备上本地保存。为了安全起见,HealthKit商店在设备被锁定时被加密。 HealthKit商店只能由授权的应用访问。因此,当您的应用在后台启动时,您可能无法从商店读取数据;不过,应用程序仍然可以将数据写入商店,即使手机已锁定。 HealthKit暂时缓存数据,并将其尽快手机被解锁
但是保存到数据存储库中,当我使用Runstastic,我收到的时候我改变心脏地带声音建议; Nike + Running以同样的方式跟踪所有心率。这个隐私政策怎么可能?
我有点迷路了,文档有点混淆了需要什么来接收背景/锁定更新(如果可能)。我在这里阅读了所有相关的答案,但没有一个是确凿的,而具有更多信息的那个,this提到了后台提取,这是文档中未提及的东西。
是否有任何资源或教程如何实现这一目标?甚至有可能吗?有Runtastic或类似的应用程序解决方法吗?
非常感谢。
这就是我所假设的,所以我会实现一种方法来使用BTLE从传感器获取节拍。 谢谢! – emenegro
我对BLE的经验是,在一定的后台执行时间之后,连接到设备的连接会丢失。约。在后台4小时iOS将终止与您的BLE连接的应用程序,导致没有更多的监视器更新。你有更可靠的BLE连接经验吗? – Chris