默认应用尚未配置
Posted
技术标签:
【中文标题】默认应用尚未配置【英文标题】:The default app has not been configured yet 【发布时间】:2016-09-16 23:44:15 【问题描述】:我正在尝试将我的应用升级到新版本的 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 也包含所有正确的信息。还有其他人遇到这个问题或知道如何解决吗?
【问题讨论】:
您是否尝试过查看these 的一些答案? 【参考方案1】:在AppDelegate.m
中,在didFinishLaunchingWithOptions
之外,
override init()
FIRApp.configure()
FIRDatabase.database().persistenceEnabled = true
【讨论】:
你一直有persistenceEnabled调用吗?首先被调用将触发 FIRDatabase 类来检查它是否已配置并失败。只要将persistenceEnabled标志与它一起移动,就可以将配置移回原来的位置。【参考方案2】: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”
【讨论】:
【参考方案3】:我在AppDelegate.swift
中有几个使用FIRApp.configure ()
代码的正常工作项目:
class AppDelegate: UIResponder, UIApplicationDelegate
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
FIRApp.configure()
return true
在相当长的一段时间内一切都很好,但是昨天和今天我在Xcode 7.3.1
中打开了一个Swift 3
项目(我仍在Swift 2
工作,但打开了Swift 3
项目以查看发生了什么变化),突然,在我仍在处理的所有Swift 2
应用程序和项目中,出现了同样的错误:
尚未配置默认应用
现在,当我在 XCode 中打开每个项目时,都会遇到同样的错误,我不知道该怎么办,但是在执行 @MichaelWilliams 的代码后,一切都恢复正常了。
我已经调试了我的 Xcode(清除并重新加载控制台),但除了 Michael 的这种新方法之外,没有任何效果。
这个解决了我的问题:
override init()
FIRApp.configure()
FIRDatabase.database().persistenceEnabled = true
这个新代码会以某种方式使我的应用变得不稳定吗?我现在是否害怕看到连接/使用 Firebase 数据库时出现问题?
【讨论】:
【参考方案4】:这是您问题的答案:
要配置 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()
在您声明的函数之外有时代码 @ 987654325@ 在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
还要确保您使用 super.init()(这样您的超类会收到“消息”),这样您的覆盖不会弊大于利。
【讨论】:
我通过将我的ref = FIRDatabase.database().reference()
移动到我的 UIViewController 的viewDidLoad
方法中解决了这个问题,并声明了var ref : FIRDatabaseReference!
。这有什么缺点,还是有理由更喜欢覆盖AppDelegate
的init()
?
您不必将其移至 init() 函数,只需确保在配置之前没有任何其他可全局访问的结构/类等访问 Firebase 对象。
你的解释让我明白了,感谢它对我的完美。
我有全局变量访问 Firebase 对象,即let db = Firestore.firestore()
,因为我可以保证它不是零。如果我等到 onViewDidLoad 将其设置为相等,那么我必须将它们变成可选项,我希望尽可能避免。
我不知道为什么,但是这样做会禁用应用程序委托调动。因此,如果您使用的是依赖于应用程序委托调动的电话身份验证,那么您可能不想将配置函数放在 init 中。【参考方案5】:
确保您的GoogleService-Info.plist
中有DATABASE_URL
密钥
【讨论】:
这对我来说是个问题。再次下载它并且这个键值对存在。现在出现了一个新问题,SDK 似乎不知道如何处理美国以外的数据库位置。我使用了比利时,SDK 无法解析 URL。我用的是美国,它奏效了。【参考方案6】:如果您使用的是 Xcode 9、Swift 4 和 Firebase 4,请执行以下操作:
override init()
FirebaseApp.configure()
Database.database().isPersistenceEnabled = true
【讨论】:
一个好的答案应该包括我们需要进行更改的文件名(此处为AppDelegate
)。【参考方案7】:
对我来说最干净的解决方案是拥有 惰性属性,以防您希望将数据库放在文件顶部。因此,假设您有一个 FirebaseService 类,您希望在其中拥有 Firestore.firestore()
db 常量,以便在该类的所有函数中使用它:
private lazy var db = Firestore.firestore()
或者,如果您使用的是 Firebase 存储:
private lazy var storage = Storage.storage().reference()
另外请记住,如果您在类的 init()
中引用数据库/存储,您仍然可能遇到同样的问题,因此请避免。
【讨论】:
【参考方案8】:我也在使用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])
...
解决了问题。
【讨论】:
【参考方案9】: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】:尝试从您的控制台重新下载 GoogleService-Info.plist 并将其添加到您的项目中,这对我有用!
【讨论】:
以上是关于默认应用尚未配置的主要内容,如果未能解决你的问题,请参考以下文章
Cordova ios - 尚未配置默认 Firebase 应用
默认 Firebase 应用尚未配置,但 FirebaseApp.configure() 添加到 appdelegate 的 didFinishLaunchingWithOptions 方法
分支 io:我应该如何配置链接,以便当用户单击尚未安装的 Android 应用程序的链接时打开默认应用程序市场?
Django ForeignKey 默认 - 应用程序注册表尚未准备好
带有 mongoengine 的 Flask 应用程序的 Elastic Beanstalk WSGI 部署的“您尚未定义默认连接”