Используйте несколько учетных записей firebase в одном приложении для Android для аналитики Google

У меня есть вариант использования, в котором одно приложение будет использоваться несколькими отдельными компаниями (франшизами), у которых будут свои собственные маркетинговые и управленческие команды. Мне нужно, чтобы пользователь выбрал франшизу при запуске мобильного приложения, а затем с этого момента отправил все данные аналитики в учетную запись firebase (Google Analytics) этой франшизы. Точно так же любые push-уведомления, отправляемые с серверов этой франшизы, должны отправляться пользователю.

Возможна ли такая конфигурация? Раньше я настраивал учетную запись Google Analytics для каждой франшизы и просто загружал номер UA-xxx с сервера при выборе франшизы, а затем настраивал объект аналитики Google на основе этого ..

Как лучше всего добиться этого с помощью firebase, подключенной к Google Analytics?

Я нашел официальную справку по API: https://firebase.google.com/docs/configure/ Эта ссылка объясняет, как это сделать для iOS, но не упоминает, как это сделать в Android. Однако там говорится, что инициализация firebase запускается перед пользовательским кодом ... возможно, это означает, что это невозможно?

Вот упомянутый ими провайдер инициализации: https://firebase.google.com/docs/reference/android/com/google/firebase/provider/FirebaseInitProvider.


person user230910    schedule 07.08.2017    source источник


Ответы (2)


создать для каждого нового приложения 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();

затем если вы хотите использовать Google Analytics, вам необходимо установить его по умолчанию, позвонив:

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

имейте в виду, что только это приложение firebase ПО УМОЛЧАНИЮ будет использоваться в аналитике.

но прежде всего вам нужно удалить провайдера инициализации в манифесте

        <!--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. Firebase Analytics отключена. Вы уверены, что он работает? - rMozes

прежде всего

  1. Вы удалили поставщика по умолчанию, добавив в манифест tools: node = "remove"?
  2. Вы инициализировали ['ПО УМОЛЧАНИЮ »] приложение firebase, как я описал
  3. Вы проверяли, инициализировано ли приложение firebase ['DEFAULT'] перед отправкой какого-либо события?

ad 1) error: Missing google_app_id подсказывает мне, что плагин gardle не удалил поставщика, как ожидалось, и ваше приложение запускает поставщика по умолчанию, который жалуется на отсутствие идентификатора приложения

объявление 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. Я удалил поставщика, как вы сказали, если я не удалю поставщика и не попытаюсь инициализировать приложение по умолчанию, то я получу исключение IllegalStateException о том, что приложение firebase по умолчанию уже существует. 2. Я инициализировал приложение firebase по умолчанию, как вы описали. 3. Да, я зарегистрировал имя приложения и app_id, и есть журнал: AppName: [DEFAULT], идентификатор приложения Google: valid_app_id. Но когда я хочу опубликовать что-то в аналитике, появляется сообщение: Отсутствует google_app_id. Firebase Analytics отключена. - rMozes

99,99% вы пытаетесь отправить событие до инициализации приложения! (см. пример выше)

@ ceph3us Я инициализирую FirebaseApp в методе onCreate подкласса Application. Я отправляю событие в firebase при нажатии кнопки. В любом случае я загрузил тестовый проект на github, вы можете взглянуть на него? Возможно, я что-то неправильно понял. github.com/rMozes/TestFirebaseAnalytics - rMozes

попробуйте (поскольку инициализация асинхронная - поэтому, пока вы не проверите ее инициализацию, вы не можете отправлять события):

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

в случае неудачи у вас есть еще два шанса :)

путем определения строки в xml: в качестве заполнителя

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

1) измените идентификатор заполнителя через отражения на другой перед любым вызовом init / или использованием из firebase:

подсказка, как это сделать

2) предоставить собственный текст для идентификатора заполнителя с помощью собственной реализации класса ресурсов для вызова Resources.getString (R.string.google_app_id):

пример того, как этого добиться (добавление новые ресурсы по id)

если вы правильно измените поле R с помощью отражений или замените вызов Resources.getString (R.string.google_app_id) собственным текстом , вы не получите сообщение о неправильном идентификаторе приложения: "fuck_you_google"

& удачи :)

