Flutter应用Firebase Phone Auth原正常运行突发失效报错
问题根因说明
首先先过滤日志里的无效噪音:
A resource failed to call end、Ignoring header X-Firebase-Locale because its value was null是Android系统和Firebase SDK的常规警告,和认证失效无直接关联,无需优先处理。[FirebaseAuthFallback:] App hash will not be appended to the request、[SmsRetrieverHelper] SMS auto-retrieval unavailable; SmsRetriever will not start仅代表短信验证码自动填充功能不可用,不会阻断短信本身的下发流程,不是登录失败的核心诱因。- 真正对应故障的日志是最后一行
[SmsRetrieverHelper] Timed out waiting for SMS,结合「稳定运行5个月后突发故障、仅偶发成功一次」的特征,故障原因按出现概率从高到低排序如下:- Firebase短信配额触发限流:Firebase Phone Auth有明确的日发送上限、同单位时间单手机号发送阈值,触发限流后SDK不会返回明确错误码,只会表现为等待短信超时。偶发的单次成功是限流阈值短暂浮动导致的单次放行,之后阈值再次触达就会恢复拦截状态。
- 应用签名哈希不匹配:如果近期调整过Android构建配置、更换了签名密钥、升级了Flutter或Firebase相关依赖、开启了Google Play自动重签名,会导致当前应用包的签名哈希和Firebase控制台留存的配置不一致。部分区域的Firebase短信通道会校验请求来源的签名合法性,校验不通过时直接拦截短信下发,仅表现为超时。
- 测试设备Google Play服务兼容异常:SmsRetriever组件强依赖系统内置的Google Play服务运行,如果测试设备的Play服务近期自动更新后出现兼容问题、或被系统限制了后台权限,会导致短信监听链路失效,极端情况下会连带阻断短信下发请求。
- 运营商短信拦截:如果近期对应号段的运营商调整了垃圾短信拦截规则,Firebase使用的短信下发号段被列入拦截名单,就会出现短信收不到、等待超时的问题,偶发成功是因为短信走了备用下发通道。
排查修复步骤
按优先级从易到难操作,每完成一步就测试一次认证流程:
- 校验Firebase配额状态
进入Firebase控制台的Authentication-短信认证配置页,查看近24小时的发送量、失败率统计,确认是否触发配额阈值。测试阶段可以先把常用测试手机号添加到测试白名单,白名单号码不受配额限制,可以快速定位是否为配额问题。如果确认是配额耗尽,要么等待配额周期重置,要么升级付费计划提升配额上限。 - 重新核对应用签名配置
分别提取当前调试包、正式发布包的SHA-1、SHA-256签名值,如果开启了Google Play应用签名,还要额外提取Play控制台给出的应用重签名后的哈希值,和Firebase控制台中Android应用配置里留存的哈希值逐一比对,存在缺失或不一致的直接补充更新。更新完成后重新下载最新的google-services.json文件,替换到项目android/app目录下,执行flutter clean清除构建缓存后重新打包测试。 - 验证短信下发链路
更换不同运营商、不同号段的手机号测试验证码发送,如果部分手机号可以正常收到短信,说明是对应运营商的拦截规则导致,可通过Firebase控制台支持渠道申请更换短信下发号段。如果所有手机号都无法收到,可排除运营商侧问题。 - 排查设备端环境问题
更换一台搭载官方正式版Google Play服务、未做过系统精简、无第三方短信拦截应用的测试设备重新测试。测试时可以先屏蔽自动读码逻辑,手动触发发送后输入验证码验证流程,如果手动输入可以正常完成认证,说明仅为SmsRetriever自动读码组件故障,不影响核心认证逻辑。 - 回退依赖版本验证
如果故障出现前升级过firebase_auth、firebase_core等相关依赖,直接回退到之前功能正常运行时的依赖版本,重新拉取依赖构建测试,排除新版本SDK的兼容bug。
内容的提问来源于stack exchange,提问作者Asha
相关产品推荐
相关产品推荐

