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

升级@react-native-firebase/auth至12.8.0后短信验证码随机过期问题

核心原因排查与修复方案

1. Play商店版本全失败的根因修复

你添加的release环境SHA是本地打包密钥的签名值,但如果你的应用开启了Google Play应用签名服务,Play商店会用谷歌官方的签名密钥重新对你的安装包签名,此时本地的release SHA不生效,会触发Firebase身份校验失败,直接出现session过期报错:

  • 打开Google Play Console,进入对应应用的「设置 > 应用完整性 > 应用签名」页面
  • 复制「应用签名密钥证书」分类下的SHA256值,添加到Firebase控制台项目设置的对应Android应用配置中
  • 重新下载google-services.json替换项目内的旧文件,重新打包上架即可

2. 版本升级带来的自动验证逻辑兼容问题

@react-native-firebase/auth从v12.5.0版本开始调整了短信验证的默认逻辑,新增了自动短信检索功能:如果设备的谷歌服务成功读取到验证码短信,会自动完成身份校验,此时你存在状态中的confirm对象会直接失效,用户再手动输入验证码调用confirm()就会返回session过期报错,这也是你部分场景失败、部分场景成功的核心原因。

两种修复方案二选一即可:

  • 保留自动验证功能:添加auth().onAuthStateChanged()监听,当监听到用户登录成功的回调时,直接跳过手动输码步骤,跳转至后续业务页面
  • 关闭自动验证功能:调用signInWithPhoneNumber时传入第三个参数关闭自动验证,完全走手动输码逻辑,代码调整如下:
async function signInWithPhoneNumber() {
  console.log('Inside the Phone Number +91', registration_id);
  try {
    // 第三个参数设为true,关闭自动短信验证
    const confirmation = await auth().signInWithPhoneNumber(
      '+91' + registration_id,
      undefined,
      true
    );
    setConfirm(confirmation);
  } catch (_error) {
    console.log(_error);
  }
}

3. 代码逻辑隐患修复

你提供的代码中confirm、result、uid未声明作用域,大概率是全局变量或者未正确用状态管理:

  • 建议将confirm对象存入useState中,避免页面重渲染、应用切后台再切回时变量丢失,调用了已经失效的旧confirm对象
  • 补充重发验证码逻辑,用户点击重发时,将上一次confirmation对象的verificationId作为forceResendingToken传给signInWithPhoneNumber,避免生成多份有效session导致旧session失效

4. Safety Net 校验兼容

v12.8.0版本默认启用了Safety Net校验,部分没有安装谷歌服务、或者过不了Safety Net校验的设备会触发验证失败:

  • 可以先在android/app/src/main/AndroidManifest.xml中添加配置关闭Safety Net校验测试是否恢复正常:
<meta-data
  android:name="firebase_auth_phone_verification_enable_safetynet"
  android:value="false" />
  • 若需要保留Safety Net功能,去Firebase控制台「身份验证 > 设置 > Safety Net」页面确认所有环境的SHA256都已经正确添加

所有修改完成后,先打本地release包测试全场景验证通过后,再上架Play商店即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:36:01