FaceID三次验证失败弹出提示后,能否移除‘Enter Passcode’选项?
关于iOS FaceID验证失败后移除“输入密码”选项的问题
无法实现移除系统弹窗中“Enter Passcode”(输入密码)选项的需求,苹果不允许开发者自定义该系统级验证弹窗的UI元素。
原因说明
FaceID验证失败后弹出的带密码选项窗口,是iOS系统通过LocalAuthentication框架提供的原生安全验证组件。为保证生物识别验证流程的安全性、一致性,苹果完全掌控这个弹窗的内容与交互逻辑,开发者没有权限修改弹窗内的按钮数量、文本或隐藏特定选项。
你代码中使用的.deviceOwnerAuthenticationWithBiometrics政策,本身就包含“生物识别失败后自动 fallback 到密码验证”的系统默认逻辑,该流程不可被干预。
替代实现方案
如果希望实现“连续3次验证失败后仅保留取消选项”的效果,可以通过自定义验证流程绕开系统弹窗:
- 跟踪FaceID验证的失败次数
- 当失败次数达到3次时,不再调用系统的
evaluatePolicy方法,而是自定义弹出仅含“取消验证”按钮的提示窗口
示例代码如下:
private var biometryFailureCount = 0 func doBiometry(completionHandler: @escaping(Bool) -> Void){ let context = LAContext() var authError: NSError? guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &authError) else { completionHandler(false) return } // 连续失败3次,显示自定义弹窗 if biometryFailureCount >= 3 { let alert = UIAlertController(title: "FaceID验证失败", message: "连续3次验证未通过,请稍后再试", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "取消验证", style: .cancel) { _ in completionHandler(false) self.biometryFailureCount = 0 // 重置失败次数 }) // 适配不同场景的弹窗展示,此处以rootViewController为例 UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: true) return } context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "请验证FaceID以继续") { [weak self] (success, error) in guard let self = self else { return } if success { self.biometryFailureCount = 0 completionHandler(true) } else { // 仅在识别失败时累加次数,用户主动取消则重置 if let error = error as NSError?, error.code != LAError.userCancel.rawValue { self.biometryFailureCount += 1 } else { self.biometryFailureCount = 0 } completionHandler(false) } } }
这种方式是通过主动拦截系统验证流程实现的,并非修改系统原生弹窗。
内容的提问来源于stack exchange,提问作者Beginnerrrrrr
相关产品推荐
相关产品推荐

