查询实时心率变异性和心率值



我正在尝试从Apple Watch中读出实时心率+心率变异性数据。 我能够读取心率值,但不知道如何实现 HRV 的读取。我可以同时读出它们吗?

class HealthKitManager {
private var healthStore = HKHealthStore()
private var heartRateQuantity = HKUnit(from: "count/min")
private var heartRateVariability = HKUnit(from: "count/min")
private var activeQueries = [HKQuery]()
@Published var heartRateValues = HeartRateValues()
func autorizeHealthKit() {
let heartRate = HKObjectType.quantityType(forIdentifier: .heartRate)!
let heartRateVariability = HKObjectType.quantityType(forIdentifier: .heartRateVariabilitySDNN)!
let HKreadTypes: Set = [heartRate, heartRateVariability]
healthStore.requestAuthorization(toShare: nil, read: HKreadTypes) { (success, error) in
if let error = error {
print("Error requesting health kit authorization: (error)")
}
}
}
func fetchHeartRateData(quantityTypeIdentifier: HKQuantityTypeIdentifier ) {
let devicePredicate = HKQuery.predicateForObjects(from: [HKDevice.local()])
let updateHandler: (HKAnchoredObjectQuery, [HKSample]?, [HKDeletedObject]?, HKQueryAnchor?, Error?) -> Void = {
query, samples, deletedObjects, queryAnchor, error in
guard let samples = samples as? [HKQuantitySample] else {
return
}
self.process(samples, type: quantityTypeIdentifier)
}
let query = HKAnchoredObjectQuery(type: HKObjectType.quantityType(forIdentifier: quantityTypeIdentifier)!, predicate: devicePredicate, anchor: nil, limit: HKObjectQueryNoLimit, resultsHandler: updateHandler)
query.updateHandler = updateHandler
healthStore.execute(query)
activeQueries.append(query)
}
private func process(_ samples: [HKQuantitySample], type: HKQuantityTypeIdentifier) {
for sample in samples {
if type == .heartRate {
DispatchQueue.main.async {
self.heartRateValues.heartRate = sample.quantity.doubleValue(for: self.heartRateQuantity)
}
} 
// Not Sure about this part and readings show 0.0
else if type == .heartRateVariabilitySDNN {
DispatchQueue.main.async {
self.heartRateValues.heartRateVariability = sample.quantity.doubleValue(for: self.heartRateVariability)
}
}
}
}
func stopFetchingHeartRateData() {
activeQueries.forEach { healthStore.stop($0) }
activeQueries.removeAll()
DispatchQueue.main.async {
self.heartRateValues.heartRate = 0.0
self.heartRateValues.heartRateVariability = 0.0
}
}
}

这里提出了一个类似的问题,但没有得到答案: 获取 Apple Watch 心脏速率可变性 SDNN 实时?

我也设法获得了小时读数,只是添加了:

private func process(_ samples: [HKQuantitySample], type: HKQuantityTypeIdentifier) {
for sample in samples {
if type == .heartRate {
DispatchQueue.main.async {
self.heartRateValues.heartRate = sample.quantity.doubleValue(for: self.heartRateQuantity)
}
} else if type == .heartRateVariabilitySDNN {
DispatchQueue.main.async {
self.heartRateValues.heartRateVariability = sample.quantity.doubleValue(for: self.heartRateVariabilityQuantity)
}
}
}
}

然后调用该类:

fetchHeartRateData(quantityTypeIdentifier: .heartRate)
fetchHeartRateData(quantityTypeIdentifier: .heartRateVariabilitySDNN)

问题仍然是 HRV 值读取一次,并且不会随着时间的推移而改变。有什么想法吗?

最新更新