Table of Contents
苹果健康Kit API介绍
在个人健康数据驱动可操作的洞察力的时代,iOS HealthKit API已经成为开发者构建健身和健身应用的基石。苹果公司推出的这个框架为健康和活动信息提供了统一安全的存储库。通过整合HealthKit,您的应用软件可以读到并写到健康应用数据库,让用户能够看到他们的步骤,心率,睡眠分析,饮食记录,甚至临床记录的综合视图。这篇文章探讨了如何利用HalthKit API来有效跟踪和显示健身数据,涵盖许可流程,查询策略,数据可视化,以及生产最佳做法.
理解健康知识的架构
HealthKit围绕两个主要概念组织数据:数据类型和数据对象. 数据类型定义了计量的类别,如或]. 数据对象是实际记录,可以样本(单一的计量或事件],关系(相关样本的组),或[[ 工作流程. 健康 Kit商店在icloud上加密并同步,但只有在用户明确允许健康同步时,每个访问请求都必须通过系统对话框得到用户的授权,确保隐私合规性.
关键部件
- HKHealthStore – 所有HealthKit手术的中央切入点.
- HK对象Type – 识别出一类健康数据(数量,类别,或特征).
- HKSampleQuery – 检索一组固定的存储样本.
- HKS统计查询 – 计算总值(和,平均,分,最大等)在一个时间间隔内.
- HK Observatory – 监视器用于更改指定数据类型,允许背景更新.
设置权限 - 请求访问
在进行数据交换之前, 您的应用程序必须使用 [[FLT: 2]] 请求权限。 您必须在 中用 和 ] 键声明读写权限。 对于健身跟踪, 您通常读取步骤计数、 主动能量、 心率, 并可能写出工作结果 。
import HealthKit
let healthStore = HKHealthStore()
func requestHealthPermissions() {
guard HKHealthStore.isHealthDataAvailable() else { return }
let readTypes: Set<HKObjectType> = [
HKObjectType.quantityType(forIdentifier: .stepCount)!,
HKObjectType.quantityType(forIdentifier: .heartRate)!,
HKObjectType.quantityType(forIdentifier: .activeEnergyBurned)!,
HKObjectType.categoryType(forIdentifier: .sleepAnalysis)!
]
let writeTypes: Set<HKSampleType> = [
HKObjectType.workoutType()
]
healthStore.requestAuthorization(toShare: writeTypes, read: readTypes) { success, error in
// Handle response
}
}
总是优雅地处理授权召回。 如果用户拒绝, 请避免阻断功能; 而不是解释为什么需要数据并提供替代方案( 如手动输入 ) 。 请记住, 权限可以在健康应用程序的源选项卡中稍后更改 。
查询适合性数据
HealthKit提供几种查询类型来高效地获取数据. 健身应用最常用的就是抽样查询和统计查询.
HKSampleQuery – 检索原始数据
使用 [[FLT: 7] , 需要单个记录, 如最后的 100 个心率读数或今天的步数日志。 指定一个上游来按日期、 来源或值过滤。 对于性能, 总是限制返回的结果数量 。
let stepType = HKQuantityType.quantityType(forIdentifier: .stepCount)!
let startDate = Calendar.current.startOfDay(for: Date())
let predicate = HKQuery.predicateForSamples(withStart: startDate, end: Date(), options: .strictStartDate)
let query = HKSampleQuery(sampleType: stepType, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: nil) { query, samples, error in
guard let samples = samples as? [HKQuantitySample] else { return }
// Process samples
}
healthStore.execute(query)
HK 统计查询 – 汇总数据
对于总数,平均值,或特定期间的上限(例如每日步数),使用。这比对单个样本的组合要高效得多。
let statisticsQuery = HKStatisticsQuery(quantityType: stepType, quantitySamplePredicate: predicate, options: .cumulativeSum) { query, result, error in
let sum = result?.sumQuantity()?.doubleValue(for: HKUnit.count()) ?? 0
// Update UI with total steps
}
healthStore.execute(statisticsQuery)
HK 统计收集查询 – 时间 – 序列数据
要显示上一周每天的台阶图表,请使用],它分批地列出起始至结束日期之间的每一天的统计数据,从而对趋势形成理想。
let now = Date()
let sevenDaysAgo = Calendar.current.date(byAdding: .day, value: -7, to: now)!
let anchorDate = Calendar.current.startOfDay(for: now)
let daily = DateComponents(day: 1)
let collectionQuery = HKStatisticsCollectionQuery(quantityType: stepType, quantitySamplePredicate: nil, options: .cumulativeSum, anchorDate: anchorDate, intervalComponents: daily)
collectionQuery.initialResultsHandler = { query, results, error in
results?.enumerateStatistics(from: sevenDaysAgo, to: now) { statistics, stop in
let steps = statistics.sumQuantity()?.doubleValue(for: HKUnit.count()) ?? 0
// Append steps for statistics.startDate
}
}
healthStore.execute(collectionQuery)
显示适合性数据
原始数字没有清晰的可视化是毫无意义的。 设计良好的UI将HealthKit数据转化为激励性见解。 考虑以下方法:
- 简卡:[] 显示今天的步数,活性分钟,以及紧凑的仪表板中的心率趋势.
- 图:[ 使用行图或条图显示每周步数,月活能量,或心率区. 库像[ 宽图[(iOS 16+]或]图 (DG Charts]无缝集成.
- 目标环:[ 苹果的经典活动环可以被模仿,可以直观地看到能量,运动,和站立时间.
- 工作摘要: 目前的持续时间,平均心率,距离,以及每次记录的锻炼燃烧的卡路里.
示例: 构建一个步数盘
将上面的统计查询与 SwiftUI 合并, 以创建一个实时更新步骤计数器:
struct StepCardView: View {
@State private var steps: Double = 0
var body: some View {
VStack {
Text("Steps")
.font(.headline)
Text("\(Int(steps))")
.font(.largeTitle)
.bold()
}
.onAppear { fetchTodaySteps() }
}
func fetchTodaySteps() {
// Use HKStatisticsQuery as shown earlier
}
}
使用 HK 观察者查询的实时更新
要保持您的仪表板的电源, 无需手动刷新, 请设置一个 [[ FLT: 14] ] 。 当新数据保存到 HealthKit( 即使该应用程序是背景, 如果您注册了背景发送) 时, 系统会通知您的应用程序 。
let observerQuery = HKObserverQuery(sampleType: stepType, predicate: nil) { query, completionHandler, error in
DispatchQueue.main.async { self.fetchTodaySteps() }
completionHandler()
}
healthStore.execute(observerQuery)
要更新背景, 您还必须调用 [[ FLT: 16] 。 请注意 iOS 节流回调来保存电池; 使用时要节制, 并总是处理完成处理器 。
隐私和安全最佳做法
健康数据很敏感,苹果公司执行严格的规则,不遵守会导致App Store拒绝.
- 最小数据请求 : [[FLT: 1] 只请求您应用实际使用的数据类型。 如果您只需要步骤计数, 请避免要求“ 健康记录 ” 。
- 清除解释字符串:[ Info.plist中的用法描述应该具体,例如“这个应用程序读取了您的步骤数以显示你的日常活动。”
- 未经用户明确同意,永远不共享原始的HealthKit数据。如果同步到您的后端,则匿名和加密数据。
- 尊重授权更改: 当用户通过]取消权限时,或在每次查询前检查授权状态时,观察.
- 处理错误 优雅: 健康Kit查询可能由于授权,数据缺乏或数据库错误而失败. 总是显示一个方便用户的信息.
与苹果观察及其他来源整合
HealthKit 自动汇总 Apple Watch 、 第三方应用程序和手工条目的数据。 您的 iOS 应用程序不需要区分源代码, 除非您特别想要通过源代码过滤。 对于 解决应用程序, 请考虑写入对象 HealthKit 。 当用户在 Apple Watch 上启动一个工作时, 系统可以自动记录度量衡; 您的同伴 iOS 应用程序可以稍后读取这些值 。
写入练习数据 :
let workout = HKWorkout(activityType: .running, start: workoutStart, end: workoutEnd, duration: duration, totalEnergyBurned: energy, totalDistance: distance, metadata: nil)
healthStore.save(workout) { success, error in
// Handle
}
也可以使用和]在解决中添加相关的样本(如心率,路由).
常见的陷阱和如何避免它们
- 假设数据总是可以获取的: 新用户可能没有HealthKit数据. 设计您的UI以显示占位符或鼓励用户通过Health App或Apple Watch开始跟踪.
- 一次查询过多数据: 大查询(例如,去年的所有样本)可以慢速,在内存上崩溃. 使用日期上游并加限的 pagnation.
- 忽略时区:健康Kit timestamps在协调世界时,在按日分组时,转换为用户的本地时区以避免错配.
- 锁定主线程: 健康Kit查询是同步的,但其完成处理器可能不会运行在主线程上. Sendation UI request to ].
- 忘记检查健康数据提供情况:[]健康Kit在iPad和iPod触摸上是没有的。在任何交互之前总是拨打。
利用健康记录和临床数据扩大范围
对于以临床健康为重点的应用,健康Kit还支持健康记录[(通过FHIR ) 。 在用户许可下,您的应用可以访问免疫、实验室结果、药物和条件。这为药物跟踪器、过敏检查器或慢性病管理提供了可能性。然而,这些数据类型需要苹果公司对健康记录的应享权利进行额外审查。
结论
iOS HealthKit API为跟踪和显示健身数据提供了一个坚实的、注重隐私的基础。 通过了解其许可模式、查询类型和最佳做法,您可以构建一个与用户健康生态系统无缝融合的应用程序。 首先简单步数和心率查询,然后逐渐纳入背景更新、观察连接和临床记录等更先进的功能。 其结果是一个强大的工具,不仅让用户了解自己的健康,而且激励他们实现健身目标。
欲进一步阅读,请参考官方 APL健康Kit文档,健康Kit人际界面指南,以及社区资源,如[] Ray Wendelich的健康Kit教程[,以手-on代码示例.