You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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)

注意事项

  1. 一定要在Info.plist中添加NSTouchIDUsageDescription键,值填写使用Touch ID的用途(比如「验证身份以解锁隐私内容」),否则App会直接崩溃。
  2. 测试时必须用真机,模拟器无法模拟Touch ID验证。
  3. Xcode 9对应iOS 11,这个代码在iOS 8及以上版本都能正常运行,完全兼容你的环境。

内容的提问来源于stack exchange,提问作者Indra Sen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:21:28