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?
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.
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.
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 .
Donc, cela se produit pour deux raisons possibles:
GoogleService-Info.plist
dans le bundle de votre application hôte, ouGoogleService-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.
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é.
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'
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.
Passez d'un simulateur à un "appareil iOS actuel" !
Travaillé pour moi!
Après cela fonctionne aussi sur le simulateur.
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)