【问题标题】:Is it possible to reuse a Firestore Realtime Query after being in background (to save costs)是否可以在后台重用 Firestore 实时查询(以节省成本)
【发布时间】:2019-02-01 06:07:11
【问题描述】:

我使用 firebase-js-sdk(在 Vue PWA 中)来监听来自 Firestore 的实时更新。

要在后台恢复应用程序,我使用“vuex-persist”作为应用程序状态。除了应用程序状态之外,我还需要通过在具有相同参数的同一集合上调用 .onSnapshot 来重新建立实时查询。

我想知道 firebase-js-sdk 是否能够重用实时查询,这是在应用程序进入后台之前请求的。否则每次用户切换到后台和返回时都会向我收费。

感谢您的帮助,托马斯

【问题讨论】:

  • Firebase 查询需要“不监听”,这是它停止监听的唯一方法,除非整个进程(应用程序)被杀死。因此,如果您尚未删除侦听器并且应用程序仍然存在,那么它们应该正在侦听。在您的应用再次处于前台后,您始终可以通过更改数据库中的某些内容来确认这一点,以查看您是否观察到该更改。
  • 更具体一点。如果应用程序在 ios 上以“apple-mobile-web-app-capable 模式”运行(为了表现得像一个带有主屏幕图标和全屏的原生应用程序),那么切换到后台并返回到前台就像按 F5 一样桌面浏览器。它重新加载应用程序,所有内容都需要恢复,实时监听器也是如此。这意味着:观察 db 更改(如您提到的)是不可能的,因为该应用程序不再有 firestore 引用。

标签: firebase vue.js google-cloud-firestore vuex


【解决方案1】:

解决方案:问题不在于如何使恢复(包括实时侦听器的恢复)在技术上正常工作。我的主要兴趣在于如何避免每次发生实时监听器恢复时都被收费

根据这两个答案:

如果满足以下先决条件,我将不会被收费:

  • 我重新创建了相同的查询(进而生成相同的 resumeToken。resumeToken 是一种密钥,firestore 服务器端使用它来再次识别查询)
  • 该查询的结果集的数据未发生更改(Firestore 最多跟踪查询 30 分钟,如果发生更改,将使结果集无效)
  • 已启用持久性,使客户端 sdk 能够为本地缓存的结果集提供服务
  • 结果集是在过去 30 分钟内生成的(firestore 跟踪查询的最长时间)。如果它较旧,则查询会再次执行,然后我会为此付费。

【讨论】:

    【解决方案2】:

    您应该在 main.js 中初始化您的 Firebase,或者基本上是在应用启动或带到前台时始终启动的页面,这样即使您的侦听器在您再次进入前台时分离,Firebase 也会启动,因此可以创建新的侦听器。

    所以在你的 main.js 中你会有类似的东西:

    import Firebase from 'firebase'
    let config = {
        apiKey: "...",
        authDomain: "...",
        databaseURL: "...",
        storageBucket: "...",
        messagingSenderId: "..."
      };
    
    let app = Firebase.initializeApp(config)
    let db = app.database()
    let booksRef = db.ref('books') 
    //....etc///
    

    如果您的设置正确并在每次加载页面时运行的方法中设置了您的侦听器,那么您始终拥有一个侦听器。只要确保避免创建多个侦听器即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多