如何在watchOS 6中实时读写oxygenSaturation(血氧饱和度)?
你的需求可以实现,无法读取oxygenSaturation和vo2Max数据是权限配置、设备限制或代码逻辑缺失导致的,可按照以下步骤排查解决:
- 首先检查Info.plist配置
血氧和VO2Max属于健康敏感数据,iOS要求必须在Info.plist中添加两个权限描述字段才会正常弹出授权窗口:- 写入数据需要添加
NSHealthShareUsageDescription,值为告知用户写入数据用途的说明文字 - 读取数据需要添加
NSHealthUpdateUsageDescription,值为告知用户读取数据用途的说明文字
如果缺少这两个配置,系统会直接默认拒绝敏感数据的授权请求,不会给用户弹出授权弹窗,也就无法读取对应数据。
- 写入数据需要添加
- 第二确认设备和系统版本要求
oxygenSaturation(血氧)数据仅支持Apple Watch Series 6及以上型号采集,要求watchOS 7+、iOS 14+系统版本,低于该版本的设备无法生成血氧采集数据;如果是用户手动录入到健康App的血氧数据,只要系统版本达标即可正常读取。
vo2Max数据要求iOS 11+、watchOS 4+以上系统版本,同样需要用户设备支持生成或手动录入对应数据才能读取到内容。 - 第三补充授权状态校验逻辑
你当前的代码中授权回调没有做任何状态判断,也没有提前校验目标数据类型的授权状态,建议在请求授权前先单独校验血氧类型的授权状态,避免重复请求授权或遗漏错误处理,示例代码如下:
// 单独校验血氧数据授权状态 guard let oxygenType = HKQuantityType.quantityType(forIdentifier: .oxygenSaturation) else { fatalError("当前设备系统不支持血氧数据类型") } let authStatus = healthStore.authorizationStatus(for: oxygenType) switch authStatus { case .notDetermined: // 尚未请求过授权,调用授权方法 requestAuthorization() case .sharingDenied: // 用户已拒绝授权,可提示用户前往「设置-健康-你的App名称」中手动开启权限 print("血氧数据权限已被拒绝,请手动开启后重试") case .sharingAuthorized: // 已获得授权,可正常执行读取逻辑 @unknown default: break }
另外注意如果在模拟器测试,需要手动在健康App中添加几条血氧测试数据再验证读取逻辑,避免因为数据为空误以为读取失败。
内容的提问来源于stack exchange,提问作者Osman
相关产品推荐
相关产品推荐

