iOS开发:如何判断系统FaceID提示框是否已弹出?
判断系统FaceID提示框是否正在显示的方案
苹果并没有提供直接的API、通知或代理方法来检测系统级的FaceID认证弹窗是否正在显示——这是出于隐私与系统安全的设计考量,避免应用获取用户的生物识别交互状态。
不过你可以通过手动维护认证状态的方式间接实现需求,核心思路是自己跟踪生物识别认证的生命周期,在需要弹出异步视图前检查这个状态:
实现步骤
- 封装一个生物识别管理类,维护布尔变量标记当前是否处于认证流程中
- 在调用FaceID认证前后更新这个状态
- 异步事件触发视图弹出前,先检查该状态
代码示例
import LocalAuthentication class BiometricAuthManager { static let shared = BiometricAuthManager() private let context = LAContext() // 标记当前是否正在进行生物识别认证 var isAuthenticating = false func startBiometricAuth(reason: String, completion: @escaping (Bool, Error?) -> Void) { // 先检查设备是否支持生物识别 var error: NSError? guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else { completion(false, error) return } // 开始认证前标记状态为true isAuthenticating = true context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { [weak self] success, authError in // 回到主线程更新状态 DispatchQueue.main.async { self?.isAuthenticating = false completion(success, authError) } } } } // 异步事件触发视图前的检查逻辑 func showAsyncTriggeredView() { if !BiometricAuthManager.shared.isAuthenticating { // 这里执行你的视图弹出逻辑 let alert = UIAlertController(title: "提示", message: "异步事件触发的弹窗", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: true) } }
注意事项
- 确保所有调用生物识别认证的入口都通过这个管理类进行,避免状态不一致
- 即使用户主动取消FaceID认证(比如按下侧边键),
evaluatePolicy的回调也会被触发,因此状态会被正确重置 - 如果你的应用同时支持TouchID,这个方案同样适用,因为底层使用的是同一个
LAContext评估逻辑
内容的提问来源于stack exchange,提问作者rmvz3
相关产品推荐
相关产品推荐

