我在 React Native iOS 应用程序中使用 Firebase,主要用于存储用户数据和用户身份验证,效果很好当设备确实有可用的网络连接时.
当谈到Firebase的离线功能时,它看起来像这样:
问题:在没有网络连接的情况下启动应用程序的用户无法执行任何操作,因为他们从未登录过
以下是重现此行为的步骤:
第 1 步:注销用户启动应用程序with网络连接
- 用户点击“Facebook 登录”按钮
- Firebase 使用 Facebook 身份验证登录
-
onAuthStateChanged (user) https://firebase.google.com/docs/reference/js/firebase.auth.Auth#onAuthStateChanged正在以登录用户作为参数进行调用
- 获得的令牌
user.getToken()
发送到我的服务器,该服务器生成一个自定义令牌(generatedToken
)可用于使用以下方式登录 Firebase 身份验证signInWithCustomToken (generatedToken) https://firebase.google.com/docs/reference/js/firebase.auth.Auth#signInWithCustomToken因此保存在本地存储中
- 用户愉快地读取和写入 Firebase 数据库,更改会立即与 Firebase 服务器同步
第 2 步:登录用户启动应用程序with网络连接
- 应用程序意识到有一个
generatedToken
在本地存储中
-
generatedToken
是用来firebase.auth().signInWithCustomToken (..)
- (同步骤1.3)
- (同步骤1.4)
- (与步骤1.5相同)
-
网络连接丢失: 用户仍处于登录状态 (
onAuthStateChanged (user)
没有被调用null
as a user
,就像之后的情况一样手动退出 https://firebase.google.com/docs/reference/js/firebase.auth.Auth#signOut),因此仍然可以读取和写入 Firebase 数据库
-
网络连接已恢复:更改与 Firebase 服务器同步
第 3 步:登录用户启动应用程序without网络连接
- 应用程序意识到有一个
generatedToken
在本地存储中
-
generatedToken
是用来firebase.auth().signInWithCustomToken (..)
-
firebase.auth().signInWithCustomToken (..)
失败,因为没有网络连接
-
onAuthStateChanged (user)
正在被调用null
as a user
- 用户根本无法使用 Firebase 数据库,因为所有读/写请求由于缺少身份验证而失败
尝试的解决方案
-
Setting persistenceEnabled
to true
在 Objective-C / AppDelegate.m 中,初始化之后FIRApp
:
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// ...
[FIRApp configure];
[FIRDatabase database].persistenceEnabled = YES;
// ...
}
这不会导致预期的结果,并且(至少在我的情况下)不会改变 Firebase 的行为。
--- 您的建议在这里 ---
感谢您的投入!
虽然 Firebase JS SDK 很棒并且通常可以在 React Native 中工作,但它主要是为 Web 平台构建的,因此并不是在 React Native 环境中使用的最全面的解决方案。有相当多的 Firebase 服务无法与 Web SDK 一起使用。见对比表here https://github.com/invertase/react-native-firebase#supported-firebase-features.
但是,您可以使用原生 Android/iOS Firebase SDK 运行,并在它们和 JavaScript 代码(即 React Native 模块)之间建立桥梁。
值得庆幸的是,您不必自己实现此操作,因为已经有模块可以为您执行此操作:
反应本机 Firebase https://github.com/invertase/react-native-firebase例如,在 JavaScript 端镜像 Web SDK API,但使用本机 Android 和 iOS Firebase SDK 在本机端执行。它与您可能已经实现的任何现有 Firebase Web SDK 逻辑兼容,并且旨在作为 Web SDK 的直接替代品。
该库通过身份验证持久性和离线功能支持您的用例:
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;
(免责声明:我是react-native-firebase的作者)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)