web-dev-qa-db-fra.com

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

EDIT: Je tiens à souligner que j’ai des goûts pour lesquels je ne souhaite utiliser aucun de ces services Google. Si je tentais d’appliquer le plug-in google-services dans un tel cas, sans avoir un google-services.json applicable, entraîner une échec de la construction.

J'aimerais pouvoir initialiser le SDK Firebase, en particulier 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 FireBaseOptions avec les valeurs fournies dans google-services.json, et après un appel à FirebaseApp.initialize avec ces options, je reçois toujours

FirebaseInitProvider: FirebaseApp initialization unsuccessful

Je sais que c'est la méthode recommandée pour utiliser le fichier google-services.json, mais je dois pouvoir faire en sorte que l'application appelle différents projets Firebase, en fonction des versions de débogage/édition, tout en conservant le même nom de package.

Pour ce faire, il est conseillé d’avoir une paire debug/release pour toutes les valeurs nécessaires à l’initialisation de Firebase, puis de procéder de manière dynamique à l’initialisation.

        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);

Jusqu'à présent, cela ne semble pas fonctionner.

Toute aide est grandement appréciée!

9
Matej

Voici quelques conseils sur la façon d'utiliser plusieurs applications/bases de données Firebase dans le même projet Android Blog Firebase et Nouveaux documents de configuration

Cependant, ils parlent d'utiliser 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 fouillé dans leur canal Slack. Firebase utilise un ContentProvider appelé FirebaseInitProvider. Ceci utilise google-services.json pour initialiser l'application DEFAULT au démarrage. Cela se produit si le fichier JSON n’est pas présent. J'ai fait les étapes suivantes:

  • Suppression du google-services.json
  • Le plugin com.google.gms.google-services a été supprimé. Ce plugin recherche toujours le fichier json.
  • FirebaseInitProvider est ajouté via la fusion de manifestes. Toutefois, dans le manifeste de niveau supérieur, vous pouvez spécifier une balise node = remove pour supprimer 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 de l'instance. Si vous désactivez le service en utilisant la même technique de suppression du nœud manifeste, cette exception disparaît. Mais je pense que ce service effectue des tâches importantes de synchronisation/messagerie. Donc, pas sûr que ce soit sage de supprimer cela. Longue histoire courte - je cherche toujours la solution parfaite pour désactiver l'application par défaut/ne pas utiliser google-services.json. Toute autre indication sera profondément appréciée.

METTRE À JOUR:

On dirait que cette solution fonctionne après tout - sans désactiver FirebaseInstanceIdService et simplement supprimer FirebaseInitProvider comme mentionné ci-dessus. Assurez-vous simplement que Firebase.initializeApp a appelé la première chose dans la méthode Application :: onCreate.

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

J'ai trouvé une solution de contournement intéressante. Essayez ce qui suit: placez votre google-services.json dans n’importe quel exemple d’application google fournit pour l’intégration Firebase. Compilez-le.

Jetez un coup d'oeil sur le chemin app/build/generated/res/google-services/debug/values/, il devrait être généré un fichier values.xml avec un tas de chaînes 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.

2
zest

J'utilise également des variantes de construction pour appliquer différentes configurations à différents environnements. J'ai eu le même problème, car certaines variantes n'avaient pas une entrée appropriée dans le fichier google-services.json. cela a entraîné l'échec de certaines de mes versions lors de la génération d'un package d'application non configuré dans Firebase.

Ma solution consistait à ajouter des entrées d'applications factices pour les packages manquants dans les projets Firebase appropriés, dans le tableau de bord Firebase - puis en récupérant le fichier google-services.json mis à jour.

Peut-être pas la meilleure pratique, mais fait le travail dans mon cas.

0
Shlomi