我制作了一个简单的watchOS应用程序,用于运行会话和监测心率变异性(sdnn(。在模拟器上跑步,我成功地获得了其他p,如距离、心率或卡路里,但没有获得sdnn。
以下是我设置WorkoutManager的方法:
func workoutBuilderDidCollectEvent(_ workoutBuilder: HKLiveWorkoutBuilder) {
//
}
func workoutBuilder(_ workoutBuilder: HKLiveWorkoutBuilder, didCollectDataOf collectedTypes: Set<HKSampleType>) {
for type in collectedTypes{
print(type)
guard let quantityType = type as? HKQuantityType else {return}
let statistics = workoutBuilder.statistics(for: quantityType)
updateForStatistics(statistics)
}
}
}
这篇文章是实时获取数据的:
func updateForStatistics(_ statistics: HKStatistics?) {
guard let statistics = statistics else { return }
DispatchQueue.main.async {
switch statistics.quantityType {
case HKQuantityType.quantityType(forIdentifier: .heartRate):
let heartRateUnit = HKUnit.count().unitDivided(by: HKUnit.minute())
self.heartRate = statistics.mostRecentQuantity()?.doubleValue(for: heartRateUnit) ?? 0
self.averageHeartRate = statistics.averageQuantity()?.doubleValue(for: heartRateUnit) ?? 0
case HKQuantityType.quantityType(forIdentifier: .activeEnergyBurned):
let energyUnit = HKUnit.kilocalorie()
self.activeEnergy = statistics.sumQuantity()?.doubleValue(for: energyUnit) ?? 0
case HKQuantityType.quantityType(forIdentifier: .distanceWalkingRunning), HKQuantityType.quantityType(forIdentifier: .distanceCycling):
let meterUnit = HKUnit.meter()
self.distance = statistics.sumQuantity()?.doubleValue(for: meterUnit) ?? 0
case HKQuantityType.quantityType(forIdentifier: .heartRateVariabilitySDNN):
let sdnnUnit = HKUnit.count()
self.sdnn = statistics.mostRecentQuantity()?.doubleValue(for: sdnnUnit) ?? 0
default:
return
}
}
}
如前所述,除了sdnn之外,所有其他p都在通过WatchOS进行模拟——在这里我总是没有得到任何数据。
此外,我知道如何通过HKQuantitySample编写自己的sdnn值,但需要OS在会话期间跟踪的特定值。或者一些变通方法,迫使操作系统为我保存这个。
有什么想法吗?
ssdUnit应为HKUnit(from: "ms")
不幸的是,您无法访问heartRateVariabilitySDNN参数,因为它不是在锻炼期间测量的。然而,你可以在正念应用中使用Breathe练习手动触发HRV的测量