React Native Firebase 用户状态持久化失效问题解决方案

firebase sdk 10.0.0 存在认证状态持久化 bug,导致 react native 应用重启后 `currentuser` 丢失;升级至 v10.1.0+ 即可修复,无需额外配置持久化策略。

在使用 Expo + React Native + Firebase 构建身份认证应用时,开发者常期望用户登录后即使关闭并重新打开 App,auth.currentUser 仍能自动恢复(即“状态持久化”)。然而,如你所遇——onAuthStateChanged 在冷启动时返回 null,说明 Firebase 未正确从本地存储(如 AsyncStorage)恢复认证状态。

根本原因:Firebase JavaScript SDK v10.0.0 中存在一个已知缺陷(GitHub Issue #7063),导致其在 React Native 环境下未能正确初始化持久化认证状态,尤其影响 getAuth() 初始化后的首次监听行为。尽管 Firebase 默认启用 local 持久化(等效于 Persistence.LOCAL),该版本无法可靠读取本地凭证。

解决方案:升级 Firebase SDK

将 Firebase 相关包升级至 v10.1.0 或更高版本(推荐最新稳定版):

npm install firebase@^10.12.0
# 或使用 yarn
yarn add firebase@^10.12.0
⚠️ 注意:需同步升级所有 Firebase 子包(如 @firebase/auth, @firebase/app),建议通过 firebase 主包统一安装,避免版本不一致。

升级后,你的现有代码无需任何修改即可正常工作:

// AuthContext.js(保持不变)
import { onAuthStateChanged, getAuth } from "firebase/auth";
import firebase_app from "../firebase/config";
const auth = getAuth(firebase_app); // ✅ v10.1.0+ 自动启用可靠持久化

React.useEffect(() => {
  const unsubscribe = onAuthStateChanged(auth, (user) => {
    setUser(user);        // 登录态将在冷启动后自动恢复
    setLoading(false);
  });
  return unsubscribe;
}, []);

? 补充说明与最佳实践

  • Firebase v10.1.0+ 已默认为 React Native 启用 LOCAL 持久化,无需手动调用 setPersistence(auth, browserLocalPersistence)(该 API 在 RN 中不可用);
  • 若你曾尝试手动设置持久化,请移除相关代码,避免冲突;
  • 确保 firebase-app 初始化(initializeApp)在 onAuthStateChanged 订阅前完成,且全局唯一;
  • 可通过 console.log(auth.currentUser) 验证冷启动后是否非空;若仍为 null,请检查是否误用了 Web 版持久化 API 或存在多实例初始化。

总结:这不是 React Native 或 Expo 的

兼容性问题,而是 Firebase v10.0.0 的临时性 SDK 缺陷。升级是唯一简洁、安全、符合官方推荐的解决路径。