如何检查HealthKit权限是否已授予并获取真实授权状态
解决HealthKit授权状态读取不准确问题
requestAuthorizationToShareTypes 回调中的布尔值仅代表授权弹窗流程是否正常完成,和用户最终是否同意授权无关,你需要调用authorizationStatus(for:)方法获取对应数据类型的真实授权状态。
实现步骤
- 先声明你需要读取的HealthKit数据类型,比如运动 workouts对应的是
HKObjectType.workoutType() - 调用
HKHealthStore的authorizationStatus(for:)方法判断当前授权状态,状态枚举共有三种:notDetermined:用户还未做出授权选择,此时才需要调用请求授权的方法sharingDenied:用户明确拒绝了授权sharingAuthorized:用户已经同意授权
- 根据状态处理对应逻辑:未确定就弹出授权申请,同意就走segue跳转,拒绝就弹出提示框
参考代码
import HealthKit import UIKit let healthStore = HKHealthStore() let workoutType = HKObjectType.workoutType() // 先检查当前设备是否支持HealthKit guard HKHealthStore.isHealthDataAvailable() else { // 设备不支持时弹对应提示即可 return } // 获取真实授权状态 let authStatus = healthStore.authorizationStatus(for: workoutType) switch authStatus { case .notDetermined: // 首次请求授权 healthStore.requestAuthorization(toShare: nil, read: [workoutType]) { [weak self] _, _ in // 授权回调在后台队列,UI操作要切到主队列 DispatchQueue.main.async { guard let self = self else { return } // 授权完成后重新检查状态 let newStatus = self.healthStore.authorizationStatus(for: workoutType) if newStatus == .sharingAuthorized { self.performSegue(withIdentifier: "toWorkouts", sender: nil) } else { // 弹出未授权提示 let alert = UIAlertController(title: "权限不足", message: "需要您授权HealthKit运动数据访问权限才能使用该功能", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) self.present(alert, animated: true) } } } case .sharingDenied: // 用户已经拒绝过授权,直接弹提示引导去系统设置开启 let alert = UIAlertController(title: "权限不足", message: "请在系统设置-隐私与安全-健康中开启本应用的运动数据访问权限", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) present(alert, animated: true) case .sharingAuthorized: // 已经获得授权,直接跳转页面 performSegue(withIdentifier: "toWorkouts", sender: nil) @unknown default: // 兼容后续系统新增的授权状态 break }
注意事项
- 读取的类型和请求授权时
read参数传入的类型必须对应,如果你需要读取除运动外的其他HealthKit数据,需要补充到类型数组中 - 不要用
requestAuthorizationToShareTypes的回调布尔值作为授权判断依据,每次需要使用数据前都可以调用authorizationStatus(for:)获取最新状态
内容的提问来源于stack exchange,提问作者Akash Shah
相关产品推荐
相关产品推荐

