LAContext evaluatePolicy不显示TouchID弹窗:如何每次触发都弹出验证?
解决生物识别每次点击都弹出验证弹窗的问题
你的代码只在首次触发弹窗,核心原因是复用了同一个LAContext实例——系统会缓存该实例的验证状态,后续调用evaluatePolicy时会直接返回之前的验证结果,不再弹窗。
修复方案:每次验证创建新的LAContext
把context从全局变量改为方法内的局部变量,每次调用验证方法时都初始化一个新的上下文对象。修改后的代码如下:
typealias ErrorHandler = (Error?) -> Void func authenticateBiometry(completion: @escaping ErrorHandler) { // 每次验证都新建LAContext实例 let context = LAContext() // 可选:先检查设备是否支持生物识别,避免无意义调用 var error: NSError? guard context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) else { completion(error) return } context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "请进行生物识别验证") { success, error in DispatchQueue.main.async { // 回调在后台线程,切回主线程处理UI逻辑 if success { completion(nil) } else { completion(error) } } } }
补充说明
- 关于15秒定时触发:如果需要每15秒自动触发一次验证,可使用
Timer实现,但要注意在合适的时机(比如页面显示时启动,消失时销毁)管理定时器,避免内存泄漏:var timer: Timer? func startAutoVerification() { timer = Timer.scheduledTimer(withTimeInterval: 15, repeats: true) { [weak self] _ in self?.authenticateBiometry { error in if let error = error { // 处理验证失败逻辑 print("验证失败:\(error.localizedDescription)") } else { // 验证成功逻辑 print("验证成功") } } } } func stopAutoVerification() { timer?.invalidate() timer = nil } - 本地化提示语:不要用空字符串作为
localizedReason,需要填写清晰的验证用途(比如"确认身份以访问敏感数据"),这也是App Store审核的要求之一。
内容的提问来源于stack exchange,提问作者kunass2
相关产品推荐
相关产品推荐

