我无法在我的反应原生应用程序中保留 firebase 会话。这个问题几乎与React Native - Firebase auth 持久性不起作用但是那里提供的答案对我不起作用。
目前我登录如下所示:
export const loginUser = ({ email, password }) => {
return (dispatch) => {
dispatch({ type: LOGIN_USER });
firebase.auth().signInWithEmailAndPassword(email, password)
.then(user => loginUserSuccess(dispatch, user))
.catch(() => loginUserFailed(dispatch))
};
};
我的会话已创建,并且我有权访问存储在 Firebase 上的用户对象。
当我 Cmd+R 或关闭应用程序并重新打开它时,我的会话消失了。我已经在我的应用程序文件的组件WillMount()部分中运行了以下内容.js:
firebase.auth().onAuthStateChanged((user) => {
if (user) {
console.log('user is logged');
} else {
console.log('not logged in')
}
});
每当我刷新应用程序或完全关闭它并重新打开时,我都会收到"未登录"响应。
我也尝试过查询:
firebase.auth().currentUser
但是得到同样的问题,它返回空
我做错了什么?
有没有一种特殊的方法来保持我缺少的会话处于活动状态?
自从我发布这个问题以来已经有一段时间了,但我想我会发布我的解决方案。
事实证明,我最初的设置(有点)有效。我的意思是onAuthStateChange需要一些时间才能从Firebase收到回复,在此期间,应用程序的其余部分加载时认为用户未登录,因为这是默认状态。
我设法通过将onAuthStateChanged逻辑移出应用程序.js并移动到componentWillMount中的初始主页来解决此问题。 现在看起来像这样:
componentWillMount() {
const { navigate } = this.props.navigation;
firebase.auth().onAuthStateChanged((user) => {
if (user) {
SplashScreen.hide()
this.setState({ loading: false })
this.props.persistedUserLoginSuccess({user, navigate})
this.props.fetchUserData();
} else {
SplashScreen.hide()
this.setState({ loading: false })
}
});
此外,我设法通过强制启动屏幕保持查询身份验证的启动画面来改善用户体验。完成后,初始屏幕将被隐藏,应用程序将作为已登录的应用程序或用户尚未登录的应用程序加载。
这个问题是因为您在登录后没有执行Firebase.auth().signOut()。尝试注销(为了进行测试,您始终可以在组件将挂载函数中注销),您将能够看到 onAuthStateChanged 通知。