
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 缺陷。升级是唯一简洁、安全、符合官方推荐的解决路径。










