9 votes

Puis-je initialiser Firebase sans utiliser google-services.json ?

EDIT : Je dois souligner que j'ai des saveurs pour lesquelles je ne veux utiliser aucun de ces services Google, et essayer d'appliquer le plugin google-services dans un tel cas, sans avoir un google-services.json applicable, résulterait en un échec de la construction.

Je voudrais pouvoir initialiser le SDK Firebase, notamment pour utiliser la configuration à distance, SANS utiliser le fichier google-services.json.

Je vois que FirebaseApp a une méthode d'initialisation, qui reçoit un objet FirebaseOptions.

J'ai construit les FirebaseOptions avec les valeurs fournies dans le google-services.json, et après un appel à FirebaseApp.initialize avec ces options, j'obtiens toujours

FirebaseInitProvider: FirebaseApp initialization unsuccessful

Je sais qu'il est recommandé d'utiliser le fichier google-services.json, mais j'ai besoin de pouvoir faire en sorte que l'application appelle différents projets Firebase, en fonction des builds debug/lease, tout en gardant le même nom de paquet.

La façon dont j'aimerais procéder est d'avoir une paire débogage/libération pour toutes les valeurs nécessaires à l'initialisation de Firebase, puis d'effectuer l'initialisation de façon dynamique.

        FirebaseOptions options = new FirebaseOptions.Builder()
                .setApplicationId(appId)
                .setApiKey(apiKey)
                .setGcmSenderId(appContext.getString(
                        isDebug ? R.string.firebase_testing_gcm_sender_id :
                                R.string.firebase_production_gcm_sender_id))
                .setDatabaseUrl(appContext.getString(
                        isDebug ? R.string.firebase_testing_database_url :
                                R.string.firebase_production_database_url))
                .setStorageBucket(
                        appContext.getString(
                                isDebug ? R.string.firebase_testing_storage_bucket :
                                        R.string.firebase_production_storage_bucket))
                .build();
        FirebaseApp.initializeApp(appContext, options);

Pour l'instant, ça ne semble pas fonctionner.

Toute aide est grandement appréciée !

9voto

exifguy Points 188

Voici quelques indications sur la manière d'utiliser plusieurs applications/bases de données Firebase dans le même projet Android. Blog Firebase y Nouveaux documents de configuration

Cependant, ils parlent de l'utilisation d'une application secondaire en plus de l'application par défaut - qui utilise toujours le fichier google-services.json. J'ai fait un peu de recherche et j'ai fouillé dans leur canal Slack. Firebase utilise un ContentProvider appelé FirebaseInitProvider. Il utilise le fichier google-services.json pour initialiser l'application par défaut au démarrage. Il se bloque si le fichier json n'est pas présent. J'ai fait les étapes suivantes :

  • Suppression du fichier google-services.json
  • Suppression du plugin com.google.gms.google-services. Ce plugin cherche toujours le fichier json.
  • FirebaseInitProvider est ajouté via la fusion des manifestes. Cependant, dans le manifeste de niveau supérieur, vous pouvez spécifier une balise node=remove pour empêcher son ajout dans le manifeste final.

    <provider android:authorities="${applicationId}.firebaseinitprovider"
        android:name="com.google.firebase.provider.FirebaseInitProvider" 
        android:exported="false"
        tools:node="remove"/>

Cependant, même après cela, je vois toujours une exception :

java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process myfirebasedemo.net. Make sure to call FirebaseApp.initializeApp(Context) first.
                                                                 at com.google.firebase.FirebaseApp.getInstance(Unknown Source)
                                                                 at com.google.firebase.iid.FirebaseInstanceId.getInstance(Unknown Source)
                                                                 at com.google.firebase.iid.FirebaseInstanceIdService.zza(Unknown Source)
                                                                 at com.google.firebase.iid.FirebaseInstanceIdService.zzm(Unknown Source)
                                                                 at com.google.firebase.iid.zzb$2.run(Unknown Source)
                                                                 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                                 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                                 at java.lang.Thread.run(Thread.java:818)

On dirait que FirebaseInstanceIdService cherche toujours l'application d'instance. Si vous désactivez le service, en utilisant la même technique de suppression du noeud manifeste, cette exception disparaît. Mais je pense que ce service fait des choses importantes de synchronisation / messagerie. Je ne suis donc pas sûr qu'il soit judicieux de le supprimer. Pour faire court, je suis toujours à la recherche de la solution parfaite pour désactiver l'application par défaut / ne pas utiliser le google-services.json. Toute indication supplémentaire sera très appréciée.

UPDATE :

Il semble que cette solution fonctionne après tout -- sans désactiver le FirebaseInstanceIdService et en supprimant simplement le FirebaseInitProvider comme mentionné ci-dessus. Il faut juste s'assurer que Firebase.initializeApp est appelé en premier dans la méthode Application::onCreate.

FirebaseApp.initializeApp(context, new FirebaseOptions.Builder().setApiKey("<VAL>").
                    setApplicationId("<VAL>").
                    setDatabaseUrl("<VAL>").
                    setGcmSenderId("<VAL>").
                    setStorageBucket("<VAL>").build());

2voto

zest Points 2098

J'ai trouvé une solution intéressante. Essayez ce qui suit : mettez votre google-services.json à un exemple d'application google fournit pour l'intégration de Firebase. Compilez-le.

Jetez un coup d'œil sur le chemin app/build/generated/res/google-services/debug/values/ il devrait être généré values.xml avec un ensemble de chaînes de caractères mentionnées dans les erreurs que vous avez décrites. Copiez ces chaînes dans le fichier value.xml de votre projet. C'est tout.

0voto

Shlomi Points 200

J'utilise également des variantes de construction pour appliquer différentes configurations à différents environnements. J'ai rencontré le même problème, car certaines variantes n'avaient pas d'entrée appropriée dans le fichier google-services.json qui a fait échouer certaines de mes constructions lors de la génération d'un paquet d'applications qui n'était pas configuré dans firebase.

La solution que j'ai trouvée est d'ajouter des entrées d'applications fictives pour les paquets manquants dans les projets firebase concernés, sur le tableau de bord firebase. google-services.json à partir de celui-ci.

Ce n'est peut-être pas la meilleure pratique, mais elle a fait l'affaire dans mon cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X