web-dev-qa-db-ja.com

google-services.jsonを使用せずにFirebaseを初期化できますか?

編集:私は強調すべきです、私はこれらのGoogleサービスのいずれも使用したくないフレーバーを持っています、そして該当するgoogle-services.jsonがなければ、そのような場合にgoogle-servicesプラグインを適用しようとすると、ビルドが失敗します。

Firebase SDKを初期化できます。具体的には、google-services.jsonを使用せずにRemote Configを使用できます。

FirebaseAppには、FirebaseOptionsオブジェクトを受け取るinitializeメソッドがあることがわかります。

Google-services.jsonで提供される値を使用してFirebaseOptionsを構築しました。これらのオプションを使用してFirebaseApp.initializeを呼び出した後、常に

FirebaseInitProvider: FirebaseApp initialization unsuccessful

Google-services.jsonファイルの使用が推奨される方法であることはわかっていますが、パッケージ名を同じに保ちながら、デバッグ/リリースビルドに応じて、アプリが異なるFirebaseプロジェクトを呼び出せるようにする必要があります。

これを行う方法は、Firebaseを初期化するために必要なすべての値のデバッグ/リリースペアを用意し、動的に初期化することです。

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

これまでのところ、機能していないようです。

すべての助けに大歓迎です!

15
Matej

ここでは、同じで複数のFirebaseアプリ/データベースを使用する方法に関するいくつかのヒントを示しますAndroid project Firebase Blog および New Config Docs

ただし、これらは、google-services.jsonを引き続き使用するデフォルトアプリに加えて、セカンダリアプリの使用について説明しています。私は彼らのSlackチャンネルで少しリサーチをしたり、ぶちまわったりしました。 Firebaseは、FirebaseInitProviderと呼ばれるContentProviderを使用します。これは、起動時にgoogle-services.jsonを使用してDEFAULTアプリを初期化します。 jsonファイルが存在しない場合はbarfsします。次の手順を実行しました。

  • Google-services.jsonを削除しました
  • Com.google.gms.google-servicesプラグインを削除しました。この plugin は常にjsonファイルを探します。
  • FirebaseInitProviderはマニフェストのマージによって追加されます。ただし、最上位のマニフェストでは、node = removeタグを指定して、これを最終マニフェストに追加されないようにすることができます。

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

ただし、この後でも例外が表示されます。

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)

FirebaseInstanceIdServiceは引き続きインスタンスアプリを探しているようです。同じマニフェストノードの削除手法を使用してサービスを無効にすると、この例外はなくなります。しかし、私はこのサービスが重要な同期/メッセージングのことをしていると思います。これを削除するのが賢明かどうかはわかりません。簡単に言えば、私はまだデフォルトアプリを無効にする/google-services.jsonを使用しないための完璧な解決策を探しています。それ以上のポインタは深く感謝されます。

更新:

結局のところ、このソリューションは機能するようです。FirebaseInstanceIdServiceを無効にせず、上記のようにFirebaseInitProviderを削除するだけです。 Firebase.initializeAppがApplication :: onCreateメソッドの最初のものを呼び出すことを確認する必要があるだけです。

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

興味深い回避策を見つけました。以下を試してください:google-services.json任意のサンプルアプリにgoogle provides for Firebase integration。コンパイルします。

パスを見てみましょうapp/build/generated/res/google-services/debug/values/生成する必要がありますvalues.xmlあなたが説明したエラーで言及された文字列の束を含むファイル。これらの文字列をプロジェクトのvalue.xmlファイルにコピーします。それでおしまい。

2

また、さまざまな環境にさまざまな構成を適用するためにビルドバリアントを使用しています。一部のバリアントにはgoogle-services.jsonファイルに適切なエントリがなかったため、同じ問題が発生しました。そのため、Firebaseで構成されていないアプリパッケージを生成すると、一部のビルドが失敗しました。

これに対する私の回避策は、Firebaseダッシュボードで、関連するFirebaseプロジェクトで不足しているパッケージのダミーアプリケーションエントリを追加することでした-更新されたgoogle-services.jsonファイルをそこから取得しました。

ベストプラクティスではないかもしれませんが、私の場合は仕事をしました。

1
Shlomi

_google-services.json_は完全にオプションであり、便利であることを意味します。したがって、不便を見つけた場合は、絶対に使用しないでください。

お気づきかもしれませんが、jsonファイルはビルド時にのみ使用されます。 _google-services_プラグインは、JSONファイルを特定の文字列を含むリソースxmlファイルに変換します。次のようになります。

_<?xml version="1.0" encoding="utf-8"?>
<resources>

    <! -- Present in all applications -->
    <string name="google_app_id" translatable="false">1:1035469437089:Android:73a4fb8297b2cd4f</string>

    <! -- Present in applications with the appropriate services configured -->
    <string name="gcm_defaultSenderId" translatable="false">1035469437089</string>
    <string name="default_web_client_id" translatable="false">337894902146-e4uksm38sne0bqrj6uvkbo4oiu4hvigl.apps.googleusercontent.com</string>
    <string name="ga_trackingId" translatable="false">UA-65557217-3</string>
    <string name="firebase_database_url" translatable="false">https://example-url.firebaseio.com</string>
    <string name="google_api_key" translatable="false">AIzbSyCILMsOuUKwN3qhtxrPq7FFemDJUAXTyZ8</string>
    <string name="google_crash_reporting_api_key" translatable="false">AIzbSyCILMsOuUKwN3qhtxrPq7FFemDJUAXTyZ8</string>
    <string name="project_id" translatable="false">mydemoapp</string>

</resources>
_

これらのエントリを独自の_strings.xml_ファイルに作成するだけで、FirebaseApp.initializeApp()が実行時にそれらを見つけます。すべてのキーが必要なわけではなく、使用しているサービスによって異なります。たとえば、ほとんどすべてのサービスで_google_app_id_キーが必要です。 Firestoreはそれと_project_id_だけを必要としますが、Firebase Authは_google_api_key_も必要です。実験して必要なものを見つけるのはそれほど難しくないはずです。

いくつかのリンク:

0
Sam Stern