Swift中未触发本地认证权限提示时,如何检测权限状态?
iOS生物识别权限检测问题解答
关于canEvaluatePolicy(_:error:)的核心作用
canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &failureReason)的核心是检测设备硬件是否支持生物识别、系统层面是否启用生物识别,而非检测当前应用的权限授权状态。这就是你卸载重装应用后,未弹出权限提示但API仍返回true的原因——设备本身支持Face ID且系统未禁用,应用权限状态不影响这个API的返回结果。
权限允许前后的差异
- 未授权状态:应用尚未向用户请求Face ID权限,此时
canEvaluatePolicy会返回true(只要设备支持)。只有调用evaluatePolicy(_:localizedReason:reply:)发起实际生物识别验证时,系统才会弹出权限请求弹窗。 - 已授权状态:用户允许权限后,
canEvaluatePolicy仍返回true,调用evaluatePolicy会直接触发Face ID验证流程。 - 拒绝/禁用状态:如果用户拒绝权限,或在系统设置中禁用了该应用的Face ID权限,
canEvaluatePolicy会返回false,对应错误信息为LAError.privacySettings或LAError.biometryNotAvailable。
正确检测应用生物识别权限状态的方法
方法1:通过LAContext.biometryStatus(iOS 14+)
iOS 14及以上版本可直接通过LAContext的biometryStatus属性获取权限状态:
let context = LAContext() let status = context.biometryStatus switch status { case .notAvailable: // 设备不支持生物识别或系统禁用 case .notEnrolled: // 用户未录入生物识别信息 case .lockedOut: // 生物识别验证次数过多,已锁定 case .authorized: // 应用已获得权限 case .restricted: // 受家长控制等限制无法使用 @unknown default: break }
方法2:捕获evaluatePolicy的错误信息(兼容低版本)
对于iOS 14以下版本,可通过调用evaluatePolicy并捕获错误判断权限状态:
let context = LAContext() var error: NSError? if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) { context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "用于登录验证") { success, evaluateError in if let evaluateError = evaluateError as? LAError { switch evaluateError.code { case .biometryNotAvailable: // 设备不支持或系统禁用 case .biometryNotEnrolled: // 未录入生物识别信息 case .biometryLockout: // 验证次数过多锁定 case .userCancel: // 用户取消验证 case .privacySettings: // 用户在设置中禁用了应用权限 default: break } } } } else { // 设备不支持生物识别,或系统层面无法使用 }
注意事项
- 必须在
Info.plist中配置NSFaceIDUsageDescription(Face ID)或NSBiometryUsageDescription(Touch ID),否则调用evaluatePolicy会直接崩溃。 - 卸载重装应用后,系统会重置该应用的权限状态,此时首次调用
evaluatePolicy才会触发权限请求弹窗,canEvaluatePolicy不会触发弹窗。
内容的提问来源于stack exchange,提问作者WCY
相关产品推荐
相关产品推荐

