Firebase + React Native:离线身份验证

2024-02-20

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

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

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

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

第 1 步:注销用户启动应用程序with网络连接

  1. 用户点击“Facebook 登录”按钮
  2. Firebase 使用 Facebook 身份验证登录
  3. onAuthStateChanged (user) https://firebase.google.com/docs/reference/js/firebase.auth.Auth#onAuthStateChanged正在以登录用户作为参数进行调用
  4. 获得的令牌user.getToken()发送到我的服务器,该服务器生成一个自定义令牌(generatedToken)可用于使用以下方式登录 Firebase 身份验证signInWithCustomToken (generatedToken) https://firebase.google.com/docs/reference/js/firebase.auth.Auth#signInWithCustomToken因此保存在本地存储中
  5. 用户愉快地读取和写入 Firebase 数据库,更改会立即与 Firebase 服务器同步

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

  1. 应用程序意识到有一个generatedToken在本地存储中
  2. generatedToken是用来firebase.auth().signInWithCustomToken (..)
  3. (同步骤1.3)
  4. (同步骤1.4)
  5. (与步骤1.5相同)
  6. 网络连接丢失: 用户仍处于登录状态 (onAuthStateChanged (user)没有被调用null as a user,就像之后的情况一样手动退出 https://firebase.google.com/docs/reference/js/firebase.auth.Auth#signOut),因此仍然可以读取和写入 Firebase 数据库
  7. 网络连接已恢复:更改与 Firebase 服务器同步

第 3 步:登录用户启动应用程序without网络连接

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

尝试的解决方案

  1. Setting persistenceEnabled to true在 Objective-C / AppDelegate.m 中,初始化之后FIRApp:

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

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

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

感谢您的投入!


虽然 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(使用前将#替换为@)

Firebase + React Native:离线身份验证 的相关文章

  • Eclipse IDE - 错误:构建路径指定执行环境 Java SE 1.7

    在 Eclipse 中 我收到一个错误 构建路径指定执行环境Java SE 1 7 工作区中没有安装与此环境严格兼容的 JRE 尝试这个 In Eclipse your project gt properties gt java build
  • 如何在 C# 中使用 Selenium WebDriver 获取当前窗口的 URL?

    在我的应用程序中 登录时 它会导航到另一个页面 现在我需要在 selenium C 中使用 WebDriver 获取新的 URL 我找不到任何函数来执行此操作 我努力了driver Url driver getLocation and dr
  • 我可以在某些网格中打印带有颜色的 pandas 数据框吗?

    我有一个 pandas DataFrame 我想突出显示一些数据 例如 In 1 import pandas as pd In 2 import numpy as np In 3 df pd DataFrame np reshape ran
  • 使用 mongoimport 从 Windows 文件夹批量导入 MongoDB

    我的存档中有很多 json 文件 我需要将它们导入到 mongo 每一个操作中 我认为它可能是循环的 你对此有什么想法吗 如果您使用的是 Linux Unix shell 您可以尝试 for filename in do mongoimpo
  • Jsplitpane 自动调整大小

    我有一个 JSPlitPane 它们之间有 50 的分隔线 这工作正常 但是 当我在右侧添加一些 JLabels 时 jsplitpane 会忽略我的 50 分隔符 左侧窗格会增加其大小 并会挤压右侧窗格 为什么会发生这种情况以及如何解决
  • 如何使用 Typescript 将 jest.spyOn 与 React 函数组件一起使用

    我正在使用 Typescript 和 hooks 开发一个 React 应用程序 并且尝试使用 Enzyme 和 Jest 来测试功能组件 我无法使用 jest spyOn 来测试我的组件中的方法 jest spyOn 方法无法正确解析并在
  • 同时使用多个控制台

    是否有捷径可寻 我现在仅使用控制台测试我的网络应用程序 最好的办法是从一个项目中拥有多个控制台 然后按一下 立即调试 菜单项 我可以像过去一样使用多个项目 但这似乎很笨拙 理想情况下 我可以启动多个控制台实例 从同一线程运行很好 并且让它们
  • 无法使用 Struts 2 重定向 JSP 文件并显示值

    我创建了一个简单的程序 使用文本字段获取用户的名字和姓氏 但问题是 当我单击提交按钮时 我无法将其重定向到另一个显示用户名字和姓氏的 jsp 文件 这是我的HelloAction class package com novamsc trai
  • printf 右对齐括号内的数字

    我正在编写一个程序 显示数组中的所有信息 它必须以括号中的数组索引开头 例如 2 并且它们必须彼此正确对齐 如果只是数字 我知道你可以这样做 printf 10d index 但是用括号括起来会得到以下输出 1 2 10 11 当我真正希望
  • 如何获取 git 存储库中所有文件的计数?

    如何获取 git 存储库中当前所有文件的计数 您可以使用以下命令获取 git 存储库中所有跟踪文件的计数 git ls files wc l 命令分解 The git ls files命令本身打印出存储库中所有跟踪文件的列表 每行一个 Th
  • 解析函数是否异步传递给 Promise 执行器?

    我有以下代码 function myPromiseFunc return new Promise resolve gt resolve Promise resolve 123 据我们所知Promise resolve方法立即用普通值解析 P
  • 网站可以检测您何时将 Selenium 与 chromedriver 结合使用吗?

    我一直在使用 Chromedriver 测试 Selenium 我注意到有些页面可以检测到您正在使用 Selenium 即使根本没有自动化 即使我只是通过 Selenium 使用 Chrome 手动浏览 Xephyr https en wi
  • 如何使用 Spring Security 手动注销用户?

    也许答案很简单 如何在 Spring Security 中手动注销当前登录的用户 拨打电话是否足够 SecurityContextHolder getContext getAuthentication setAuthenticated fa
  • VSTS部署IIS应用程序winrm并更改appsettings.json

    我正在使用 部署 IIS 应用程序 winrm 任务在另一台计算机上部署 IIS 应用程序 此任务部署 zip 文件 在此 zip 中有一个 appsettings json 其变量以下划线开头和结尾 我需要替换每个环境的 appsetti
  • 为什么 JDOM 的 getChild() 方法返回 null?

    我正在做一个关于 html 文档操作的项目 我想要现有 html 文档中的正文内容将其修改为新的 html 现在我正在使用 JDOM 我想在我的编码中使用 body 元素 为此 我在编码中使用了 getChild body 但它向我的程序返
  • C++ 中带逗号的表达式的执行顺序 [重复]

    这个问题在这里已经有答案了 我的理解是这个词j i将在之前执行 i在声明中 j i i C 标准是否保证j i将在之前执行 i在循环 for auto i std next begin j begin i end j i i 逗号运算符引入
  • 如何将 pygame Surface 转换为 PIL 图像?

    我正在使用 PIL 来透视地变换屏幕的一部分 原始图像数据是一个 pygame Surface 需要转换为 PIL 图像 因此我发现了 pygame 的 tostring 函数就是为了这个目的而存在的 然而结果看起来很奇怪 见附图 这段代码
  • Ansible - 任务系列 1 逆序

    我想创建两本剧本 一本用于停止环境 另一本用于启动它 环境的一部分是 RabbitMQ 集群 对于其停止 启动顺序非常重要 特别是最后一个停止的节点需要是第一个启动的节点 我想知道是否有一种方法可以指定针对组运行任务的相反顺序 这样我就可以
  • 变量前面的@是什么意思? [复制]

    这个问题在这里已经有答案了 可能的重复 参考 这个符号在 PHP 中意味着什么 https stackoverflow com questions 3737139 reference what does this symbol mean i
  • localStorage 获取 NULL?

    我不知道为什么 因为我之前已经这样做过并且工作正常 我认为这可能是因为浏览器问题 错误 localStorage setItem foo bar alert localStorage getItem foo 我使用的是 Firefox 3

随机推荐

  • 为什么编译器在没有闭包的情况下为委托添加额外的参数?

    我正在玩delegates并注意到当我创建一个Func
  • 如何解析Python库中的数据包? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 如何使用 python 从 pcap 文件或接口解析数据包 我正在专门寻找一个使用记录良好的库的解决方案
  • 如何以编程方式更改默认声音播放设备?

    如何以编程方式更改 vista 中播放和录制的默认音频设备 是否有像Windows XP中的声音管理器那样的注册表设置 哪个 API 可以实现 系统托盘音频设备切换器使用 Software Microsoft Multimedia Soun
  • 零寄存器如何提高性能?

    在 MIPS ISA 中 有一个零寄存器 r0 始终给出零值 这允许处理器 任何产生要被丢弃的结果的指令都可以将其目标定向到该寄存器 成为一个来源0 据说在这source https web archive org web 20170328
  • 使用 pyspark 结构化流计算移动平均列

    我正在使用 pyspark 处理一些传入的流数据 我想向我的数据帧添加一个具有 50 秒移动平均值的新列 我尝试使用带有 rangeBetween 的 Window 规范 import pyspark sql window as W w W
  • 导入 mysql.connector ModuleNotFoundError:没有名为“mysql.connector”的模块; “mysql”不是一个包

    导入 mysql connector ModuleNotFoundError 没有名为 mysql connector 的模块 mysql 不是一个包 pip 安装 mysql connector python rf python版本 3
  • 无法显示希腊字符 .mdb 文件(PHP 和 ODBC)

    我在显示 MS Access 2007 表中希腊语列中的文本时遇到问题 我正在使用 PHP 和 dbc odbc pconnect Driver Microsoft Access Driver mdb Dbq mdbFilename use
  • 使用 PHP 分块传输 FTP 上传?

    是否可以使用 PHP 进行 FTP 上传 我有文件需要上传到另一台服务器 但我只能通过 FTP 访问该服务器 不幸的是 我无法增加该服务器上的超时时间 有可能做到这一点吗 基本上 如果有一种方法可以写入文件的一部分 然后附加下一部分 并重复
  • 如何使用图像代替box-shadow来达到类似的效果?

    我想要实现如下图所示的框阴影效果 图片在这里 https i stack imgur com BpqGM png 但是我不想使用css3box shadow财产 这是因为我正在构建一个phonegap android应用程序 并且在使用时存
  • 使用react-loadable延迟加载组件的动态路径导入

    我正在使用 create react app 创建一个应用程序 并使用 React loadable 延迟加载组件 我想要做的是导入加载器对象或react loadble模块的Loadable函数的动态路径 Code const Loada
  • npm install 缺少模块

    在我能跑之前gulp在我的项目中我需要运行npm install 除了在我的计算机上之外 这都有效 因为我收到以下错误 Error Cannot find module socket io at Function Module resolv
  • 加密会话变量有安全方面的好处吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 所有字母的正则表达式

    我需要所有字母表的正则表达式 我有一个输入和目标文本 它们都可以属于不同的字母表 我的意思是它们可以属于中文 拉丁文 西里尔文和任何其他字母 我需要一个用于多语言输入和多语言目标文本的正则表达式 有人对此有任何想法吗 我该如何编写这个正则表
  • 容器中的共享库

    对于两个进程A和B 都使用库libc so libc so只加载到内存一次 当 A 和 B 都运行在同一主机和同一 rootfs 上时 这是正常情况 对于容器来说 如果A和B运行在不同的容器中 A和B是否共享相同的内存区域 例如 image
  • 在scala Spark2中运行saveAsNewAPIHadoopDataset到hbase时出现空指针异常

    我正在使用 saveAsNewAPIHadoopDataset 将 RDD 保存到 Hbase 中 以下是我的工作创建和提交 val outputTableName test3 val conf2 HBaseConfiguration cr
  • Excel VBA - 连接两个数组

    我需要将两个数组 vd 和 vd1 连接到 vdu 中 ReDim vdu 1 To UBound vd 1 UBound vd1 1 1 To 1 For i 1 To UBound vd 1 vdu i 1 vd i 1 Next i
  • VB 中的 With 语句中有多个对象吗?

    我在 VB 中使用了很多标签With语句来设置它们的属性 Problem有什么办法我可以做类似以下的事情 With lblA lblB lblC fontColor color Red End With 这可能吗 还是我必须手动执行With
  • 删除 BeautifulSoup 分解后变空的行

    我试图从文件中删除某些 HTML 标签及其内容BeautifulSoup 如何删除应用后变为空的行decompose 在这个例子中 我想要之间的线a and 3消失 因为这是 span span 块了 但到底不行 from bs4 impo
  • Django ..“加入”查询?

    伙计们 Django 中的 join 查询如何或在哪里 我认为 Django 没有 加入 但是我将如何加入 Thanks 如果您使用模型 则 select lated 方法将返回您在该模型中设置的任何外键 最多达到您指定的限制 的对象
  • Firebase + React Native:离线身份验证

    我在 React Native iOS 应用程序中使用 Firebase 主要用于存储用户数据和用户身份验证 效果很好当设备确实有可用的网络连接时 当谈到Firebase的离线功能时 它看起来像这样 问题 在没有网络连接的情况下启动应用程序