如何从一个 Xcode 项目访问多个 Firebase 数据库

Posted

技术标签:

【中文标题】如何从一个 Xcode 项目访问多个 Firebase 数据库【英文标题】:How to access multiple firebase databases from one Xcode project 【发布时间】:2018-03-10 20:47:16 【问题描述】:

我目前正在使用 swift 在 Xcode 中创建一个应用程序,我想在一个 Xcode 项目中从两个不同的 Firebase 数据库中读取和写入。我知道 Firebase 肯定支持这一点,但是当我使用他们的文档时,我仍然发现很难设置。

我知道这里有使用 android 的这个问题的答案:https://***.com/a/43215981/9308748

但是,我正在为 ios 制作我的应用程序。

我查看了文档并按照说明进行操作,但是每当我运行项目时,它都会尝试从最近创建的 Firebase 数据库中获取我正在寻找的所有信息,而不是我试图从中检索的特定信息.我不知道要在 AppDelegate 类中放入什么代码以及在 viewController 类中放入什么代码才能连接到特定的数据库。

我已将两个 GoogleService-info.plist 文件添加到我的 Xcode 项目中(我不知道我是否应该这样做)

这是我迄今为止在我的两个 firebase 项目的 AppDelegate 类中所做的:

    let primaryOptions = FirebaseOptions(googleAppID: "My googleAppID", gcmSenderID: "my gcmSender")
    primaryOptions.bundleID = "my bundleID"
    primaryOptions.apiKey = "my apiKey"
    primaryOptions.clientID = "my clientID"
    primaryOptions.databaseURL = "my DatabaseURL"
    primaryOptions.storageBucket = "my storageBucket"

    FirebaseApp.configure(name: "primaryOptions", options: primaryOptions)

    guard let primaryApp = FirebaseApp.app(name: "primaryOptions")
        else  assert(false, "Could Not retrieve primary app")

    let primaryDB = Database.database(app: primaryApp)

然后在我的 AppDelegate 类中执行此操作后,我不知道如何从我的视图控制器类中引用这组特定的信息,以便从特定的数据库中读取和写入。

请帮忙!

【问题讨论】:

【参考方案1】:

在您的 AppDelegate 中配置所有应用程序后,有两种方法可以在您的整个代码中为您提供帮助(您可以在任何 viewController 中使用它)

1) app(name:)

返回以前创建的具有给定名称的 FIRApp 实例,如果不存在此类应用,则返回 nil。此方法是线程安全的。

声明

class func app(name: String) -> FirebaseApp?

例子:

guard let primaryApp = FirebaseApp.app(name: "primaryOptions") else  return 

2) allApps()

返回所有现存 FIRApp 实例的集合,如果没有 FIRApp 实例,则返回 nil。此方法是线程安全的。

声明

class func allApps() -> [String : FirebaseApp]?

例子:

guard let allApps = FirebaseApp.allApps, let primaryApp = allApps["primaryOptions"] else  return 

获取 FirbaseApp 实例后,您可以获取数据库参考

Database.database(app: primaryApp).reference()

【讨论】:

我在哪里写class func app(name: String) -> FirebaseApp?。在我的 appDelegate 或我的 viewController 中?当我将那行确切的代码放入我的视图控制器时,它会给出错误 guard let primaryApp = FirebaseApp.app(name: "primaryOptions") else return 的问题相同。它一直在说“非 void 函数应该返回一个值”,每当我改变它时,我都会得到新的错误。我只是无法让它工作,请你更详细地描述所需的代码以及我实际上必须把它放在哪里。谢谢【参考方案2】:

当它使用 Swift 4.2 工作时,我正在发布解决方案。

正如firebase所解释的那样,它在AppDelegate中使用,但如果您使用登录或其他东西用于firstDB,我建议您像我一样处理它。

从这里获取代码:https://github.com/firebase/snippets-ios/blob/master/firoptions/FiroptionConfiguration/FiroptionConfiguration/AppDelegate.swift

在我的例子中,我通过 FirstBD 处理登录和身份验证,然后我从 secondDB 检索数据。

1-首先添加secondDB plist:

2- 我创建了一个函数来删除 firstDB 配置和配置 secondBD 如下:

    private func configSecondDatabase()
      FirebaseApp.app()?.delete( (success) in

      ) // Delete FirstDB as we recreate below.

      // Load a named file.
      let filePath = Bundle.main.path(forResource: "My-GoogleService", ofType: "plist")
      guard let fileopts = FirebaseOptions(contentsOfFile: filePath!)
         else  assert(false, "Couldn't load config file") 
      FirebaseApp.configure(options: fileopts)

      let secondaryOptions = FirebaseOptions(googleAppID: "yourGoogleAppID", gcmSenderID: "yourGcmSenderID")
      secondaryOptions.bundleID = "yourBundleID"
      secondaryOptions.apiKey = "yourApiKey"
      secondaryOptions.clientID = "yourClientID"
      secondaryOptions.databaseURL = "yourDatabaseURL"
      secondaryOptions.storageBucket = "yourStorageBucket"

      // 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 = Database.database(app: secondary)
      let defaultDb = Database.database()

      guard let defapp = FirebaseApp.app()
         else  assert(false, "Could not retrieve default app") 

      assert(secondaryDb.app == secondary)
      assert(defaultDb.app == defapp)

   

并在我想处理 secondDB 的 ViewController viewDidLoad() 中调用它:

override func viewDidLoad() 
   configSecondDatabase()
   let ref = Database.database().reference() // reference of secondDB

希望这对某人有所帮助,并节省他的时间。 谢谢

【讨论】:

【参考方案3】:

如果您真的不需要在两个数据库之间切换而只需要使用不同于默认数据库的新数据库,请转到您的 GoogleService-Info.plist 并将 DATABASE_URL 值更改为您想要的 firebase 数据库的 URL使用。

【讨论】:

以上是关于如何从一个 Xcode 项目访问多个 Firebase 数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何将从列表中选择的多个项目传递到下一个视图?

XCode 未找到 Firebase v2.1.2(未找到框架错误)

如何在两个xcode应用程序之间链接[重复]

如何在一个主项目中包含多个 Xcode 项目

Xcode Bots 从单个 Xcode 服务器在多个 iOS 项目上运行 UITesting

Xcode 在源代码管理中显示多个项目