web-dev-qa-db-ja.com

Googleアナリティクス用の単一のAndroidアプリで複数のFirebaseアカウントを使用する

1つのアプリが、独自のマーケティングチームと管理チームを持つ複数の別々の会社(フランチャイズ)によって使用されるユースケースがあります。モバイルアプリの起動時にユーザーがフランチャイズを選択する必要があります。その時点から、すべての分析データをそのフランチャイズのFirebase(Googleアナリティクス)アカウントにプッシュします。同様に、そのフランチャイズのサーバーから送信されるプッシュ通知はすべてユーザーに送信する必要があります。

この構成は可能ですか?以前は、フランチャイズごとにGoogleアナリティクスアカウントを設定し、フランチャイズの選択時にサーバーからUA-xxx番号をダウンロードして、それに基づいてGoogleアナリティクスオブジェクトを設定していました。

グーグルアナリティクスに接続されたfirebaseを介してこれを達成するための適切な方法は何ですか?

公式のAPIリファレンスを見つけました: https://firebase.google.com/docs/configure/ このリンクでは、iOSでの実行方法について説明していますが、Androidでの実行方法については触れていません。ただし、firebase initはユーザーコードの前に実行されると言われています。おそらくそれは不可能であることを意味しますか?

彼らが言及しているinitプロバイダーは次のとおりです: https://firebase.google.com/docs/reference/Android/com/google/firebase/provider/FirebaseInitProvider

14
user230910

新しいFirebaseアプリごとに作成する

    FirebaseApp firebaseApp = 
          FirebaseApp.initializeApp(Context, FirebaseOptions,firebaseAppName);

オプションを渡すことでfirebaseアプリを作成できます:

https://firebase.google.com/docs/reference/Android/com/google/firebase/FirebaseOptions.Builder

FirebaseOptions options = new FirebaseOptions.Builder()
    .setApiKey(String)
    .setApplicationId(String)
    .setDatabaseUrl(String)
    .build();

次にアナリティクスを使用する場合は、デフォルトのものを設定する必要があります呼び出し:

FirebaseApp firebaseApp = 
      FirebaseApp.initializeApp(Context, FirebaseOptions,"[DEFAULT]");

これだけが分析に使用されることに注意してください[〜#〜] default [〜#〜] firebase app

しかし、最初に必要なことはすべてマニフェストのinitプロバイダーを削除する

        <!--remove firebase provider to init manually -->
    <provider
        Android:name="com.google.firebase.provider.FirebaseInitProvider"
        Android:authorities="${applicationId}.firebaseinitprovider"
        tools:node="remove"/>

およびデフォルトのFirebaseアプリを手動で初期化

デフォルトのFirebaseアプリを介してイベントを送信する方法の例(初期化後):

// get tracker instance
FirebaseAnalytics trakerInstance = FirebaseAnalytics.getInstance(context);
// create bundle for params
Bundle params = new Bundle();
// put param for example action
params.putString(ACTION_KEY, eventAction);
// send event 
trackerInstance.logEvent(eventCategory, params);

@ ceph3us私はあなたの解決策を試しましたが、うまくいきませんでした。あなたが提案したように実行時にfirebaseを初期化すると、エラーが発生します:google_app_idがありません。 FirebaseAnalyticsが無効になっています。動作していますか? – rMozes

まず第一に

  1. マニフェストツールを挿入してデフォルトのプロバイダーを削除しました:node = "remove"
  2. 私が説明したように、u 初期化された['DEFAULT'] firebaseアプリ
  3. イベントを送信する前に['DEFAULT'] Firebaseアプリが初期化されているかどうかを確認してください

広告1)error: Missing google_app_idは、gardleプラグインがプロバイダーを期待どおりに削除しなかったことを示唆しています-そして、アプリは、アプリIDの欠落について文句を言うデフォルトのプロバイダーを開始しています

ad 3)Firebaseアプリが初期化される前に、Firebaseアプリに依存する呼び出しを行わないでください

    protected boolean isDefaultFirebaseAppInitialized() {
        try {
            // try get
            return FirebaseApp.getInstance(FirebaseApp.DEFAULT_APP_NAME) != null;
            // catch illegal state exc
        } catch (IllegalStateException ise) {
            // on such case not initialized
            return false;
        }
    }

// check on default app 
if(isDefaultFirebaseAppInitialized()) {
    // get tracker 
    FirebaseAnalytics trakerInstance = FirebaseAnalytics.getInstance(context);
    // log event 
    trackerInstance.logEvent(eventCategory, params);
} else {
    // postpone
}

@ ceph3us 1.プロバイダーを削除しました。プロバイダーを削除せずにデフォルトのアプリを初期化しようとすると、デフォルトのFirebaseアプリが既に存在することについてIllegalStateExceptionが発生します。 2.説明したように、デフォルトのFirebaseアプリを初期化しました。 3.はい、アプリ名とapp_idをログに記録しましたが、ログがあります:AppName:[DEFAULT]、Google app id:valid_app_idしかし、アナリティクスに何かを投稿したい場合は、次のように表示されます:google_app_idがありません。 FirebaseAnalyticsが無効になっています。 – rMozes

99,99%アプリが初期化される前にイベントを送信しようとしています!(上記の例を参照)

@ ceph3usApplicationサブクラスのonCreateメソッドでFirebaseAppを初期化します。ボタンがクリックされたときにFirebaseにイベントを送信します。とにかく私はテストプロジェクトをgithubにアップロードしました、それを見ていただけますか?何かを誤解している可能性があります。 github.com/rMozes/TestFirebaseAnalytics – rMozes

try(初期化は非同期であるため、初期化をテストするまでイベントを送信できません):

https://github.com/rMozes/TestFirebaseAnalytics/compare/master...c3ph3us:patch-2

上記が失敗した場合、さらに2つのチャンスがあります:)

xmlで文字列を定義することにより:プレースホルダーとして

<string name="google_app_id">fuck_you_google</string>

1)reflectionsを介してプレースホルダーIDを変更する initを呼び出す前、またはfirebaseから使用する前に他のIDに変更する:

ヒント

2)プレースホルダーIDに独自のテキストを提供する Resources.getString(R.string.google_app_id)呼び出しの独自のResourcesクラス実装を介して:

それを達成する方法の例 (idによって新しいリソースを追加する)

リフレクションを介してRフィールドを適切に変更するか、Resources.getString(R.string.google_app_id)の呼び出しを独自のテキストに置き換えた場合メッセージが間違ったアプリIDを取得しない: "fuck_you_google"

& 幸運を :)

16
ceph3us