Firebase Authentication短信已发送未接收:排查方案咨询
Firebase手机号验证:短信已发送但未收到/验证数不匹配问题排查
1. 发送短信数与已验证数存在差异的核心原因
- 用户未收到短信:Firebase标记为“Sent”仅代表短信已提交给运营商网关,不代表最终送达用户设备,中间可能被运营商拦截、过滤或延迟。
- 用户收到短信但未完成验证:用户可能收到验证码但未输入(比如放弃操作、验证码过期),或误操作导致未提交验证请求。
- 重复发送场景:用户多次点击“发送验证码”按钮,Firebase会重复发送短信(即使之前的短信还在途),但用户只验证一次,导致发送数远大于验证数。
- 无效号码:手机号格式正确但实际已停机、销号,或属于虚拟号段/未激活号码,运营商无法送达,但Firebase仍标记为“Sent”。
- 验证码过期:Firebase验证码默认有效期5分钟,用户收到时已过期,无法完成验证。
2. 追踪“Sent”之外的短信交付情况的Firebase工具
- Cloud Logging:在Firebase控制台的Cloud Logging中,过滤
resource.type="firebase_project"和logName="projects/[你的项目ID]/logs/firebase.auth",可以查看更细粒度的事件:- 查找
phone_auth_code_sent事件对应的后续是否有phone_auth_successful事件,若没有则说明用户未完成验证。 - 部分情况下会出现隐性的交付失败日志(比如运营商返回的非标准错误),需关注
message字段中的详细描述。
- 查找
- Authentication用户活动日志:在Firebase控制台的Authentication > 用户 > 活动日志中,查看单个用户的验证码发送、验证尝试记录,判断是未收到还是未验证。
- Firebase Analytics:创建自定义事件追踪
code_sent和code_verified,统计转化率,定位转化漏斗中的流失环节。
3. 运营商/用户侧问题的影响及排查步骤
影响确认
运营商过滤、DND(免打扰)、区域限制是此类问题的高频原因:
- 运营商可能将Firebase的验证短信标记为垃圾短信,自动拦截;部分地区运营商对国际短码或特定格式的短信有发送限制。
- 用户开启DND模式或安装第三方短信拦截软件,会直接屏蔽验证短信;手机信号差、短信收件箱已满也会导致无法接收。
排查步骤
- 用户侧排查:
- 让用户检查手机的短信拦截列表、DND设置,确认未屏蔽Firebase的短信发送号码。
- 让用户尝试切换网络(比如从Wi-Fi切到移动数据),或重启设备后重新请求验证码。
- 验证用户手机号是否正常使用(可拨打测试),确认收件箱未存满。
- 运营商侧排查:
- 收集问题用户的手机号所属运营商、所在地区,测试同运营商同地区的测试号码,复现问题。
- 若批量出现同一运营商/地区的问题,可联系Firebase支持,获取运营商网关返回的交付状态细节(部分地区运营商会返回拦截原因)。
4. 调试此类问题的最佳实践
- 提供备选验证方式:除短信外,添加语音验证码选项,降低短信拦截带来的影响。
- 优化UI提示:在发送验证码后,明确提示用户:“请检查短信拦截、免打扰设置,若未收到可尝试语音验证码或重新发送”。
- 限制重复发送次数:添加发送间隔限制(比如60秒内不可重复发送),避免不必要的短信发送,减少发送数与验证数的差异。
- 收集用户反馈:在问题出现时,让用户提交手机号、运营商、地区、设备型号等信息,便于定位共性问题。
- 监控转化数据:用Firebase Analytics追踪验证码发送到验证的转化率,若某一地区/运营商转化率骤降,及时排查。
- 定期复盘日志:每周查看Cloud Logging中的异常事件,关注未完成验证的用户比例,提前发现潜在问题。
内容的提问来源于stack exchange,提问作者Shashank Thakur
相关产品推荐
相关产品推荐

