【问题标题】:Does Firebase allow an app to start in offline mode?Firebase 是否允许应用以离线模式启动?
【发布时间】:2013-01-18 04:30:17
【问题描述】:

我正在考虑使用 Firebase 编写一个使用 PhoneGap 和 HTML5 应用程序缓存的移动应用程序。

让我们假设每个用户都有一个 TODO 项目列表。如果应用程序在手机离线时启动,它是否能够从上一个会话中加载数据并在建立连接时同步?如果是这样,我想知道这是如何实现的,因为我在 firebase.js 中找不到对 localStorage 的引用。

【问题讨论】:

    标签: offline offline-caching offlineapps firebase


    【解决方案1】:

    简短的回答是:还没有。

    应用连接到 Firebase 后,客户端将在本地缓存数据,并且即使在网络连接丢失后也能够访问存在未完成的“开启”回调的数据。但是,这些数据不会持久化到磁盘,“离线模式”只会在应用程序仍在运行时工作。

    未来将提供完整的离线支持。

    2016 年编辑: 现在可以为原生 iOS 和 Android 应用提供完整的离线支持:https://www.firebase.com/blog/2015-05-29-announcing-mobile-offline-support.html

    【讨论】:

    • 好的,我很期待,因为它是我必备的功能。希望在我收到邀请时完成;)
    • 我今天在 Firebase 中遇到了这个缺失的功能。拥有完整的应用程序缓存支持会很棒。
    • 我正在等待这个功能,安德鲁。顺便说一句,Firebase 很棒 :)
    • 对电子邮件的回复:在页面刷新之间不保留数据。它不存储在 localStorage 中,它只是存储在应用程序的内存中。没有互联网就无法检索它,但是,如果您打开一个页面,失去互联网然后对数据进行多次更改,它将在重新连接时同步。我们正在寻找即将推出的 localStorage 集成,但目前还没有。
    • @Frank ,如果我只是将它作为依赖注入而不创建 ref 对象,firebase 是否需要互联网?
    【解决方案2】:

    为 JS 应用解决此问题的 Firebase 替代方案是 CouchDb(服务器) PouchDb(JS 客户端)。如果您已经实现了一个干净整洁的客户端服务层,那么移植到 PouchDb 应该是相当简单的,因为它们都是 NoSQL/JSON 数据库。 CouchDb 还支持索引 map/reduce 视图。

    PouchDb 是一个实现完全离线 CouchDb 客户端的Javascript API。它可以自动检测并使用 本地存储IndexDbWebSQL 在在线或离线时永久保存本地数据。 PouchDb API 可用于访问本地或远程数据库(只需更改 URL)并在两者之间连接完全同步或过滤同步。有许多有用的 PouchDb 插件、代码示例和一个小型包装库来支持 AngularJS 的 Q Promise API。

    使用 PouchDb,您可以在离线时安全地启动您的应用,然后在几天后重新启动您的应用并将所有 CUD 数据更改同步到服务器。这可能会导致更新冲突,因此 CouchDb 支持旨在检测和跟踪这种情况的记录版本控制。因此,您可能需要服务器端逻辑来解决这些冲突。这对于具有离线同步和 CouchDb 关键特性的分布式系统来说是不可避免的。我不确定 Firebase 是否支持此 MVCC 功能。

    PouchDb 基本上是 Apache CouchDb 的重新实现,包括它的同步协议。 CouchDb 和 PouchDb 都经过良好测试,免费且开源。开源意味着 CouchDb 服务器也可以部署为 Intranet 服务 - 可选择同步到外部云服务。有许多 CouchDb 托管服务提供商。

    IBM 的 Cloudant 托管团队最近将他们的 BigCouch 集群功能添加到 Apache CouchDb 2.0 项目中,因此现在您可以从 Micro Db (PouchDb) => 单服务器 => 多主(复制)=> Big Couch 集群/地理集群进行扩展。与 MongoDb 不同,CouchDb 安全地支持单服务器部署。

    注意:PouchDb 也可以使用相同的协议同步到 CouchBase,但 Couchbase !== CouchDb。这是一种商业产品。

    另一个很酷的技巧是 PouchDb 可以在 NodeJS 服务器中运行,以替代 CouchDb。我认为它(还没有)准备好用于生产,但对于单元测试非常方便。见express-pouchdb

    链接:

    CouchDb 主机(2020 年 7 月更新)

    自己动手

    Docker + CouchDb:

    安全模型

    迁移到 CouchDb 时需要考虑的一个问题是它的访问控制模型更加有限。这部分是由于它的复制算法。这篇博文详细介绍了这一点(比真正的权威指南更好)。

    适配器

    实际上,您可能希望将 WebSQL 用于您的 PouchDB 存储,因为它的性能要好得多。 - 这是full details on the storage adapters

    PouchDb 附加功能

    从多产的 PouchDb 社区的开源之门中,总是涌现出大量新的酷炫“圣诞树”好东西。

    PouchDb 的一个最佳特性是所有开源 plugins (37) 和 UI 框架适配器 (12)。

    【讨论】:

      【解决方案3】:

      很老的问题,但问题仍然存在。 我只使用了几天的 firebase,我自己也找不到满意的解决方案,所以我想我会分享一下我最终做了什么。

      在应用启动时,我检查我是否在线navigator.onLine。如果没有,我从本地存储读取并从中恢复 firebase ref。

      export const firebaseFromLocalStorage = (local, storeRef) => {
        // assuming data is array
        const localData = JSON.parse(localStorage.getItem(local)) || []
        localData.map(obj => {
          const key = obj['.key']
          delete obj['.key']
          storeRef
            .child(key)
            .set(obj)
        })
      }
      

      然后照常进行。当应用上线时,它会将其本地状态与服务器同步,就像它开始上线并暂时失去连接一样。

      当然,这意味着 localStorage 需要与您的 firebase ref 保持同步。我在每次获取操作时都这样做。

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-25
        • 1970-01-01
        • 2017-08-03
        相关资源
        最近更新 更多