swift - 如何打印我刚刚记录并保存到 Healthkit 商店的 HKQuantity 类型的值?
问题描述
我正在向 HKStore 分享锻炼,我要求阅读以下类型:
let typesToRead: Set = [
HKQuantityType.quantityType(forIdentifier: .heartRate)!,
HKQuantityType.quantityType(forIdentifier: .activeEnergyBurned)!,
HKQuantityType.quantityType(forIdentifier: .distanceWalkingRunning)!
]
在我的锻炼课程课程(跟踪和记录活动锻炼)中,我能够记录实时数据并将其保存到 HealthStore,但我不知道如何读取该数据并将其显示在屏幕上以供用户在那里实时查看锻炼。(或至少在控制台中打印心率、activeEnergyBurned 等数据)。
这是似乎正在共享相关锻炼数据的 HKLiveWorkoutBuilderDelegate
// MARK: HKLiveWorkoutBuilderDelegate
func workoutBuilder(_ workoutBuilder: HKLiveWorkoutBuilder, didCollectDataOf collectedTypes: Set<HKSampleType>) {
for type in collectedTypes {
guard let quantityType = type as? HKQuantityType else {
return // Nothing to do
}
let statistics = workoutBuilder.statistics(for: quantityType)
let typeDescription = type.description
}
}
以下是我的锻炼是如何被激活的:
override func awake(withContext context: Any?) {
super.awake(withContext: context)
configuration.activityType = .running
configuration.locationType = .indoor
do {
session = try HKWorkoutSession(healthStore: healthStore, configuration: configuration)
builder = session.associatedWorkoutBuilder()
} catch {
dismiss()
return
}
// Setup session and builder
session.delegate = self
builder.delegate = self
builder.dataSource = HKLiveWorkoutDataSource(healthStore: healthStore, workoutConfiguration: configuration)
// Start session and builder
session.startActivity(with: Date())
builder.beginCollection(withStart: Date()) { (success, error) in
self.setDurationTimerDate()
}
}
注意:我使用的是苹果新的 Beta WatchOS 5.0
解决方案
您正在做大部分事情,但您还需要启用将数据收集到dataSource
. 在我的应用程序中,我收集距离和心率数据,我这样做:
let dataSource = HKLiveWorkoutDataSource(healthStore: healthStore, workoutConfiguration: configuration)
if let hr = HKQuantityType.quantityType(forIdentifier: .heartRate) {
dataSource.enableCollection(for: hr, predicate: nil)
}
if let distance = HKQuantityType.quantityType(forIdentifier: .distanceWalkingRunning) {
dataSource.enableCollection(for: distance, predicate: nil)
}
workoutBuilder?.dataSource = dataSource
然后我可以用这样的方法打印这些信息HKLiveWorkoutBuilderDelegate
:
func workoutBuilder(_ workoutBuilder: HKLiveWorkoutBuilder, didCollectDataOf collectedTypes: Set<HKSampleType>) {
guard let hrType = HKQuantityType.quantityType(forIdentifier: .heartRate),
let distanceType = HKQuantityType.quantityType(forIdentifier: .distanceWalkingRunning) else {
return
}
if collectedTypes.contains(hrType) {
if let hrQuantity = workoutBuilder.statistics(for: hrType)?.mostRecentQuantity() {
// We want to have BPM
let hrUnit = HKUnit(from: "count/min")
let hr = Int(hrQuantity.doubleValue(for: hrUnit))
debugPrint("HR: \(hr)")
}
}
if collectedTypes.contains(distanceType) {
if let distQuantity = workoutBuilder.statistics(for: distanceType)?.sumQuantity() {
// We want to have total distance in meters
let distance = distQuantity.doubleValue(for: HKUnit.meter())
debugPrint("Distance: \(distance) m")
}
}
}
然后我进入控制台:
"Distance: 6.5 m"
"Distance: 10.4 m"
"HR: 112"
"Distance: 14.3 m"
"HR: 117"
"Distance: 20.8 m"
推荐阅读
- datetime - 如何通过 UWP Xamarin 应用程序获取系统时间设置属性
- mysql - `?` 运算符只能用于返回 `Result` 或 `Option` 的函数(或实现 `std::ops::Try` 的其他类型)
- reactjs - 如何减少 React-redux 代码的大小?
- reactjs - React next.js Tinymce 服务器端渲染
- c - 无法在 libxml2 的源中将输出打印到标准输出
- reactjs - 用于设置值的条件运算符不同步工作?
- java - 以编程方式屏蔽 RecyclerView 中的图像
- powershell - 如何在 PowerShell 脚本中加密/隐藏 ClearText 密码
- laravel - 如何在 HTML 视图中使用 .env.example 常量?
- javascript - 匹配正则表达式中的所有数字,除了短语 foo2020