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

React Native Expo打包APK后onAuthStateChanged无响应问题求助

问题修复方案

以下是对应问题的排查和解决步骤,按优先级排序:

1. 优先检查Firebase签名配置

  • 问题根源:Expo Go调试时使用的是Expo默认的debug签名,你已经将对应SHA值添加到Firebase控制台的安卓应用配置中,所以运行正常。但生产打包时使用的是自定义/正式签名,对应的SHA-1、SHA-256值未加入Firebase白名单,Firebase会静默拒绝认证请求,导致onAuthStateChanged无回调。
  • 解决操作:
    1. 导出你打包所用keystore的SHA-1和SHA-256值
    2. 打开Firebase控制台,进入对应项目的安卓应用设置页面,将上述SHA值添加到签名配置中
    3. 重新下载google-services.json放到项目根目录,重新打包测试

2. 检查Expo配置注入是否正常

  • 问题根源:你通过Constants.manifest.extra读取Firebase配置,部分Expo build版本在生产打包时如果配置规则不正确,会导致extra字段为空,Firebase初始化参数缺失,服务无法正常启动自然无回调。
  • 解决操作:
    1. 临时修改Loading页的错误提示,打印Constants.manifest.extra.apiKey的值,确认生产环境是否能正常读取配置
    2. 检查app.json/app.config.js是否正确配置了extra字段,如果使用EAS构建,需要同步确认eas.json中的配置规则正确包含extra字段

3. 检查安卓网络权限

  • 问题根源:生产APK默认未申请网络权限,无法访问Firebase服务器,请求无响应导致一直卡Loading。
  • 解决操作:在app.json的android配置项中添加网络权限:
{
  "expo": {
    "android": {
      "permissions": ["INTERNET"]
    }
  }
}

4. 代码逻辑优化

4.1 修复认证回调的兜底逻辑

你当前的代码没有超时兜底机制,一旦请求无响应会永久卡在Loading页,可添加超时逻辑:

useEffect(() => {
  const unsubscribeAuth = auth.onAuthStateChanged(authenticatedUser => {
    try {
      setUser(authenticatedUser ?? null);
      setIsLoading(false);
    } catch (error) {
      console.log(error);
      setErrorMsg(error.message);
      setIsLoading(false);
    }
  });
  // 10秒超时兜底
  const timeout = setTimeout(() => {
    setIsLoading(false);
    setErrorMsg("认证服务连接超时,请检查网络后重试");
  }, 10000);

  return () => {
    unsubscribeAuth();
    clearTimeout(timeout);
  };
}, []);

注:setUser是状态更新函数,本身不是异步方法,不需要加await

4.2 修复登录函数的错误逻辑

你当前的登录函数在登录失败的catch分支里执行了navigation.navigate('Home'),属于逻辑错误,这行代码可以直接删除,登录成功后onAuthStateChanged会自动触发路由切换,不需要手动跳转。


内容的提问来源于stack exchange,提问作者Rob Gleeson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:45:07