作者:莫乂乂_465 | 来源:互联网 | 2023-02-13 18:09
我在React Native iOS应用程序中使用Firebase,主要用于存储用户数据和用户身份验证,当设备实际具有有效的网络连接时,该功能非常有用.
说到Firebase的离线功能,它看起来像这样:
问题:用户启动没有网络连接的应用程序无法执行任何操作,因为他们从未登录过
以下是重现此行为的步骤:
第1步:注销用户启动具有网络连接的应用程序
用户点击"Facebook登录"按钮
Firebase使用Facebook身份验证登录
onAuthStateChanged (user)
正在使用登录用户作为参数调用
获得的令牌user.getToken()
被发送到我的服务器,该服务器生成一个自定义令牌(generatedToken
),可用于登录Firebase身份验证使用signInWithCustomToken (generatedToken)
,因此保存在本地存储中
用户愉快地读取和写入Firebase数据库,更改立即与Firebase服务器同步
第2步:登录用户启动具有网络连接的应用程序
应用程序意识到generatedToken
在本地存储中有一个
generatedToken
是用来 firebase.auth().signInWithCustomToken (..)
(与步骤1.3相同)
(与步骤1.4相同)
(与步骤1.5相同)
网络连接丢失:用户仍然登录(onAuthStateChanged (user)
未与所谓null
的user
,喜欢它的后的情况下手动注销),因此仍然可以读写到火力地堡数据库
网络连接已恢复:更改与Firebase服务器同步
第3步:登录用户启动应用程序,无需网络连接
应用程序意识到generatedToken
在本地存储中有一个
generatedToken
是用来 firebase.auth().signInWithCustomToken (..)
firebase.auth().signInWithCustomToken (..)
失败,因为没有网络连接
onAuthStateChanged (user)
被称为与null
作为user
用户根本无法使用Firebase数据库,因为所有读/写请求都因缺少身份验证而失败
尝试的解决方案
在初始化之后persistenceEnabled
立即true
在Objective-C/AppDelegate.m中设置FIRApp
:
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// ...
[FIRApp configure];
[FIRDatabase database].persistenceEnabled = YES;
// ...
}
这不会导致期望的结果,并且(至少在我的情况下)在Firebase的行为方面不会改变任何内容.
---你的建议---
感谢您的投入!
1> Salakar..:
虽然Firebase JS SDK很棒并且通常在React Native中工作,但它主要是为Web平台构建的,因此不是在React Native环境中使用的最全面的解决方案,例如,有很多Firebase服务你将无法使用与Web SDK一起使用.请参阅此处的比较表.
但是,您可以使用原生Android/iOS Firebase SDK运行,并在它们和Javascript代码之间建立桥梁(即反应原生模块).
值得庆幸的是,您不必自己实现,因为已经有模块为您执行此操作:
例如,react-native-firebase镜像了Javascript端的Web SDK API,但使用原生的Android和iOS Firebase SDK在本机端执行.它与您可能已经实现的任何现有Firebase Web SDK逻辑兼容,旨在作为Web SDK的替代品.
该库支持具有auth持久性和脱机功能的用例:
import firebase from 'react-native-firebase';
const instance = firebase.initializeApp({
persistence: true
});
// can also use `keepSynced` / `setPersistence` methods:
// instance.database().ref('/someref').keepSynced();
// instance.database().setPersistence(true);
export default instance;