错误:`在使用Firestore之前先调用FirebaseApp.configure()。

时间:2018-11-25 16:10:37

标签: ios swift firebase google-cloud-firestore

背景信息

我已经开始为一个简单的App开发后端,并且已经建立了一个数据库类(名为DBDelegate),所有文件都将与之通信。 在我的AppDelegate.swift中,我有这个:

static public var dbDelegate:DBDelegate = DBDelegate()

private func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    FirebaseApp.configure()
    return true
}

它是static public,因此我可以从其他文件访问dbDelegate

在我的其他文件中,我有以下几点可提高可读性:(因为它是一个类,因此将通过引用传递)

let dbDelegate = AppDelegate.dbDelegate

在我的DBDelegate班上:

var db = Firestore.firestore()
init() {
    FirebaseApp.configure()
}

构建和运行

构建代码时,它会正常运行。

运行时,该应用会立即以SIGABRT崩溃。 错误消息是:
Terminating app due to uncaught exception 'FIRAppNotConfiguredException', reason: 'Failed to get FirebaseApp instance. Please call FirebaseApp.configure() before using Firestore'

我尝试过的

  • 我尝试在DBDelegate类的init函数上设置一个断点。它没有达到断点。
  • 我尝试制作所有dbDelegate变量lazy
    • 我在AppDelegate中遇到了一个编译错误:lazy must not be used on an already-lazy global
    • 其他人的运行时错误:在使用Firestore之前,请先调用FirebaseApp.configure()。
  • 我尝试了以下操作(在didFinishLaunchingWithOptions中分配dbDelegate):
    static public var dbDelegate:DBDelegate!
    private func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        FirebaseApp.configure()
        dbDelegate = DBDelegate()
        return true
    }
  • 我收到编译错误:Static member 'dbDelegate' cannot be used on instance of type 'AppDelegate'

任何帮助都会很棒!

编辑:我找到了一个麻烦的解决方案,请参见下文。

6 个答案:

答案 0 :(得分:2)

最好为Firebase创建一个单例。

class FirebaseService: NSObject {
    static let shared = FirebaseService()

    init() {
         FirebaseApp.configure()
    }
}

然后,您可以通过以下共享方式访问所有内容:

FirebaseService.shared.methodName

要在应用程序委托中进行配置,您需要按以下方式调用它:

_ = FirebaseService.shared

答案 1 :(得分:1)

首先,我要感谢@DionzB建议使用单例(我这样做了)。我将在此答案中引用他/她的帖子。

好吧,所以经过一些研究并使用了断点,我发现我的自定义类实际上在AppDelegate之前执行。知道这一点后,我在以下行之前创建了一个变量:

static let shared = FirebaseService()

名称无关紧要,因为我/您不会调用它,并将其分配给FirebaseApp.configure()

FirebaseService类变为:

class FirebaseService: NSObject {
    let constantToNeverTouch = FirebaseApp.configure()
    static let shared = FirebaseService()

    init() {
    }
}

接下来,您必须确保FirebaseApp.configure()在代码中的其他位置都不存在。它也不应该在AppDelegate中。拥有多个FirebaseApp.configure()会使应用程序崩溃。

答案 2 :(得分:0)

可能是您的代码顺序错误。确保将窗口代码放在firebaseApp.configure之后,而不是之前。在firebaseApp.configure连接之后,我只是放置了窗口创建代码(窗口= UIWindow(frame:UIScreen.main.bounds等),直到遇到了同样的崩溃。只是交换了它们的位置:

    FirebaseApp.configure()
    let db = Firestore.firestore()
    let settings =  db.settings
    settings.areTimestampsInSnapshotsEnabled = true
    db.settings = settings

    window = UIWindow(frame: UIScreen.main.bounds)
    window?.rootViewController = HomeController()
    window?.makeKeyAndVisible()

答案 3 :(得分:0)

让dbDelegate = AppDelegate.dbDelegate

在您的DBDelegate类中:

var db : Firestore?
init() {
    FirebaseApp.configure()
    db = Firestore.firestore()
}

答案 4 :(得分:0)

您可以使用FirebaseApp.configure()覆盖AppDelegate的init方法,并确保在创建任何窗口之前将其加载。

override init() {
        FirebaseApp.configure()
}

答案 5 :(得分:0)

我遇到了同样的问题,因为我的 pod 版本太旧了。所以解决方案是

  1. 使用命令 $data=array( 'email' => $email ?? null, 'mobileno'=>$mobileno ?? null, 'password' => $newpassword, 'account_type' => $account_type, );
    检查您的 Pod 如果 pod 版本旧或不一样,CocoaPods 需要更新。使用评论 pod --version

  2. 完成后,您需要再次检查您的 pod,使用命令 sudo gem install CocoaPods 确保您的 pod 版本已升级

  3. pod --version 到您的项目目录,然后使用命令 cd
    命令完成后使用 pod deintegrate

  4. 打开您的项目工作区,构建并运行