首页 > 解决方案 > 当客户端重新联机并且挂起的写入完成时,如何确定 Firestore 安全规则是否失败?

问题描述

在我的 Android 应用程序中,我正在向 Firestore 写入数据,该数据正在借助安全规则进行验证。由于写入也离线工作,如果设备离线,我的(无效)写入任务将返回成功。但是当设备上线时,安全规则会阻止写入,数据将从客户端消失。有没有办法让我知道写入失败?如果安全规则失败,是否可以触发云功能,以便我可以通知用户他们在重新上线后写入失败?

标签: firebasegoogle-cloud-firestorefirebase-security

解决方案


当您说“如果设备离线,我的(无效)写入任务将返回成功”时,这并不是它的工作原理。当您将文档写入 Firestore 时,SDK 只会在应用在线且服务器确认已写入时确认写入。当您执行写入时,API 将为您提供某种操作(Android 任务、JavaScript 承诺)将在写入实际完成时完成或解决。

如果您处于离线状态,您将永远无法确定写入是否有效,但写入的文档仍会显示在查询中。如果您想知道该文档是否最终完成了写入,则必须请求该文档的元数据,并检查该文档是否有未完成的待写入。例如,在 Android 上,使用hasPendingWrites()来确定您手头的文档是否已编写。

SDK 不会为您提供在冷启动后了解文档何时同步的方法。但是您可以通过记住对跟踪很重要的文档的所有路径,将它们保存在本地,然后在冷启动时加载这些路径以检查是否成功,从而将事情掌握在自己手中。您将向这些文档添加侦听器并检查:

  1. 如果文档不存在,则意味着在您附加侦听器之前写入已被拒绝。
  2. 如果文档存在并且 hasPendingWrites(),这意味着同步仍在等待发生。
  3. 如果文档存在且没有挂起的写入,则它已成功同步。

此策略仅适用于添加新文档。对于更新文档,它更加困难,因为在更新同步失败之前没有挂起写入的文档可能只是文档的旧版本。因此,您需要在更新中添加一些其他字段来指示更新是否成功。


推荐阅读