Firebase+;反应本机:脱机身份验证

Firebase+;反应本机:脱机身份验证,firebase,react-native,firebase-realtime-database,firebase-authentication,offline,Firebase,React Native,Firebase Realtime Database,Firebase Authentication,Offline,我在React本机iOS应用程序中使用Firebase,主要用于存储用户数据和用户身份验证,当设备实际具有工作网络连接时,这非常有效 说到Firebase的离线功能,它看起来是这样的: 问题是:没有网络连接就启动应用程序的用户不能做任何事情,因为他们从未登录过 以下是重现这种行为的步骤: 步骤1:注销用户启动具有网络连接的应用程序 用户点击“Facebook登录”按钮 Firebase使用Facebook身份验证登录 正在以登录用户作为参数调用 user.getToken()获得的令牌被发送到我

我在React本机iOS应用程序中使用Firebase,主要用于存储用户数据和用户身份验证,当设备实际具有工作网络连接时,这非常有效

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

问题是:没有网络连接就启动应用程序的用户不能做任何事情,因为他们从未登录过 以下是重现这种行为的步骤:

步骤1:注销用户启动具有网络连接的应用程序
  • 用户点击“Facebook登录”按钮
  • Firebase使用Facebook身份验证登录
  • 正在以登录用户作为参数调用
  • user.getToken()
    获得的令牌被发送到我的服务器,该服务器生成一个自定义令牌(
    generatedToken
    ),可用于使用登录Firebase auth,因此保存在本地存储中
  • 用户愉快地读写Firebase数据库,更改立即与Firebase服务器同步
  • 步骤2:登录用户启动具有网络连接的应用程序
  • 应用程序意识到本地存储中有一个
    generatedToken
  • generatedToken
    用于
    firebase.auth().signiWithCustomToken(..)
  • (与步骤1.3相同)
  • (与步骤1.4相同)
  • (与步骤1.5相同)
  • 网络连接丢失:用户仍在登录(
    onAuthStateChanged(用户)
    未以
    用户
    的身份调用
    null
    ,就像之后的情况一样),因此仍然可以读写Firebase数据库
  • 恢复网络连接:更改与Firebase服务器同步
  • 步骤3:登录用户在没有网络连接的情况下启动应用程序
  • 应用程序意识到本地存储中有一个
    generatedToken
  • generatedToken
    用于
    firebase.auth().signiWithCustomToken(..)
  • firebase.auth().signInWithCustomToken(..)
    失败,因为没有网络连接
  • onAuthStateChanged(用户)
    正在以
    user
    的身份调用
    null
  • 用户根本无法使用Firebase数据库,因为所有读/写请求都因缺少身份验证而失败
  • 尝试的解决方案
  • 在初始化
    FIRApp
    之后,将Objective-C/AppDelegate.m中的
    persistenceEnabled
    设置为
    true

    (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一起使用。见对照表

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

    谢天谢地,您不必自己实现这一点,因为已经有一些模块可以为您实现这一点:

    例如,在JavaScript端镜像web SDK API,但在本机端使用本机Android和iOS Firebase SDK执行。它与您可能已经实现的任何现有Firebase Web SDK逻辑兼容,并打算作为Web SDK的替代品

    此库通过身份验证持久性和脱机功能支持您的用例:

    从“react native firebase”导入firebase;
    const instance=firebase.initializeApp({
    坚持:真的
    });
    //也可以使用'keepSynced`/'setPersistence`方法:
    //instance.database().ref('/someref').keepSynced();
    //instance.database().setPersistence(true);
    
    导出默认实例
    在最新版本中,您需要在本机代码中执行此初始化,如中所述