我想使用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