Firebase 当客户端恢复联机并完成挂起的写入时,如何确定firestore安全规则是否失败?

Firebase 当客户端恢复联机并完成挂起的写入时,如何确定firestore安全规则是否失败?,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,在我的Android应用程序中,我正在向firestore写入数据,firestore正在安全规则的帮助下进行验证。由于写入也可以脱机工作,所以如果设备脱机,我的(无效)写入任务将返回成功。但当设备联机时,安全规则将阻止写入,数据将从客户端消失。有没有办法让我知道写操作失败了?如果安全规则失败,是否有可能触发云功能,以便我可以通知用户在返回联机后写入失败?当您说“如果设备脱机,我的(无效)写入任务将返回成功”时,这并不是它的工作方式。当您向Firestore写入文档时,只有当应用程序在线且服务器

在我的Android应用程序中,我正在向firestore写入数据,firestore正在安全规则的帮助下进行验证。由于写入也可以脱机工作,所以如果设备脱机,我的(无效)写入任务将返回成功。但当设备联机时,安全规则将阻止写入,数据将从客户端消失。有没有办法让我知道写操作失败了?如果安全规则失败,是否有可能触发云功能,以便我可以通知用户在返回联机后写入失败?

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

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

SDK没有为您提供一种方法来知道冷启动后文档何时同步。但是,您可以通过记住需要跟踪的文档的所有路径,在本地保存这些路径,然后在冷启动中加载这些路径来检查是否成功,从而自行解决问题。您需要将侦听器添加到这些文档中,并检查:

  • 如果文档不存在,则意味着在附加侦听器之前,写入被拒绝
  • 如果该文档存在并具有PendingWrites(),则表示同步仍在等待发生
  • 如果文档不存在挂起的写入,则它已成功同步

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

    好问题。我在文件中没有看到任何明显的答案。我会调查的。我同意加藤的观点,这是个好问题。这只是对未来读者的一个更正:您的(可能无效的)脱机写入任务实际上并没有成功,事实上,它甚至没有失败或取消。这就是API的设计方式,正如Doug在下面的回答中所解释的那样: