Flutter上传Firebase Storage报App Check Too many attempts错误
问题对应表现
- Flutter端集成Firebase Storage做文件上传时,文件最终可上传成功,但整体上传耗时明显偏高
- 运行日志持续输出错误:
StorageUtil: Error getting App Check token; using placeholder token instead. Error: com.google.firebase.FirebaseException: Too many attempts.
- 已在Firebase控制台登记Debug App Check Token,且在Flutter的Dart代码层调用了App Check激活接口,但报错持续存在。
核心原因
这个报错本质是App Check SDK短时间内多次尝试拉取校验token失败触发了内置限流,SDK自动降级使用占位token发起请求——占位token会被Firebase服务端校验拦截触发重试,直接拖慢上传速度。
绝大多数场景下问题根源不是配置错误,而是仅在Dart层激活App Check的时机太晚:App Check的token拉取逻辑在应用启动的原生层初始化阶段就会触发,等Dart层代码执行激活逻辑时,SDK已经完成了多轮失败重试触发限流。另外原生侧缺少Debug提供者的显式配置、低版本SDK的已知bug也会触发这个问题。
分步修复方案
Android 端配置(90%的漏配都出在这里)
- 打开Android工程目录,定位到
android/app/src/debug/AndroidManifest.xml(如果debug目录下没有该清单文件,直接新建即可,debug目录下的配置只会在调试编译时生效,不会影响正式包),在<application>节点内添加如下元数据配置,把值替换成你在Firebase控制台登记的Debug Token字符串:
<meta-data android:name="com.google.firebase.appcheck.debug.DEBUG_SECRET_PROVIDER" android:value="替换成你自己的Firebase App Check Debug Token" />
注意:严禁把这段配置写到
main目录下的正式版AndroidManifest.xml中,否则正式发布包会携带Debug校验逻辑,上线后会出现全量校验失败。
- 打开
android/app/build.gradle文件,检查引入的Firebase BOM版本,确保版本号不低于32.0.0,低于该版本的App Check SDK存在Debug模式下无限重试触发限流的已知bug,直接升级到对应稳定版本即可。 - 卸载测试设备上当前安装的调试包,执行
flutter clean清除构建缓存后重新编译运行,清除本地之前缓存的失败重试记录。
iOS 端配置
- 打开iOS工程目录下的
ios/Runner/Info.plist文件,新增配置项传入你在Firebase控制台登记的Debug Token:
<key>FirebaseAppCheckDebugToken</key> <string>替换成你自己的Firebase App Check Debug Token</string>
- 用Xcode打开iOS工程,找到
AppDelegate.swift(OC项目对应AppDelegate.m),确保在调用FirebaseApp.configure()方法前就完成App Check Debug提供者的注册,不要把初始化逻辑全放到Dart层执行。 - 卸载测试设备上已安装的调试App,执行
flutter clean后重新编译运行。
校验配置生效
配置完成后重新启动应用,过滤日志中带AppCheck标签的输出,如果能看到debug token拉取成功的日志,之前的"Too many attempts"报错就会消失,Firebase Storage的上传速度会恢复到正常水平。
如果仍有报错,去Firebase控制台的App Check页面核对:登记的Debug Token必须和当前调试应用的包名(Android)/Bundle ID(iOS)一一对应,Debug Token不支持跨应用复用。
正式环境发布时记得替换成对应平台的正式校验提供者:Android用Play Integrity、iOS用App Attest,不要在正式包中保留Debug提供者配置。
内容的提问来源于stack exchange,提问作者Andy Torres

