Firebase + React Native:离线身份验证

时间:2017-01-27 13:14:13

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

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

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

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

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

第1步:注销用户使用网络连接启动应用

  1. 用户点击“Facebook登录”按钮
  2. Firebase使用Facebook身份验证登录
  3. 使用登录用户作为参数
    调用
  4. onAuthStateChanged (user)user.getToken()获取的
  5. 令牌会发送到我的服务器,该服务器会生成一个自定义令牌(generatedToken),可用于使用signInWithCustomToken (generatedToken)登录Firebase身份验证,因此会保存在本地存储
  6. 用户愉快地读取和写入Firebase数据库,更改立即与Firebase服务器同步
  7. 第2步:登录用户使用网络连接启动应用

    1. app意识到本地存储中有generatedToken
    2. generatedToken用于firebase.auth().signInWithCustomToken (..)
    3. (与步骤1.3相同)
    4. (与步骤1.4相同)
    5. (与步骤1.5相同)
    6. 网络连接丢失:用户仍然已登录(onAuthStateChanged (user)未使用null作为user进行调用,就像generatedToken之后的情况一样{3}})因此仍然可以阅读&写入Firebase数据库
    7. 网络连接已恢复:更改与Firebase服务器同步
    8. 第3步:登录用户启动应用,无网络连接

      1. app意识到本地存储中有generatedToken
      2. firebase.auth().signInWithCustomToken (..)用于firebase.auth().signInWithCustomToken (..)
      3. onAuthStateChanged (user)失败,因为没有网络连接
      4. 正在使用null作为user 调用
      5. persistenceEnabled
      6. 用户根本无法使用Firebase数据库,因为由于缺少身份验证而导致所有读/写请求失败
      7. 尝试的解决方案

        1. 在初始化true后立即在Objective-C / AppDelegate.m中将FIRApp设置为(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // ... [FIRApp configure]; [FIRDatabase database].persistenceEnabled = YES; // ... }

          /_template?pretty

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

        2. ---您的建议---

        3. 感谢您的投入!

1 个答案:

答案 0 :(得分:13)

虽然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& amp;在本机端执行。 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;

(免责声明:我是react-native-firebase的作者)