英文:
Expo SDK 48 broke Firebase Auth
问题
我刚刚升级到Expo SDK 48,似乎每次刷新后都会注销我的登录状态。我降级回SDK 47,一切都正常工作。我使用的是firebase v9(v9.17.1),通过expo install而不是yarn进行安装。
我升级到Expo 48的步骤如下:
- 更新到最新版本的EAS CLI:npm i -g eas-cli。
- 安装新版本的Expo包:yarn add expo@^48.0.0。
- 升级所有依赖以匹配SDK 48:npx expo install --fix。
- 检查项目依赖中可能存在的问题:npx expo-doctor。
- 升级到最新版本的firebase web sdk:expo install firebase。
- 删除node modules、yarn.lock文件并重新安装所有内容。
我漏掉了什么?
我在发布说明中找不到可以帮助我的信息。
英文:
I have just upgraded to Expo SDK 48 and it seems I am logged out after every refresh.
I downgraded back to SDK 47, and everything works as expected.
I am using firebase v9 (v9.17.1), installed with expo install not with yarn.
Steps I followed for upgrading to Expo 48:
- Update to the latest version of EAS CLI: npm i -g eas-cli.
- Install the new version of the Expo package: yarn add expo@^48.0.0
- Upgrade all dependencies to match SDK 48: npx expo install --fix
- Check for any possibly issues in your project dependencies: npx
expo-doctor - Upgraded to the latest version of the firebase web sdk: expo install firebase
- delete node modules, yarn.lock and reinstall everything
What am I missing ?
I could't find anything on the release notes that can help me.
答案1
得分: 13
我认为我找到了问题。Firebase使用了一个已弃用的AsyncStorage版本,显然在SDK 48中被移除。
我能够通过以下方式修复它(更多测试正在进行中):
import AsyncStorage from "@react-native-async-storage/async-storage";
import {getReactNativePersistence, initializeAuth} from 'firebase/auth/react-native';
initializeAuth(app, {
persistence: getReactNativePersistence(AsyncStorage);
});
通过persistence
选项,您告诉Firebase使用“本地”AsyncStorage,即当前RN应用中存在的AsyncStorage。
英文:
I think I found the problem. Firebase uses a deprecated version of AsyncStorage, which apparently was removed in SDK 48.
I was able to fix it (more testing is ongoing) with this:
import AsyncStorage from "@react-native-async-storage/async-storage";
import {getReactNativePersistence, initializeAuth} from 'firebase/auth/react-native';
initializeAuth(app, {
persistence: getReactNativePersistence(AsyncStorage);
});
With the persistence
node, you tell Firebase to use the "native" AsyncStorage, i.e. the AsyncStorage that is present in current RN apps.
答案2
得分: 0
请看一下捕获登录事件(onAuthStateChanged()
)的代码,以及您如何缓存其结果(通常是通过设置状态变量中的user
值),然后查看您的应用在代码刷新发生时的行为。
我敢打赌,这可能是 Expo 48(或更可能是其底层的 React 或 React-Native 版本)中的行为变化,但这并不是“错误”的。相反,我敢打赌,您的代码在 48 版之前“运行正常”,但实际上并不正确。
考虑发布一些关于您如何调用 onAuthStateChanged()
以及如何使用其返回值来呈现您的用户界面的代码。
英文:
Take a look at the code where you are capturing the login event (onAuthStateChanged()
) and how you are caching its results (typically by setting the user
value in a state variable) and see how your app is behaving when code refreshes are happening.
My bet is that this might be a behaviour change in how Expo 48 (or more likely its underlying React or React-Native version) has, but that it isn't "wrong". Instead, my bet is that your code was "working" under pre-48 but that it wasn't/isn't actually correct.
Consider posting some code around where/how you are calling onAuthStateChanged(), and how you are using the value returned by it to render your UI.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论