如何在iPhone端启动HealthKit锻炼并实现与Apple Watch应用数据同步
iOS + watchOS 跨端锻炼会话协同及数据合并实现方案
跨端协同的基础是通过WatchConnectivity框架完成双向实时通信,所有锻炼状态、采样数据的同步都依赖该框架实现,具体实现逻辑按启动端拆分如下:
1. 锻炼从iOS端启动的对接逻辑
- iOS端使用
HKWorkoutBuilder启动锻炼后,立即通过WCSession的同步/异步通信接口,将锻炼的类型、起始时间、已产生的初始采样数据(如卡路里、距离统计值)同步到watchOS端 - watchOS端接收到iOS端的锻炼启动通知后,初始化
HKWorkoutConfiguration并配置对应参数,直接调用HKLiveWorkoutSession启动会话,关联的HKLiveWorkoutBuilder必须将startDate设置为iOS端同步过来的起始时间,不得使用watch本地的当前时间 - watchOS端的
HKLiveWorkoutBuilder实时采集到的体能采样数据,按固定间隔(建议3~10秒,可按业务需求调整)同步回iOS端,iOS端调用HKWorkoutBuilder的add(_:completion:)方法将数据添加到本地构建器中,保持两端数据一致 - 锻炼结束时如果用户在iOS端触发停止操作,需先向watchOS端发送停止通知,待watchOS端返回所有未同步的采样数据后,iOS端再合并两端所有采样数据,调用
finishWorkout(completion:)完成锻炼构建,最后存入HealthKit;如果用户在watchOS端触发停止操作,watchOS端完成锻炼构建后将完整的HKWorkout对象同步到iOS端,iOS端直接存储即可,无需重复构建 - 若watchOS端启动锻炼会话时,iOS端已经积累了一段时间的锻炼数据,watchOS可直接调用
HKLiveWorkoutBuilder的addSamples方法导入这部分历史数据,HealthKit会自动完成全时段的卡路里、距离统计,无需手动计算回溯值
2. 锻炼从watchOS端启动的对接逻辑
- 严格遵循官方约束,iOS端仅提供锻炼数据展示入口,不提供结束、暂停锻炼的操作按钮,所有启停类操作都提示用户到watchOS端完成,避免两端会话状态不一致
- iOS端的
HKWorkoutBuilder仅用于本地数据预览,不执行最终的HealthKit存储操作,所有存储逻辑由watchOS端完成后,将最终结果同步到iOS端展示即可
数据合并注意事项
- 两端同步的所有时间戳统一使用UTC时间,避免时区差异导致的时间偏移、数据重复问题
- 合并采样数据前先按时间戳去重,避免同一采样数据被两端重复添加到构建器中
重要提示:如果watchOS端没有正在运行的活跃锻炼会话,禁止在watchOS侧追溯创建历史锻炼会话,避免出现HealthKit写入冲突、数据重复存储的问题
内容的提问来源于stack exchange,提问作者Joris
相关产品推荐
相关产品推荐

