J'essaie de mettre à niveau mon application vers la nouvelle version de Firebase. J'ai parcouru le guide d'installation et modifié tout mon code pour qu'il corresponde à la nouvelle syntaxe. Cependant, lorsque je lance l'application, j'obtiens ces deux erreurs.
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.'
J'ai FIRApp.configure()
dans AppDelegate et le fichier GoogleServices-Info.plist est importé dans mon projet. Le plist a aussi toutes les informations correctes. Quelqu'un d'autre qui court ou sait comment résoudre ce problème?
Voici la réponse à votre problème:
Pour configurer Firebase, vous devez exécuter FIRApp.configure () quelque part. Ceci fait, vous pouvez utiliser let firebaseDatabaseReference = FIRDatabase.database (). Reference () pour obtenir une référence à cette base de données et commencer à l’utiliser. Le problème n'est pas avec Firebase "en soi" mais avec le comportement de Swift.
Si vous mettez FIRApp.configure()
dans votre AppDelegate func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
, puis dans le MyDatabase class
, vous utilisez let firebaseDatabaseReference = FIRDatabase.database().reference()
outside de vos fonctions déclarées parfois le code FIRDatabase.database().reference()
est exécuté avant l'exécution de la fonction application didFinishLaunchingWithOptions
.
Essentiellement, votre classe tente d'obtenir une référence à la base de données Firebase avant / elle a une chance de se configurer, générant l'erreur dans la console "L'application par défaut n'a pas encore été configurée."
Remarque: Cela ne se produit pas tout le temps, parfois l'application est lente à démarrer, dans le simulateur iOS par exemple, et elle n'a aucune chance de se terminer avant que MyDatabase "laisse" s'exécuter et tente d'obtenir une référence.
C'est pourquoi le déplacement du code FIRApp.configure () pour remplacer init () dans AppDelegate fonctionne. Cela permet essentiellement de s'assurer que le code de configuration est exécuté lors de l'initialisation de AppDelegate (dans ce cas et dans la plupart des cas, avant l'initialisation de MyDatabase).
override init() {
super.init()
FIRApp.configure()
// not really needed unless you really need it FIRDatabase.database().persistenceEnabled = true
}
Assurez-vous également que super.init () (afin que vos super classes reçoivent le "message") afin que vous ne fassiez pas plus de mal que de bien.
J'utilise aussi Fabric
et dans mon cas, c'était l'ordre d'initialisations Fabric
et Firebase
. J'ai dû initialiser Firebase
en premier.
Donc changeant
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])
...
}
résolu le problème.
Dans AppDelegate.m
, en dehors de didFinishLaunchingWithOptions
,
override init() {
FIRApp.configure()
FIRDatabase.database().persistenceEnabled = true
}
iOS 9.2
Swift 2.1.1
Xcode 7.2.1
Mac OSX 10.10.5
Même erreur ici en utilisant le code suivant:
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")
}
J'ai également ajouté le fichier GoogleService-Info.plist
à mon répertoire de projet, comme décrit dans le Guide de démarrage de Firebase .
Et j’ai rendu publique ma base de données Firebase avec les règles suivantes:
{
"rules": {
".read": true,
".write": true
}
}
Apporter les modifications suivantes à ViewController.Swift est ce qui a fonctionné pour moi:
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")
}
Avant de lancer mon application, ma base de données Firebase ressemblait à ceci:
myiosdata-abc123: null
Après avoir exécuté mon application, ma base de données Firebase ressemblait à ceci:
myiosdata-abc123
- key
|
+--- subkey: “hello world”
J'ai eu plusieurs projets de travail normaux avec le code FIRApp.configure ()
dans AppDelegate.Swift
:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
FIRApp.configure()
return true
}
Tout a très bien fonctionné pendant un certain temps, mais hier et aujourd'hui, j'ai ouvert un projet Swift 3
dans mon Xcode 7.3.1
(je travaille toujours dans Swift 2
, mais j'ai ouvert le projet Swift 3
pour voir ce qui a changé), et soudain dans tous mes applications et projets Swift 2
travaille toujours, a la même erreur:
L'application par défaut n'a pas encore été configurée
Chaque projet maintenant, lorsque j'ouvre dans XCode, la même erreur se produisant, je ne savais pas quoi faire, mais après avoir implémenté le code de @MichaelWilliams, tout fonctionne à nouveau correctement.
J'ai débogué mon Xcode (console Clear and Reload), mais rien ne fonctionne à côté de cette nouvelle approche de Michael.
Celui-ci a résolu mon problème:
override init() {
FIRApp.configure()
FIRDatabase.database().persistenceEnabled = true
}
Ce nouveau code peut-il en quelque sorte rendre mon application instable et puis-je craindre des problèmes de connexion/d'utilisation de la base de données Firebase maintenant?
Assurez-vous que vous avez la clé DATABASE_URL
dans votre GoogleService-Info.plist
Si vous utilisez Xcode 9, Swift 4 et Firebase 4, procédez comme suit:
override init() {
FirebaseApp.configure()
Database.database().isPersistenceEnabled = true
}
La solution la plus propre pour moi ici est d’avoir des propriétés paresseuses au cas où vous souhaiteriez avoir la base de données au-dessus de votre fichier. Supposons donc que vous ayez une classe FirebaseService dans laquelle vous voulez que la constante Firestore.firestore()
db soit utilisée dans toutes les fonctions de cette classe:
private lazy var db = Firestore.firestore()
Ou si vous utilisez le stockage Firebase:
private lazy var storage = Storage.storage().reference()
N'oubliez pas non plus que si vous faites référence à la base de données/stockage dans init()
de vos classes, vous pouvez toujours rencontrer le même problème, évitez-le.