Swift中如何通过编程方式关闭生物识别认证?
如何在Swift中自动关闭生物识别认证弹窗?
首先要明确:LAContext本身并没有提供直接的API来主动取消正在进行的生物识别认证请求,但我们可以通过使LAContext实例失效的方式来间接实现自动关闭弹窗的需求,具体步骤如下:
核心思路
LAContext在iOS 10及以上提供了invalidate()方法,调用这个方法会立即终止当前的认证会话,触发认证失败的回调,从而关闭生物识别弹窗。我们可以结合定时器,设置30秒后调用这个方法来实现自动关闭。
修改后的完整代码
首先需要把LAContext和定时器声明为类的实例变量(而非局部变量),这样才能在定时器回调中访问并操作它们:
import LocalAuthentication class YourAuthenticationClass { // 声明实例变量,保存LAContext和定时器 private var authContext: LAContext? private var autoCancelTimer: Timer? // 启动生物识别认证的方法 func initiateBiometricLogin() { // 先清理之前的定时器和上下文,避免重复触发 autoCancelTimer?.invalidate() authContext = LAContext() let authReason = "Log in to your account" // 设置30秒后自动触发的定时器 autoCancelTimer = Timer.scheduledTimer(withTimeInterval: 30.0, repeats: false) { [weak self] _ in // 使LAContext失效,终止认证会话 self?.authContext?.invalidate() self?.autoCancelTimer = nil } // 发起生物识别认证 authContext?.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: authReason) { [weak self] success, error in // 无论认证成功还是失败,都要销毁定时器,避免不必要的触发 DispatchQueue.main.async { self?.autoCancelTimer?.invalidate() self?.autoCancelTimer = nil } if success { // 认证成功,切换到登录状态(回到主线程更新UI) DispatchQueue.main.async { [weak self] in self?.state = .loggedin } } else { // 处理认证失败的情况 let errorMsg = error?.localizedDescription ?? "Failed to authenticate" print(errorMsg) // 可以根据错误码区分是自动关闭还是用户手动取消 if let laError = error as? LAError, laError.code == .systemCanceled { // 这里是自动关闭的情况,可添加对应提示或逻辑 print("认证已自动取消") } // 回退到用户名密码登录的逻辑 // ... } } } }
关键细节说明
- 避免循环引用:在定时器和认证回调中都使用
[weak self],防止因LAContext和定时器持有self导致内存泄漏。 - 及时清理定时器:认证完成(成功/失败)后必须手动销毁定时器,否则定时器会在30秒后依然触发,即使认证已经完成。
- 区分错误类型:调用
invalidate()触发失败时,错误码为LAError.systemCanceled;用户手动点击取消按钮时,错误码为LAError.userCanceled,你可以根据这个差异做不同的业务处理。 - 兼容性:
invalidate()方法仅支持iOS 10及以上系统,目前绝大多数iOS设备都已满足这个版本要求,若需兼容更低版本则需要其他折中方案。
内容的提问来源于stack exchange,提问作者Punreach Rany
相关产品推荐
相关产品推荐

