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

React Native Expo生产构建中Firebase谷歌登录后崩溃问题

React Native生产构建Google登录崩溃问题排查与解决

问题现象

  • 仅在生产构建中,选择Google账号完成登录流程后应用直接崩溃;Expo开发构建无任何异常
  • 崩溃发生在执行auth().signInWithCredential(googleCredential)后,无后续日志输出
  • 重启应用后checkedSignIn功能正常,说明登录已成功,但Firestore未创建对应用户文档

相关代码片段

useAuth钩子中的Google登录逻辑

const signInWithGoogle = async () => {
  try {
    setLoading(true);
    await GoogleSignin.hasPlayServices({ showPlayServicesUpdateDialog: true });
    const { idToken } = await GoogleSignin.signIn();
    const googleCredential = auth.GoogleAuthProvider.credential(idToken);
    const { user } = await auth().signInWithCredential(googleCredential);
    await setUserInFirestore(user);
  } catch (error) {
    setError(error);
    console.log("Error signing in with Google:", error);
  }
};

Firestore用户创建逻辑

const setUserInFirestore = async (user) => {
  const { uid, displayName, email, photoURL } = user;

  try {
    const userRef = doc(db, "users", uid);
    const snapshot = await getDoc(userRef);

    if (!snapshot.exists()) {
      await setDoc(userRef, {
        displayName,
        email,
        photoURL,
        uid,
        subscription: null,
      });
    }

    setUser(user);
    setUserContext(user);
  } catch (error) {
    console.log("Error adding user to Firestore:", error.message);
    navigation.navigate(routes.WELCOME);
  } finally {
    setLoading(false);
  }
};

版本信息

  • React Native: 0.71.8
  • Expo: ~48.0.15
  • @react-native-firebase/app: ^17.4.3
  • @react-native-firebase/auth: ^17.4.3
  • @react-native-google-signin/google-signin: ^9.0.2
  • Firebase: ^9.21.0

解决建议

1. 检查Google Sign-In生产环境配置

  • 登录Google Cloud Console,确认生产环境的SHA-1证书指纹已添加到对应的OAuth 2.0客户端ID中
  • 确保项目中使用的google-services.json(Android)或GoogleService-Info.plist(iOS)是生产环境的配置文件,而非开发环境版本

2. 验证Firebase权限规则

  • 检查Firebase控制台的Firestore规则,确保生产环境允许已认证用户访问:
    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        match /users/{userId} {
          allow read, write: if request.auth != null && request.auth.uid == userId;
        }
      }
    }
    
  • 确认Auth规则未限制生产环境的登录行为

3. 完善错误捕获与状态管理

  • 修改signInWithGoogle函数,添加finally块确保加载状态重置,避免崩溃后加载状态残留:
    const signInWithGoogle = async () => {
      try {
        setLoading(true);
        await GoogleSignin.hasPlayServices({ showPlayServicesUpdateDialog: true });
        const { idToken } = await GoogleSignin.signIn();
        const googleCredential = auth.GoogleAuthProvider.credential(idToken);
        const { user } = await auth().signInWithCredential(googleCredential);
        await setUserInFirestore(user);
      } catch (error) {
        setError(error);
        console.log("Error signing in with Google:", error);
      } finally {
        setLoading(false); // 无论成功失败都重置加载状态
      }
    };
    
  • 集成原生崩溃日志工具(如Firebase Crashlytics),捕获生产环境的崩溃堆栈信息

4. 排查依赖兼容性问题

  • 检查@react-native-google-signin/google-signin与@react-native-firebase/auth的版本适配性,尝试升级到与Expo 48兼容的稳定版本
  • 执行npm install或yarn install重新安装依赖,确保依赖版本一致

5. 清理原生构建缓存

  • Android:执行cd android && ./gradlew clean后重新构建生产包
  • iOS:删除~/Library/Developer/Xcode/DerivedData目录,重新编译生产构建

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 18:23:16