尚未配置默认应用程序

Mic*_*ams 28 ios firebase swift

我正在尝试将我的应用升级到新版本的Firebase.我浏览了设置指南并编辑了所有代码以匹配新语法.但是,当我运行应用程序时,我得到了这两个错误.

The default app has not been configured yet.
Terminating app due to uncaught exception 'MissingDatabaseURL', reason: 'Failed to get FIRDatabase instance: FIRApp object has no databaseURL in its FirebaseOptions object.'
Run Code Online (Sandbox Code Playgroud)

我已经 FIRApp.configure()在AppDelegate中将GoogleServices-Info.plist导入到我的项目中.plist也有所有正确的信息.其他任何人遇到这个或知道如何解决它?

uno*_*nom 70

以下是您的问题的答案:

要配置Firebase,您必须在某处执行FIRApp.configure().完成此操作后,您可以使用let firebaseDatabaseReference = FIRDatabase.database().reference()来获取对该数据库的引用并开始使用它.问题不在于Firebase"本身",而在于Swift的行为方式.

如果你放入FIRApp.configure()你的AppDelegate func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool然后在你声明的函数之外MyDatabase class使用,有时代码在函数执行之前执行.let firebaseDatabaseReference = FIRDatabase.database().reference() FIRDatabase.database().reference()application didFinishLaunchingWithOptions

基本上,您的类正在尝试获取对Firebase数据库的引用,然后才有机会进行自我配置,在控制台中生成错误"尚未配置默认应用程序".

注意:这不会一直发生,有时应用程序启动很慢,例如在iOS模拟器中,并且在MyDatabase"let"执行并尝试获取引用之前没有机会完成.

这就是为什么移动FIRApp.configure()代码以覆盖AppDelegate中的init()的原因,实际上它确保在初始化AppDelegate时执行配置代码(在此情况下,在大多数情况下,在MyDatabase初始化之前)

override init() {
   super.init()
   FIRApp.configure()
   // not really needed unless you really need it FIRDatabase.database().persistenceEnabled = true
}
Run Code Online (Sandbox Code Playgroud)

还要确保你super.init()(所以你超级类得到"消息"),所以你覆盖不是弊大于利.

  • 我通过在我的UIViewController的`viewDidLoad`方法中移动我的`ref = FIRDatabase.database().reference()`来解决它,并声明了`var ref:FIRDatabaseReference!`.这有什么缺点,还是有理由更喜欢覆盖`AppDelegate`的`init()`? (3认同)

alg*_*rid 29

我也在使用Fabric,在我的情况下,它是FabricFirebase初始化的顺序.我必须先进行初始化Firebase.

如此变化

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    Fabric.with([Crashlytics.self])
    FirebaseApp.configure()
    ...
}
Run Code Online (Sandbox Code Playgroud)

至:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    FirebaseApp.configure()
    Fabric.with([Crashlytics.self])
    ...
}
Run Code Online (Sandbox Code Playgroud)

解决了这个问题.