person ceph3us    schedule 07.08.2017
comment
пожалуйста, не могли бы вы еще немного расширить? - person user230910; 07.08.2017
comment
вам все еще нужен файл .json с этим решением? - person user230910; 07.08.2017
comment
есть ли какие-либо изменения в том, как выполняются вызовы аналитики? или все еще стандартным способом? - person user230910; 07.08.2017
comment
нет, но только вы можете вызывать api аналитики только для приложения по умолчанию, поэтому вам нужно переключать их, передавая разные параметры - person ceph3us; 07.08.2017
comment
Последний комментарий, почему перед командной строкой initApp стоит знак = с [ПО УМОЛЧАНИЮ]? - person user230910; 07.08.2017
comment
Я добавил пример, как вызвать событие - person ceph3us; 07.08.2017
comment
Давайте продолжим это обсуждение в чате. - person user230910; 07.08.2017
comment
Я реализовал это в своем коде, но когда я пытаюсь опубликовать в Google Analytics, я получаю сообщение об ошибке: Отсутствует google_app_id. Firebase Analytics отключена. - Вы, наверное, знаете, какой шаг мне не хватает? - person user230910; 08.08.2017
comment
@ ceph3us Я попробовал ваше решение, но у меня оно не сработало. Если я инициализирую firebase во время выполнения, как вы предложили, я получаю сообщение об ошибке: Отсутствует google_app_id. Firebase Analytics отключена. Вы уверены, что он работает? - person rMozes; 09.08.2017
comment
@ ceph3us 1. Я удалил поставщика, как вы сказали, если я не удалю поставщика и не попытаюсь инициализировать приложение по умолчанию, то я получу исключение IllegalStateException о том, что приложение firebase по умолчанию уже существует. 2. Я инициализировал приложение firebase по умолчанию, как вы описали. 3. Да, я зарегистрировал имя приложения и app_id, и есть журнал: AppName: [DEFAULT], идентификатор приложения Google: valid_app_id. Но когда я хочу опубликовать что-то в аналитике, появляется сообщение: Отсутствует google_app_id. Firebase Analytics отключена. - person rMozes; 09.08.2017
comment
@rMozes попробуйте удалить приложение из телефона, перезагрузите заново, затем попробуйте еще раз - person ceph3us; 09.08.2017
comment
вы ждали, пока приложение инициализируется? перед отправкой события - как я привел пример? Но когда я хочу опубликовать что-то в аналитике, там написано: Отсутствует google_app_id. Firebase Analytics отключена, и публиковать точные журналы с момента запуска приложения. - person ceph3us; 09.08.2017
comment
@ ceph3us Я инициализирую FirebaseApp в методе onCreate подкласса Application. Я отправляю событие в firebase при нажатии кнопки. В любом случае я загрузил тестовый проект на github, вы можете взглянуть на него? Возможно, я что-то неправильно понял. github.com/rMozes/TestFirebaseAnalytics - person rMozes; 09.08.2017
comment
инициализация асинхронная - поэтому, пока вы не проверите ее инициализацию, вы не можете отправлять события, я посмотрю на код, когда я вернусь с прогулки :) - person ceph3us; 09.08.2017
comment
@ ceph3us Пробовал, но результат тот же. Как думаете, в чем может быть проблема? Я действительно понятия не имею - person rMozes; 09.08.2017
comment
@ ceph3us - мы так близки, я готов отдать 100 репутации, чтобы закончить этот - person user230910; 10.08.2017
comment
@rMozes делает то, что я описал на последнем шаге :) - создайте запись ресурса с идентификатором приложения и измените ее с помощью отражения на желаемое после onCreate в классе приложения перед вызовом для инициализации firebase - person ceph3us; 10.08.2017
comment
Направление от Google заключается в том, что невозможно установить другой appId во время выполнения для FirebaseAnalytics. И похоже, никому не удалось заставить это решение успешно работать. Почему за него проголосовали? - person GraSim; 08.01.2020

В ваших приложениях можно использовать несколько экземпляров Firebase

FirebaseOptions options = new FirebaseOptions.Builder()
   .setApplicationId("Your AppId") // Required for Analytics.
   .setApiKey("You ApiKey") // Required for Auth.
   .setDatabaseUrl("Your DB Url") // If you wanted to
   .build();

FirebaseApp.initializeApp(context, options, "CompanyA");

Которые вы можете получить экземпляры Firebase

FirebaseApp appCompanyA = FirebaseApp.getInstance("CompanyA");

Вы можете увидеть полный пример использования Auth и базы данных в реальном времени с использованием нескольких экземпляров Firebase здесь

Я оставлю здесь это решение, которое может дублироваться с другими ответами для тех, кому это может понадобиться

Надеюсь на эту помощь :)

person Yati Dumrongsukit    schedule 07.08.2017
comment
отлично, так что это полностью избавило от необходимости в файле .json? - person user230910; 07.08.2017
comment
@ user230910 да, и когда вы используете аналитику firebase для отправки любого события, вы можете использовать другой com.google.android.gms.analytics.Tracker - person Yati Dumrongsukit; 07.08.2017
comment
покажите мне, как вы звоните, чтобы отправить сюда событие аналитики :)) - person ceph3us; 07.08.2017
comment
спасибо за тяжелую работу, отвечая на мой вопрос, ценю :) - person user230910; 07.08.2017