LAContext.biometryType返回.none的条件及检测函数的局限性与修复方案
1. LAContext.biometryType 返回 .none 的条件
- 设备本身不支持任何生物识别技术(例如iPhone 5及更早机型)
- 用户在系统设置中关闭了所有生物识别功能
- 未录入任何生物识别数据(无指纹/人脸记录)
- 生物识别硬件故障(如TouchID传感器损坏、FaceID原深感摄像头失效)
- 设备处于受限状态(如MDM策略禁用生物识别、企业级限制模式)
2. 原函数的局限性及修复方案
局限性
- 未触发系统生物识别校验:直接读取
biometryType前未调用canEvaluatePolicy(_:error:),根据Apple官方文档,biometryType仅在调用该方法后才会返回准确值,这是首次进入页面返回nil的核心原因。 - iOS 11以下逻辑不严谨:默认返回
.touchID,但部分老设备可能根本没有TouchID模块,会导致错误判断。 - 未处理
.none场景:iOS11+分支仅判断.faceID和.touchID,忽略了.none的情况,直接返回nil,缺乏明确的状态标识。 - 上下文生命周期问题:局部创建的
LAContext可能在系统完成校验前被释放,首次调用时无法获取有效状态。
修复后的代码
enum BiometricType { case touchID case faceID case none } func checkOptionBio() -> BiometricType { let context = LAContext() var error: NSError? // 先验证生物识别策略是否可执行,触发系统状态校验 guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else { return .none } if #available(iOS 11.0, *) { switch context.biometryType { case .faceID: return .faceID case .touchID: return .touchID case .none: return .none @unknown default: return .none } } else { // iOS11以下,能通过校验的仅可能是TouchID return .touchID } }
修复说明
- 新增
.none枚举值,明确标识无可用生物识别的状态,避免返回nil带来的不确定性 - 强制调用
canEvaluatePolicy,确保系统完成生物识别状态校验,解决首次进入页面返回nil的问题 - iOS11以下分支依赖校验结果判断TouchID可用性,避免错误识别无TouchID的设备
- 新增
@unknown default分支,兼容未来可能新增的生物识别类型
内容的提问来源于stack exchange,提问作者kotlin junior
相关产品推荐
相关产品推荐

