web-dev-qa-db-fra.com

La configuration de Firebase échoue - Swift

Dans mon application, j'utilise correctement Firebase et dans AppDelegate, je fais la configuration:

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

Maintenant, je fais quelques tests unitaires sur une cible associée et lorsque je le lance, des erreurs se produisent:

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)

Aucun conseil?

27
Luca Davanzo

Je viens de remarquer que cela commence à arriver et que mes versions de travis échouent avec Firebase 3.16. J'ai rétrogradé la version 3.7.1, qui était la version que j'avais précédemment sur le projet et cela fonctionne à nouveau. 

Je n'ai pas eu le temps de m'étudier davantage, mais c'est une solution rapide. Il peut s'agir d'un bogue Firebase ou ils peuvent avoir changé quelque chose et la configuration est différente maintenant. 

Edit: Apparemment, revenir à 3.15 fonctionne assez bien.

16
Michal Klein

Depuis Firebase 3.16.0, il semble que Google Firebase ne récupère pas le GoogleService-Info.plist à partir de la version de test unitaire, même si plist est inclus dans les cibles de test de l’application et de l’unité. Cela ne semble pas être résolu dans 3.17.0. Comme d'autres l'ont fait remarquer, le déclassement à 3.15.0 semble éviter le problème.

Mais pour beaucoup, l’initialisation de Firebase lors des tests unitaires n’est peut-être pas nécessaire et même non souhaitée. Par exemple, vous ne voulez probablement pas que les rapports de Firebase sur les plantages des tests unitaires soient bloqués. Dans ces scénarios, vous pouvez facilement ajouter une protection autour de FIRApp.configure() pour ne pas l'initialiser lors de l'exécution de tests unitaires via les éléments suivants:

import Foundation

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

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

Assurez-vous ensuite de définir la variable d'environnement TEST=1 only dans votre schéma de test.

11
markshiz

Cause probable

Cela est probablement dû à la manière dont les dépendances du pod sont configurées. Voyez-vous des avertissements de Xcode concernant plusieurs implémentations définies dans les deux classes, telles que:

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 tel est le cas, cela signifie que vous devez probablement modifier la configuration des dépendances de votre pod. Etant donné qu'une cible XCTest introduit également la cible de l'application hôte, il est possible d'obtenir plusieurs importations du même objet. Dans ce cas, FIRApp initialisait l'ID d'instance, mais provoquait la vérification de l'ID d'instance auprès de autre FIRApp, qui disait qu'il n'était pas configuré. Cela explique pourquoi il se bloque en disant qu'il ne trouve pas l'application qui l'a initialisée.

Voir la réponse de morganchen12 @ dans Github pour voir un exemple de fichier correct .

Réponse originale ci-dessous:

Donc, cela se produit pour deux raisons possibles:

  1. Firebase ne trouve pas votre GoogleService-Info.plist dans le bundle de votre application hôte, ou
  2. Le fichier GoogleService-Info.plist ne contient pas la clé GCM_SENDER_ID ou contient une valeur vide.

Nous pouvons éliminer (2) assez facilement - pouvez-vous inspecter votre fichier GoogleService-Info.plist pour voir s’il a un GCM_SENDER_ID valide (ce sera un tas de chiffres, comme 3252652634).

J'explorerai pourquoi le GoogleService-Info.plist peut apparemment être trouvé avec 3.15.x vs 3.16.0 et versions ultérieures.

De plus, comme @markshiz l'a dit , vous ne voudrez peut-être pas que Firebase démarre pendant le test unitaire de votre application. Vous pouvez placer votre appel FIRApp.configure() derrière une instruction if en vérifiant si l'application est en cours d'exécution en tant que test unitaire.

Pour vous aider également à déboguer ceci, pourriez-vous exécuter votre application de test avec la variable d'environnement -FIRDebugEnabled set ? La sortie de ce serait très utile.

6
Rizwan Sattar

Il m'a fallu un certain temps pour trouver la version correcte à installer jusqu'à la sortie de la 3.17.0.

pod 'Firebase/Core', '~> 3.15.0'
pod 'Firebase/Database', '~> 3.15.0'
pod 'Firebase/Auth', '~> 3.15.0'

Cela fonctionne garanti. 

Si vous oubliez le .0 et notez 3.15 à la place, le 3.16.0 défectueux sera toujours installé. 

4
Houman

Firebase mis à niveau vers la version 4.1.0 a résolu mon problème. De plus, de nombreux avertissements sont passés. Je suggère de mettre à jour Firebase

pod 'Firebase', '~> 4.1.0'
1
William Hu

J'ai rencontré le même problème et aucun des correctifs proposés n'a aidé.

Je voyais les avertissements relatifs à l’implémentation des classes en double, comme indiqué au bas de cette publication: https://github.com/firebase/FirebaseUI-iOS/issues/271

La suppression de tous les frameworks firebase des cibles de test, comme mentionné dans ce message, a résolu le problème pour moi.

0
JanR

Passez d'un simulateur à un "appareil iOS actuel" !

Travaillé pour moi!

Après cela fonctionne aussi sur le simulateur.

0
Shikhar Singhal

Avez-vous essayé cela?

let options = FIROptions(googleAppID: String!,
                             bundleID: String!,
                             gcmSenderID: String!,
                             apiKey: String!,
                             clientID: String!,
                             trackingID: String!,
                             androidClientID: String!,
                             databaseURL: String!,
                             storageBucket: String!,
                             deepLinkURLScheme: String!)
FIRApp.configure(with: config)
0
Quver