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

iOS开发:如何判断系统FaceID提示框是否已弹出?

判断系统FaceID提示框是否正在显示的方案

苹果并没有提供直接的API、通知或代理方法来检测系统级的FaceID认证弹窗是否正在显示——这是出于隐私与系统安全的设计考量,避免应用获取用户的生物识别交互状态。

不过你可以通过手动维护认证状态的方式间接实现需求,核心思路是自己跟踪生物识别认证的生命周期,在需要弹出异步视图前检查这个状态:

实现步骤

  1. 封装一个生物识别管理类,维护布尔变量标记当前是否处于认证流程中
  2. 在调用FaceID认证前后更新这个状态
  3. 异步事件触发视图弹出前,先检查该状态

代码示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:45:40