使用Local_auth时如何限制用户使用指定类型的生物识别认证?
解决local_auth调用时同时弹出指纹和Face ID选项的问题
local_auth默认调用authenticate方法时会加载系统支持的所有可用生物认证选项,要限定单一认证类型,需要通过平台专属参数指定要调用的生物类型,操作步骤如下:
1. 前置操作:获取设备可用的生物认证列表
调用getAvailableBiometrics方法先确认设备是否支持你要触发的对应认证类型,避免调用失败:
import 'package:local_auth/local_auth.dart'; import 'package:local_auth_android/local_auth_android.dart'; import 'package:local_auth_darwin/local_auth_darwin.dart'; final LocalAuth _localAuth = LocalAuth(); // 获取当前设备已录入且可用的生物认证类型 List<BiometricType> availableBiometrics = await _localAuth.getAvailableBiometrics();
返回的BiometricType枚举值对应:
BiometricType.fingerprint:指纹认证(iOS端对应Touch ID)BiometricType.face:面部认证(iOS端对应Face ID)BiometricType.weak/BiometricType.strong:安卓端的生物认证安全等级分类
2. 仅触发指纹认证的调用方式
第一次需要仅走指纹认证时,通过平台专属参数限定调用类型:
// 先判断设备是否支持指纹 if (availableBiometrics.contains(BiometricType.fingerprint)) { bool isFingerprintPassed = await _localAuth.authenticate( localizedReason: '请验证指纹以继续', options: AuthenticationOptions( biometricOnly: true, // 安卓端限定仅调用指纹 androidAuthOptions: AndroidAuthOptions( allowedAuthenticators: AndroidAuthenticator.biometricStrong, ), // iOS端限定仅调用Touch ID(指纹) iOSAuthOptions: IOSAuthOptions( biometryType: BiometricType.fingerprint, ), ), ); // 指纹验证通过后再走Face ID验证逻辑 if (isFingerprintPassed) { // 调用Face ID验证逻辑 } } else { // 降级逻辑:提示用户未录入指纹,引导到系统设置录入 }
3. 仅触发Face ID/面部认证的调用方式
指纹验证通过后,再单独调用面部认证:
// 先判断设备是否支持面部认证 if (availableBiometrics.contains(BiometricType.face)) { bool isFacePassed = await _localAuth.authenticate( localizedReason: '请验证面部以继续', options: AuthenticationOptions( biometricOnly: true, // 安卓端限定仅调用面部认证 androidAuthOptions: AndroidAuthOptions( allowedAuthenticators: AndroidAuthenticator.face, ), // iOS端限定仅调用Face ID iOSAuthOptions: IOSAuthOptions( biometryType: BiometricType.face, ), ), ); if (isFacePassed) { // 两种认证都通过,执行后续业务逻辑 } } else { // 降级逻辑:提示用户未录入面部信息 }
注意事项
- 以上适配基于local_auth 3.0及以上版本,低版本包需要升级后使用平台专属参数配置
- 安卓11以下的系统部分厂商自定义ROM不支持单独限定生物认证类型,可能仍会弹出所有可选认证选项,需要做多机型适配测试
- 调用前必须先判断设备是否支持对应类型的生物认证,避免直接调用返回认证失败的问题
内容的提问来源于stack exchange,提问作者Saad Mehmood
相关产品推荐
相关产品推荐

