如何实现Touch ID认证失败时弹出输入密码重试提示框(XCode 9.0.0)
实现Touch ID验证失败后的密码重试功能
嘿,我来帮你搞定这个Touch ID认证的需求~你的现有代码已经有了基础的Touch ID验证逻辑,但缺少失败后的密码重试处理,而且用的策略只能触发生物识别,没法自动唤起密码输入。下面是调整后的完整代码,完全适配你的Xcode 9环境:
修改后的代码
import LocalAuthentication @IBAction func authenticateUser(_ sender: Any) { let context = LAContext() var authError: NSError? // 检查设备是否支持「生物识别+密码」的验证方式 if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &authError) { let authReason = "请验证身份以继续操作" context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: authReason) { [weak self] success, error in // 回到主队列处理UI相关操作(回调默认在后台队列) DispatchQueue.main.async { guard success else { // 处理验证失败的所有场景 guard let laError = error as? LAError else { print("未知验证错误") return } switch laError.code { case .authenticationFailed: print("Touch ID识别错误,即将弹出密码验证") // 自动重试验证,系统会自动切换到密码输入界面 self?.authenticateUser(sender) case .userCancel: print("用户取消了验证") case .userFallback: print("用户主动选择输入密码") // 系统会自动弹出密码框,无需额外处理 case .biometryNotAvailable: print("设备不支持Touch ID,请直接使用密码验证") default: print("验证出错:\(laError.localizedDescription)") } return } // 验证成功后的业务逻辑 print("身份验证成功!") // 这里可以添加解锁功能、跳转页面等操作 } } } else { // 设备无法进行身份验证的情况 if let error = authError { print("无法启动身份验证:\(error.localizedDescription)") } } }
关键调整说明
- 换用更灵活的验证策略:把原来的
deviceOwnerAuthenticationWithBiometrics改成deviceOwnerAuthentication,这个策略会先尝试Touch ID,失败后自动唤起系统原生的密码输入界面,完全符合iOS的设计规范,不用自己写自定义弹窗。 - 处理后台回调的UI更新:
evaluatePolicy的回调是在后台队列执行的,所以必须用DispatchQueue.main.async切回主队列处理任何UI操作(比如弹窗、页面跳转)。 - 弱引用避免内存泄漏:闭包中用
[weak self]防止循环引用,这是Swift开发的基础规范哦。 - 细化错误处理:针对不同的LAError错误码给出不同的提示和处理逻辑,比如用户取消、设备不支持生物识别等场景都有对应的处理。
可选:自定义失败提示弹窗
如果你想在Touch ID验证失败后,先弹出自定义提示框让用户选择「重试Touch ID」还是「输入密码」,可以把.authenticationFailed的分支改成这样:
case .authenticationFailed: let alert = UIAlertController(title: "验证失败", message: "Touch ID识别错误,你可以选择重试或输入密码", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "重试Touch ID", style: .default, handler: { _ in self?.authenticateUser(sender) })) alert.addAction(UIAlertAction(title: "输入密码", style: .default, handler: { _ in self?.authenticateUser(sender) })) alert.addAction(UIAlertAction(title: "取消", style: .cancel)) self?.present(alert, animated: true)
注意事项
- 一定要在
Info.plist中添加NSTouchIDUsageDescription键,值填写使用Touch ID的用途(比如「验证身份以解锁隐私内容」),否则App会直接崩溃。 - 测试时必须用真机,模拟器无法模拟Touch ID验证。
- Xcode 9对应iOS 11,这个代码在iOS 8及以上版本都能正常运行,完全兼容你的环境。
内容的提问来源于stack exchange,提问作者Indra Sen
相关产品推荐
相关产品推荐

