在单个Android应用中使用多个firebase帐户进行Google Analytics

时间:2017-08-07 12:24:00

标签: android firebase google-analytics google-cloud-messaging

我有一个用例,其中1个应用程序将由多个独立的公司(特许经营)使用,这些公司将拥有自己的营销和管理团队。我需要用户在移动应用启动时选择特许经营权,然后从那时起,将所有分析数据推送到该特许经营的firebase(谷歌分析)帐户。类似地,从该特许经营服务器发送的任何推送通知都需要转发给用户。

这种配置可行吗?在过去,我曾经为每个特许经营店设置一个谷歌分析帐户,只需从特许经营选择中的服务器上下载UA-xxx号码,然后根据该设置设置谷歌分析对象..

通过连接到谷歌分析的firebase实现这一目标的适当方法是什么?

我找到了官方API参考:https://firebase.google.com/docs/configure/ 这个链接解释了如何为iOS做这个,但没有提到如何在android中做到这一点。但它确实说firebase init在用户代码之前运行..也许这意味着它不可能?

以下是他们提到的初始提供商:https://firebase.google.com/docs/reference/android/com/google/firebase/provider/FirebaseInitProvider

2 个答案:

答案 0 :(得分:11)

为每个新的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]");

请注意,只有 DEFAULT firebase应用才能在分析中使用

但首先需要删除清单中的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。 Firebase Analytics已停用。你确定是吗?   工作? - rMozes

首先

  1. 您是否通过放入清单工具删除默认提供程序:node =“remove”
  2. 按照我所描述的那样初始化['DEFAULT'] firebase app
  3. 在发送任何活动之前检查了['DEFAULT'] firebase应用是否已初始化
  4. ad 1)error: Missing google_app_id建议我gardle插件未按预期删除提供程序 - 并且您的应用程序正在启动默认提供程序,该应用程序抱怨缺少应用程序ID

    ad 3)在初始化firebase app之前,不要依赖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已存在。我   如您所述,初始化的默认firebase应用程序。是的,我记录了   应用名称和app_id,还有一个日志:AppName:[DEFAULT],Google   app id:valid_app_id但是当我想发布一些内容到分析时,   然后它说:缺少google_app_id。 Firebase Analytics已停用。    - rMozes

    您尝试在应用初始化之前发送事件的次数为99,99%(见上例)

      

    @ ceph3us我在onCreate方法中初始化FirebaseApp   应用子类。当按钮出现时,我将事件发送到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使用之前,通过反射将占位符ID更改为其他ID:

    hint how to

    2)通过Resources.getString(R.string.google_app_id)调用的自己的Resources类实现为占位符id提供自己的文本

    example how to achieve it(按ID添加新资源)

    如果您通过反射正确更改R字段或用自己的文字替换对Resources.getString(R.string.google_app_id)的调用,则不会收到错误的消息应用ID:“fuck_you_google”

    &安培;祝你好运:)

答案 1 :(得分:2)

您的应用中可能有多个Firebase实例

import * as moment from 'moment'

const yourDate = new Date()
const NewDate = moment(yourDate, 'DD-MM-YYYY')

您可以通过

获取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实例here

查看Auth和Realtime Database的完整示例用法

我会在这里留下这个解决方案,可能会与可能需要这个

的人的另一个答案重复

希望这有帮助:)