我正在尝试将我的应用升级到新版本的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.'
我在AppDelegate中有FIRApp.configure()
,我将GoogleServices-Info.plist导入到我的项目中。 plist也有所有正确的信息。其他任何人遇到这个或知道如何解决它?
答案 0 :(得分:62)
以下是您问题的答案:
要配置Firebase,您必须在某处执行 FIRApp.configure()。完成此操作后,您可以使用 let firebaseDatabaseReference = FIRDatabase.database()。reference()来获取对该数据库的引用并开始使用它。问题不在于Firebase"本身"但是Swift的表现如何。
如果您将FIRApp.configure()
放入AppDelegate func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
,然后放在MyDatabase class
中,则使用所声明函数的<{1}} 有时代码let firebaseDatabaseReference = FIRDatabase.database().reference()
在执行FIRDatabase.database().reference()
函数之前执行。
基本上,您的类正在尝试获取对Firebase数据库的引用,之后它有机会自行配置,在控制台中生成错误&#34;默认应用尚未配置&#34;
注意:这并不是一直发生的,有时应用程序启动很慢,例如在iOS模拟器中,并且它没有机会在MyDatabase和#34之前完成;让&#34;执行并尝试获取参考。
这就是为什么移动FIRApp.configure()代码以覆盖AppDelegate中的init()的原因,实际上它确保在初始化AppDelegate时执行配置代码(在此情况下,在大多数情况下,在MyDatabase初始化之前)
application didFinishLaunchingWithOptions
另外请确保你super.init()(所以你的超级课程得到了&#34;消息&#34;)所以你覆盖并没有弊大于利。
答案 1 :(得分:16)
我还使用Fabric
,在我的情况下,这是Fabric
和Firebase
初始化的顺序。我必须先初始化Firebase
。
如此改变
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
Fabric.with([Crashlytics.self])
FirebaseApp.configure()
...
}
收件人:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
FirebaseApp.configure()
Fabric.with([Crashlytics.self])
...
}
解决了这个问题。
答案 2 :(得分:3)
AppDelegate.m
以外的didFinishLaunchingWithOptions
,
override init() {
FIRApp.configure()
FIRDatabase.database().persistenceEnabled = true
}
答案 3 :(得分:1)
iOS 9.2
斯威夫特2.1.1
Xcode 7.2.1
Mac OSX 10.10.5
使用以下代码时出现相同的错误:
<强> AppDelegate.swift 强>:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
FIRApp.configure()
return true
}
<强> ViewController.swift 强>:
import UIKit
import Firebase
class ViewController: UIViewController {
var db = FIRDatabase.database().reference()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//Create some data in Firebase db:
db.child("key").child("subkey").setValue("hello world")
}
我还将文件GoogleService-Info.plist
添加到我的项目目录中,如Firebase Getting Started Guide中所述。
我使用以下Rules
公开我的Firebase数据库{
"rules": {
".read": true,
".write": true
}
}
对ViewController.swift进行以下更改对我有用:
class ViewController: UIViewController {
var db: FIRDatabaseReference!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
db = FIRDatabase.database().reference()
db.child("key").child("subkey").setValue("hello world")
}
在运行我的应用之前,我的Firebase数据库看起来像这样:
myiosdata-abc123: null
运行我的应用后,我的Firebase数据库看起来像这样:
myiosdata-abc123
- key
|
+--- subkey: “hello world”
答案 4 :(得分:1)
我在AppDelegate.swift
中使用class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
FIRApp.configure()
return true
}
代码进行了几个正常的工作项目:
Swift 3
很长一段时间以来一切都很顺利,但是昨天和今天我在Xcode 7.3.1
内开了一个Swift 2
项目(我仍然在Swift 3
工作,但是打开了Swift 2
项目,看看有什么变化),突然在我仍在努力的所有override init() {
FIRApp.configure()
FIRDatabase.database().persistenceEnabled = true
}
应用程序和项目中,得到了同样的错误:
尚未配置默认应用
现在我在XCode中打开每个项目,得到同样的错误,我不知道该怎么做,但在实现了@MichaelWilliams的代码后,一切正常。
我已经调试了我的Xcode(清除并重新加载控制台),但Michael没有采用这种新方法。
这个解决了我的问题:
{{1}}
这个新代码能否以某种方式使我的应用程序不稳定,我现在可能会害怕看到连接/使用Firebase数据库时出现问题?
答案 5 :(得分:1)
尝试从您的控制台重新下载 GoogleService-Info.plist 并将其添加到您的项目中,这对我有用!
答案 6 :(得分:0)
确保DATABASE_URL
GoogleService-Info.plist
个密钥
答案 7 :(得分:0)
如果您使用的是Xcode 9,Swift 4和Firebase 4,请执行以下操作:
override init() {
FirebaseApp.configure()
Database.database().isPersistenceEnabled = true
}
答案 8 :(得分:0)
对于我来说,最干净的解决方案是具有惰性属性,以防您希望将数据库放在文件顶部。因此,假设您有一个FirebaseService类,希望在其中拥有Firestore.firestore()
db常量以在该类的所有函数中使用它:
private lazy var db = Firestore.firestore()
或者如果您使用的是Firebase Storage:
private lazy var storage = Storage.storage().reference()
还要记住,如果您在类的init()
中引用数据库/存储,您仍然可能会遇到相同的问题,因此请避免这种情况。
答案 9 :(得分:0)
Swift 5-简易解决方案
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
return true
}
//MARK:- This function will auto run and firebase will configure successfully
override init() {
super.init()
FirebaseApp.configure()
// not really needed unless you really need it
FIRDatabase.database().persistenceEnabled = true
}
快乐编码
答案 10 :(得分:0)
雨燕5
pod 'Firebase/Analytics'Swift 5 - Easy Solution
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
return true
}
//MARK:- This function will auto run and firebase will configure successfully
override init() {
super.init()
FirebaseApp.configure()
// not really needed unless you really need it
FIRDatabase.database().persistenceEnabled = true
}
快乐编码