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
相关产品推荐
相关产品推荐

