Flutter虚拟设备中Firebase短信验证遇SafetyNet完整性验证失败
Firebase电话认证虚拟设备验证失败的解决建议
核心原因是虚拟设备的模拟器环境无法通过SafetyNet/Play Integrity的基本完整性检测,这类检测会识别出模拟器的非真实设备特征,以下是针对性的解决方法:
使用带Google Play服务的官方模拟器
创建AVD时必须选择带有「Google Play」标记的系统镜像(比如Android 12及以上的稳定版本),这类镜像预装了完整的Google Play服务框架。启动模拟器后,登录你的Google账号,打开Play商店更新到最新的Google Play服务版本,确保服务处于正常激活状态。添加调试令牌绕过App Check验证(仅开发用)
在调试阶段,你可以为模拟器添加专属的调试令牌,让Firebase跳过严格的完整性检测:- 运行模拟器后,在Logcat中搜索关键词
AppCheckDebugToken,复制输出的调试令牌字符串 - 进入Firebase控制台 → 你的项目 → App Check → 选择对应的Android应用 → 「调试令牌」栏添加复制的令牌
- 代码中配置调试模式的App Check提供者:
if (BuildConfig.DEBUG) { FirebaseAppCheck.getInstance().installAppCheckProviderFactory( DebugAppCheckProviderFactory.getInstance() ) } else { FirebaseAppCheck.getInstance().installAppCheckProviderFactory( PlayIntegrityAppCheckProviderFactory.getInstance() ) }
⚠️ 注意:此方法仅用于本地开发测试,绝对不能在生产环境中使用。
- 运行模拟器后,在Logcat中搜索关键词
调整模拟器配置
- 在AVD的高级设置中,确保「Rooted」选项设置为「No」,Root状态会直接触发完整性检测失败
- 避免使用预览版API的模拟器镜像,优先选择稳定版系统镜像
- 确保模拟器的硬件配置不要过于特殊,保持默认的设备参数
切换到Play Integrity替代SafetyNet
SafetyNet已逐步被Play Integrity替代,确认你已完成以下配置:- 在Google Cloud控制台启用Play Integrity API
- 应用级build.gradle中添加依赖:
implementation "com.google.android.play:integrity:1.2.0" - 在Firebase控制台的App Check设置中,将Android应用的验证提供者切换为「Play Integrity」
内容的提问来源于stack exchange,提问作者SLendeR
相关产品推荐
相关产品推荐

