【问题标题】:Firebase + React Native: Offline authenticationFirebase + React Native:离线身份验证
【发布时间】:2017-06-13 04:26:09
【问题描述】:

我在 React Native iOS 应用程序中使用 Firebase,主要用于存储用户数据和用户身份验证,当设备实际具有有效的网络连接时效果很好。

谈到 Firebase 的离线功能,它看起来像这样:

问题:在没有网络连接的情况下启动应用程序的用户无法执行任何操作,因为他们从未登录过

以下是重现此行为的步骤:

第 1 步:已注销的用户在具有网络连接的情况下启动应用

  1. 用户点击“Facebook登录”按钮
  2. Firebase 使用 Facebook 身份验证登录
  3. onAuthStateChanged (user) 以登录用户为参数调用
  4. user.getToken() 获得的令牌被发送到我的服务器,它会生成一个自定义令牌 (generatedToken),可用于使用 signInWithCustomToken (generatedToken) 登录 Firebase 身份验证,因此保存在本地存储中
  5. 用户愉快地读写 Firebase 数据库,更改会立即与 Firebase 服务器同步

第 2 步:登录用户启动应用 网络连接

  1. 应用意识到本地存储中有一个generatedToken
  2. generatedToken 用于firebase.auth().signInWithCustomToken (..)
  3. (同步骤 1.3)
  4. (与步骤 1.4 相同)
  5. (同步骤 1.5)
  6. &写入 Firebase 数据库
  7. 网络连接已恢复:更改与 Firebase 服务器同步

第 3 步:登录用户在没有网络连接的情况下启动应用

  1. 应用意识到本地存储中有一个generatedToken
  2. generatedToken 用于firebase.auth().signInWithCustomToken (..)
  3. firebase.auth().signInWithCustomToken (..) 失败,因为没有网络连接
  4. onAuthStateChanged (user) 被称为 null 作为 user
  5. 用户根本无法使用 Firebase 数据库,因为所有读/写请求都因缺少身份验证而失败

尝试的解决方案

  1. 在初始化 FIRApp 之后,在 Objective-C / AppDelegate.m 中将 persistenceEnabled 设置为 true

    (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
      // ...
      [FIRApp configure];
      [FIRDatabase database].persistenceEnabled = YES;
      // ...
    }
    

    这不会导致预期的结果,并且(至少在我的情况下)在 Firebase 的行为方面没有任何改变。

  2. ---您的建议在这里---

感谢您的意见!

【问题讨论】:

    标签: firebase react-native firebase-realtime-database firebase-authentication offline


    【解决方案1】:

    虽然 Firebase JS SDK 很棒并且通常在 React Native 中工作,但它主要是为 Web 平台构建的,因此不是在 React Native 环境中使用的最全面的解决方案,例如。有很多 Firebase 服务将无法与 Web SDK 一起使用。见对照表here

    但是,您可以使用原生 Android/iOS Firebase SDK 运行,并在它们和您的 JavaScript 代码(即反应原生模块)之间架起一座桥梁。

    谢天谢地,您不必自己实现此功能,因为已经有模块可以为您执行此操作:

    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 的作者)

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-10
    • 2017-07-12
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 2021-10-31
    相关资源
    最近更新 更多