iOS端Flutter local_auth在生物识别与密码禁用时未返回PlatformException
问题解决方案
核心问题分析
Android端在生物识别与系统密码均禁用时,local_auth的authenticate方法会抛出PlatformException,你的代码能捕获并返回false触发备用认证;但iOS端在相同场景下不会抛出该异常,导致原有逻辑无法触发备用流程。
修复方案
通过提前检查设备是否存在可用的认证方式,替代仅依赖异常捕获的逻辑,适配iOS的行为差异:
Future<bool> authentication() async { bool hasValidAuthMethod = false; // 先检查设备是否有可用的生物识别或系统密码认证方式 try { final availableBiometrics = await _localAuthentication.getAvailableBiometrics(); if (availableBiometrics.isNotEmpty) { hasValidAuthMethod = true; } else { // 生物识别不可用,检查是否支持系统密码认证 hasValidAuthMethod = await _localAuthentication.isDeviceSupported(); } } on PlatformException { hasValidAuthMethod = false; } // 无可用认证方式,直接返回false触发备用逻辑 if (!hasValidAuthMethod) { return false; } // 尝试执行认证 try { return await _localAuthentication.authenticate( localizedReason: Strings.localAuthReason, useErrorDialogs: true, stickyAuth: true, ); } on PlatformException { return false; } }
逻辑说明
- 提前检查认证可用性:通过
getAvailableBiometrics获取可用生物识别方式,为空时再用isDeviceSupported检查是否支持系统密码(iOS端默认允许用系统密码替代生物识别,除非设置biometricOnly: true)。 - 统一触发备用逻辑:无论Android还是iOS,只要检测到无可用认证方式,直接返回
false进入备用认证流程,避免依赖平台差异的异常抛出行为。 - 保留原有异常捕获:仍保留认证过程中的异常捕获,处理认证时的其他错误场景。
额外注意事项
确保iOS项目的Info.plist已添加对应权限描述:
- 若支持FaceID:添加
NSFaceIDUsageDescription - 通用生物识别权限:添加
NSBiometricUsageDescription
内容的提问来源于stack exchange,提问作者JRV
相关产品推荐
相关产品推荐

