如何从WatchOS获取近实时心率数据且不修改HealthKit数据、不影响健身圆环
Apple Watch 实时心率读取无HealthKit影响实现方案
方案1:无需启动HKWorkoutSession读取实时心率
该方案全程仅读不写,完全不会修改HealthKit数据,也不影响健身圆环统计:
- 首先向用户申请HealthKit心率数据的只读权限,权限申请时
toShare参数传nil,完全不获取写权限,从根源避免写入操作
示例代码:let heartRateType = HKObjectType.quantityType(forIdentifier: .heartRate)! healthStore.requestAuthorization(toShare: nil, read: [heartRateType]) { success, error in // 授权成功后即可启动查询 } - 用
HKObserverQuery或者HKAnchoredObjectQuery监听心率样本更新,正常情况采样延迟1~3秒,满足大多数场景的实时性要求,App退后台时只要开启后台刷新权限就能持续接收数据 - 该方案默认的心率采样频率为5秒1次,是Apple Watch常规状态下的默认采样频率
方案2:使用HKWorkoutSession获取更高采样率且禁止写入
如果需要1秒1次的高采样率心率数据,必须启动HKWorkoutSession的场景下,可以通过以下配置避免写入HealthKit:
- 仅初始化
HKWorkoutSession,不搭配使用HKLiveWorkoutBuilder,或是初始化Builder时不实现任何数据写入的代理方法、不主动调用add(_:completion:)这类写入接口 - 全程不要向HealthKit写入任何本次会话关联的运动样本、能量消耗等数据,系统不会自动将未主动上报的会话计入健身圆环,也不会修改HealthKit内的任何数据
- 该方案下的心率采样率可达到运动级的1秒1次,实时性更高
内容的提问来源于stack exchange,提问作者FlorinD
相关产品推荐
相关产品推荐

