Приложение по умолчанию еще не настроено
Я пытаюсь обновить свое приложение до новой версии 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.'
У меня есть FIRApp.configure()
в AppDelegate, и у меня есть инструмент GoogleServices-Info.plist, импортированный в мой проект. Плис также имеет правильную информацию. Кто-нибудь еще сталкивается с этим или знает, как его исправить?
Ответы
Ответ 1
Вот ответ на вашу проблему:
Чтобы настроить Firebase, вы должны выполнить FIRApp.configure() где-нибудь. После этого вы можете использовать letbasebaseDatabaseReference = 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() для переопределения init() в AppDelegate работает, по сути, он гарантирует, что код конфигурации будет запущен, когда AppDelegate будет инициализирован (в этом и большинстве случаев до инициализации MyDatabase)
override init() {
super.init()
FIRApp.configure()
// not really needed unless you really need it FIRDatabase.database().persistenceEnabled = true
}
Также убедитесь, что вы super.init() (так что суперкласс получает сообщение ")", поэтому вы переопределяете больше вреда, чем пользы.
Ответ 2
Я также использую 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])
...
}
исправил проблему.
Ответ 3
В AppDelegate.m
, за пределами didFinishLaunchingWithOptions
,
override init() {
FIRApp.configure()
FIRDatabase.database().persistenceEnabled = true
}
Ответ 4
iOS 9.2
Swift 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.
И я сделал публичный db firebase со следующим Rules:
{
"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 db выглядел так:
myiosdata-abc123: null
После запуска моего приложения Firebase db выглядела так:
myiosdata-abc123
- key
|
+--- subkey: "hello world"
Ответ 5
У меня было несколько нормальных рабочих проектов с кодом FIRApp.configure ()
в 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
, над которыми я все еще работаю, появилась такая же ошибка:
Приложение по умолчанию еще не настроено
Каждый проект теперь, когда я открываю в XCode, получая ту же ошибку, я не знал, что делать, но после внедрения кода @MichaelWilliams все снова работает отлично.
У меня есть отладка моего Xcode (очистка и перезагрузка консоли), но Майкл не работает рядом с этим новым подходом.
Это решило мою проблему:
override init() {
FIRApp.configure()
FIRDatabase.database().persistenceEnabled = true
}
Может ли этот новый код каким-то образом сделать мое приложение неустойчивым и я могу бояться увидеть проблемы с подключением/работой с базой данных Firebase?
Ответ 6
Убедитесь, что у вас есть DATABASE_URL
в GoogleService-Info.plist
Ответ 7
Если вы используете Xcode 9, Swift 4 и Firebase 4, пожалуйста, сделайте следующее:
override init() {
FirebaseApp.configure()
Database.database().isPersistenceEnabled = true
}
Ответ 8
Самое чистое решение для меня здесь - иметь ленивые свойства на тот случай, если вы хотите иметь БД поверх вашего файла. Допустим, у вас есть класс FirebaseService, в котором вы хотите иметь константу db Firestore.firestore()
чтобы использовать ее во всех функциях этого класса:
private lazy var db = Firestore.firestore()
Или, если вы используете Firebase Storage:
private lazy var storage = Storage.storage().reference()
Также имейте в виду, что если вы ссылаетесь на базу данных/хранилище в init()
ваших классов, у вас все еще может быть та же проблема, поэтому избегайте ее.
Ответ 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
Swift 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
}
Счастливое кодирование