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

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;
  }
}

逻辑说明

  1. 提前检查认证可用性:通过getAvailableBiometrics获取可用生物识别方式,为空时再用isDeviceSupported检查是否支持系统密码(iOS端默认允许用系统密码替代生物识别,除非设置biometricOnly: true)。
  2. 统一触发备用逻辑:无论Android还是iOS,只要检测到无可用认证方式,直接返回false进入备用认证流程,避免依赖平台差异的异常抛出行为。
  3. 保留原有异常捕获:仍保留认证过程中的异常捕获,处理认证时的其他错误场景。

额外注意事项

确保iOS项目的Info.plist已添加对应权限描述:

  • 若支持FaceID:添加NSFaceIDUsageDescription
  • 通用生物识别权限:添加NSBiometricUsageDescription

内容的提问来源于stack exchange,提问作者JRV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:20:25