Ios Firebase Firestore在同一应用程序中使用两个不同的实例

Ios Firebase Firestore在同一应用程序中使用两个不同的实例,ios,swift,firebase,google-cloud-firestore,Ios,Swift,Firebase,Google Cloud Firestore,我目前正在iOS应用程序中使用Firebase Firestore。有一个合法的使用案例,用户必须首先接受同意,然后我才允许将其数据上载到Firebase,但我需要让用户能够保存数据,即使他们尚未同意同意 我的问题是,在一个iOS应用程序中是否可能有两个不同的Firestore数据库实例。一个仅离线存储数据且不同步的实例和一个正在同步的实例。然后我可以在运行时决定在哪里存储数据 是否有相关文件或经验 在单个应用程序中访问多个Firestore数据库(或其他Firebase资源)绝对是可能的。但是

我目前正在iOS应用程序中使用Firebase Firestore。有一个合法的使用案例,用户必须首先接受同意,然后我才允许将其数据上载到Firebase,但我需要让用户能够保存数据,即使他们尚未同意同意

我的问题是,在一个iOS应用程序中是否可能有两个不同的Firestore数据库实例。一个仅离线存储数据且不同步的实例和一个正在同步的实例。然后我可以在运行时决定在哪里存储数据


是否有相关文件或经验

在单个应用程序中访问多个Firestore数据库(或其他Firebase资源)绝对是可能的。但是只有一个可以从
GoogleService Info.plist
初始化。根据辅助
GoogleService Info.plist
中的信息,您必须从代码中初始化另一个

基本方法是首先使用第二个项目的配置数据创建
FirebaseOptions
对象:

然后使用它初始化辅助
应用程序
对象,以获得所需的Firebase服务:

// Configure an alternative FIRApp.
FirebaseApp.configure(name: "secondary", options: secondaryOptions)

// Retrieve a previous created named app.
guard let secondary = FirebaseApp.app(name: "secondary")
  else { assert(false, "Could not retrieve secondary app") }

let secondaryDb = Firestore.firestore(app: secondary)
另见:

  • 上的Firebase文档

我们的应用程序也遇到了类似的情况——出现了一个法律用例,要求用户选择在云中存储数据。为此,我们需要一个存储解决方案,允许某些数据仅在本地存储,而某些数据在用户选择登录时同步到云。我们考虑关闭离线数据的Firestore网络活动:Firestore.Firestore().disableNetwork(完成:)

然而,我们联系了谷歌,他们的PM建议

Firestore不是一个很好的离线数据库。它是为最终将同步到服务器的数据而设计的。离线功能旨在掩盖暂时的连接损失。随着挂起的写入操作(也称为脱机写入)数量的增加,性能会下降,并且与普通的移动设备数据库相比,大型脱机数据集上的查询性能非常差

虽然他们可能能够使用两种数据库解决方案,但我通常建议他们只为其脱机数据选择完全不同的数据存储。SQLite是标准选项,但还有许多其他选项


谢谢你的回答。但是有可能有两个firebase应用程序实例具有相同的配置吗?因为我需要的基本上是主要的firebase Firestore实例,只是本地不同步。使用上面的方法值得一试。一般来说,它会起作用,但当我为第二个实例禁用网络时,写入事务似乎也会排队。因此,我的写入事务不会收到任何回调。如果写入事务不排队,则workTransactions需要连接到服务器,否则它们无法检查冲突写入,这将毫无意义。在用户同意之前,您是否考虑使用常规的本地数据库来存储数据?是的,完全理解事务不能正常工作。使用本地数据库是我现在正在实现的方法。更多的工作,但似乎是正确的解决办法。我不知道你对你的答案有什么看法。基本上,我们的转换导致我的方法无法处理两个firebase实例,但它基本上回答了我的问题。
// Configure an alternative FIRApp.
FirebaseApp.configure(name: "secondary", options: secondaryOptions)

// Retrieve a previous created named app.
guard let secondary = FirebaseApp.app(name: "secondary")
  else { assert(false, "Could not retrieve secondary app") }

let secondaryDb = Firestore.firestore(app: secondary)