La configuration de la base de données Firebase échoue-Swift

Dans mon application que je suis avec succès à l'aide de Firebase et dans AppDelegate je fais de la configuration:

// ### Initialize Firebase
FIRApp.configure()

Maintenant je fais un peu tests unitaires connexes sur la cible et lorsque je le lance, j'obtiens une erreur:

2017-04-14 14:53:22.351 MyProject[28753] <Error> [Firebase/Core][I-COR000004] App with name __FIRAPP_DEFAULT does not exist.
2017-04-14 14:53:22.354 MyProject[28753] <Error> [Firebase/Messaging][I-IID001000] Firebase is not set up correctly. Sender ID is nil or empty.
2017-04-14 14:53:22.356 MyProject[28753] <Notice> [Firebase/Analytics][I-ACS023007] Firebase Analytics v.3800000 started
2017-04-14 14:53:22.356 MyProject[28753] <Notice> [Firebase/Analytics][I-ACS023008] To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled
2017-04-14 14:53:22.381 MyProject[28753:712475] *** Terminating app due to uncaught exception 'com.firebase.instanceid', reason: 'Could not configure Firebase InstanceID. Google Sender ID must not be nil or empty.'

Versions:

Firebase/Core (3.16.0)
Firebase/Messagging (3.16.0)

un conseil?

24
demandé sur Luca Davanzo 2017-04-14 16:01:13

8 réponses

je viens de remarquer que ça commence à m'arriver et mes constructions travis sont en panne avec la base de données 3.16. J'ai rétrogradé à 3.7.1 qui était la version que j'avais auparavant sur le projet et il fonctionne à nouveau.

je n'ai pas eu le temps d'y regarder de plus mais c'est une solution rapide. Il peut être un Firebase bug ou ils ont peut-être changé quelque chose, et la configuration est différente maintenant.

Edit: apparemment revenir à 3.15 fonctionne assez bien.

15
répondu Michal Klein 2017-04-19 12:05:15

début dans Firebase 3.16.0, il semble que Google Firebase ne capte pas le GoogleService-Info.plist de la construction de test de l'Unité, même si le plist est inclus dans l'application et de l'unité de test cibles. Cela ne semble pas être résolu 3.17.0. Comme d'autres l'ont fait remarquer, rétrogradation à 3.15.0 semble esquiver le problème.

mais pour beaucoup, l'initialisation de Firebase pendant les tests unitaires peut ne pas être nécessaire, et en fait non intentionnel --par exemple, vous ne voulez probablement pas de rapport de Firebase sur l'unité de test se bloque. Dans ces scénarios, vous pouvez facilement ajouter un garde autour de FIRApp.configure() de ne pas l'initialiser lors de l'exécution de tests unitaires par l'intermédiaire de ce qui suit:

import Foundation

func isUnitTesting() -> Bool {
    return ProcessInfo.processInfo.environment["TEST"] != nil
}

if !isUnitTesting() {
    FIRApp.configure()
}

Alors assurez-vous de définir la variable d'environnement TEST=1 dans votre schéma de test.

10
répondu markshiz 2017-05-01 22:10:53

Cause Probable

cela se produit probablement en raison de la façon dont vos dépendances de Pod sont configurées. Voyez-vous des avertissements de Xcode sur des implémentations multiples définies dans les deux classes, comme:

objc[54869]: Class FIRApp is implemented in both /Users/hli/Library/Developer/CoreSimulator/Devices/7766B001-8A5F-43B6-8860-5D36E8DC452C/data/Containers/Bundle/Application/8A18B716-D1D2-4110-83E2-9AE577A034CD/FirebaseDemo.app/FirebaseDemo (0x10d306d30) and /Users/hli/Library/Developer/Xcode/DerivedData/FirebaseDemo-ddfdueufgmkxwzameiwbuhnokgax/Build/Products/Debug-iphonesimulator/FirebaseDemo.app/PlugIns/FirebaseDemoTests.xctest/FirebaseDemoTests (0x11df8cbb0). One of the two will be used. Which one is undefined.

si c'est le cas, cela signifie que vous devez probablement modifier la configuration de vos dépendances de pod. Depuis qu'une cible XCTest apporte en fait aussi la cible de l'application hôte, il est possible d'obtenir des importations multiples du même objet. Dans ce cas, le FIRApp initialisait ID d'Instance, mais il faisait que L'ID D'Instance vérifiait avec le autres FIRApp, qui disait qu'il n'était pas configuré. C'est ce qui explique pourquoi il plante en disant qu'il ne peut pas trouver l'application qui initialisé.

voir la réponse de morganchen12@dans Github pour voir un exemple d'un Podfile correct.

Réponse Originale Ci-Dessous:

Donc, ce qui se passe peut-être deux raisons:

  1. Firebase ne trouve pas votre GoogleService-Info.plist dans votre unité tester le paquet de l'application hôte, ou
  2. GoogleService-Info.plist le fichier est manquant GCM_SENDER_ID ou, a une valeur vide.

Nous pouvons éliminer (2) assez facilement - peut inspecter votre GoogleService-Info.plist le fichier pour voir si elle est valide à la recherche GCM_SENDER_ID (ce sera un tas de nombres, comme 3252652634).

je vais étudier pourquoi l' GoogleService-Info.plist apparemment, peut être trouvé avec 3.15.x vs 3.16.0 et plus tard.

en plus, @markshiz dit, il se peut que vous ne vouliez pas que Firebase démarre pendant votre test unitaire pour votre application. Vous pouvez mettre votre FIRApp.configure() appeler derrière un IF-statement, en vérifiant si l'application fonctionne comme un test unitaire.

Pour également aider à déboguer cela, pourriez-vous exécuter votre application de test avec la variable d'environnement -FIRDebugEnabled set