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

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

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

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

我find了官方API参考: https : //firebase.google.com/docs/configure/此链接说明了如何在iOS上执行此操作,但未提及如何在Android中执行此操作。 但它确实说firebase init在用户代码之前运行..也许这意味着它不可能?

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

为每个新的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提供程序

    

手动初始化默认的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应用程序是否已初始化

广告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已经存在。 2.如您所述,我初始化了默认的firebase应用程序。 3.是的,我记录了应用程序名称和app_id并且有一个日志:AppName:[DEFAULT],Google应用程序ID:valid_app_id但是当我想发布一些内容到分析时,它会说:缺少google_app_id。 Firebase Analytics已停用。 – rMozes

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

@ ceph3us我在Application子类的onCreate方法中初始化了FirebaseApp。 单击按钮时,我将事件发送到firebase。 无论如何我上传了一个测试项目到github,你能看一下吗? 我有可能误解了一些事情。 github.com/rMozes/TestFirebaseAnalytics – rMozes

尝试(因为初始化是异步的 – 所以直到你测试它初始化你不能发送事件):

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

如果失败,你还有两次机会:)

通过在xml中定义字符串 :作为占位符

 fuck_you_google 

1)在调用init /或从firebase使用之前, 通过reflection将占位符id更改为其他ID

提示如何

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

一个如何实现它的例子 (通过id添加新资源)

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

& 祝你好运 :)

您的应用中可以有多个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"); 

您可以在此处查看使用多个Firebase实例的Auth和Realtime Database的完整示例用法

我会在这里留下这个解决方案,可能会与可能需要这个的人的另一个答案重复

希望这有帮助:)