我是独立开发者,开发了两个Android游戏,使用Unity(其中一个正在运行,另一个正在闭门测试)。我想在一个地方看到每个应用的安装量、活跃用户和收入,而不需要检查五个不同的控制台。最终,我使用了一个Firebase项目来管理整个工作室,每个游戏都有自己的应用。以下是我的经验,如果它能节省一些人的周末时间,我会很高兴。

1. 媒介广告收入会通过ad_impression进入

我使用Unity LevelPlay进行媒介。LevelPlay会给出每个广告的收入,从每个网络,所以我只需要将其转发到GA4作为标准的ad_impression事件:

void OnImpression(LevelPlayImpressionData data)
{
    if (data == null || !data.Revenue.HasValue) return;
    FirebaseAnalytics.LogEvent(FirebaseAnalytics.EventAdImpression, new Parameter(FirebaseAnalytics.ParameterAdPlatform, "ironSource"), new Parameter(FirebaseAnalytics.ParameterAdSource, data.AdNetwork ?? ""), new Parameter(FirebaseAnalytics.ParameterAdFormat, data.AdFormat ?? ""), new Parameter(FirebaseAnalytics.ParameterAdUnitName, data.MediationAdUnitName ?? ""), new Parameter(FirebaseAnalytics.ParameterCurrency, "USD"), new Parameter(FirebaseAnalytics.ParameterValue, data.Revenue.Value));
}

在每个广告对象(奖励、插屏、横幅)上hook它。 impression回调可能会在Firebase完成其依赖检查之前到达,所以我会将这些事件加入队列并在它准备好时flush它们。

2. 不要将AdMob链接到Firebase,如果AdMob已经通过媒介运行

这是一个诱人的想法,但AdMob的收入已经通过媒介回调到达了。链接AdMob会将每个AdMob的浏览次数计算两次。

3. 在清单中设置隐私模式默认值

在清单中添加以下meta-data值(在你的CMP回答之前适用):google_analytics_default_allow_analytics_storage、..._ad_storage、..._ad_user_data、..._ad_personalization_signals。然后在UMP有答案后调用SetConsent。

4. 两个构建陷阱,耗费了我几个小时

  • 项目路径中的空格(“My Game/”)会导致Gradle repo URL失败,EDM4U写入的“Cannot convert URI to a file”。我手动在settingsTemplate.gradle中保留了存储库,使用new File(...).toURI(),并关闭了EDM4U对该文件的修补。
  • shrinkResources剥离了Crashlytics的build ID资源,,并且在发布构建中只会在启动时崩溃。使用res/raw/keep.xml中的tools:keep="@string/com_crashlytics_android_build_id"修复了它。

5. 在GA4中打开“开发者流量”过滤器

你的测试手机在调试模式下会污染数字。额外的奖励是链接Google Play到Firebase,APP内购买收入会显示在广告收入旁边,无需额外代码。很高兴回答问题。如果有人有更好的方式来处理多个应用的LTV,我很乐意听听。