欧盟用户广告隐私功能
支持于:Player Network SDK 1.21.03
为了保护用户的数据隐私并实现市场更公平的竞争,欧盟于2022年11月正式实施 Digital Markets Act(DMA)。为符合 DMA 规定,对于 DMA 所涵盖的欧盟用户,需将 Google 的 Consent Management Platform(CMP)接入于 Player Network SDK 中。
INTLConfig 中开启 CMP 的配置
以下为 INTLConfig.ini 中开启 CMP 的推荐配置,其中不建议改动 ANALYTICS_CONSENT_REQUIRED_TYPE 与 ANALYTICS_CONSENT_DEFAULT_CONFIG,如需修改请先联系 Google 商务确认相关权限的政策。
[Analytics]
ANALYTICS_CONSENT_ENABLE = 1
ANALYTICS_CONSENT_CHANNEL = Firebase,AppsFlyer,Adjust
ANALYTICS_CONSENT_REQUIRED_TYPE = ad_user_data,ad_personalization
ANALYTICS_CONSENT_DEFAULT_CONFIG = ad_storage:1,analytics_storage:1,ad_user_data:1,ad_personalization:1
ANALYTICS_CONSENT_ENABLE:Consent Mode 功能是否开启。1:开启 CMP,根据 IP 预判断玩家是否为欧盟用户,并设置 Google Consent Mode。IP 预判断的结果同时作为isDMA的初始值同步给 AppsFlyer 与 Adjust。0:关闭 CMP,将配置的 Google Consent Mode 权限默认设置为同意,此时游戏需处理相关逻辑,比如关闭隐私确认弹框功能。未通过SetConsent传入isDMA时,AppsFlyer 与 Adjust 会收到非 EEA 用户(isDMA = false)的状态。
ANALYTICS_CONSENT_CHANNEL:Consent Mode 功能生效的渠道,支持 Firebase、AppsFlyer、Adjust,多个渠道用英文逗号,分隔。- 渠道还需配置在
ANALYTICS_REPORT_CHANNEL中并初始化成功才会生效,渠道名称需与ANALYTICS_REPORT_CHANNEL中的一致。 - 未配置时默认为
Firebase,AppsFlyer,Adjust(Player Network SDK 1.33.00 起)。如果接入了 AppsFlyer 或 Adjust 但不需要同步用户同意情况,请显式配置该项并去掉对应渠道。
- 渠道还需配置在
ANALYTICS_CONSENT_REQUIRED_TYPE:Consent Mode 功能必须处理的权限类型,支持的权限类型包括:ad_storage:启用与广告相关的存储机制analytics_storage:启用与分析相关的存储机制,例如设备标识符存储ad_user_data:就在线广告目的发送用户数据征求用户意见ad_personalization:设置有关个性化广告的用户同意情况
ANALYTICS_CONSENT_DEFAULT_CONFIG:Consent Mode 功能开启时各个权限的默认配置,Player Network SDK 进行默认设置时读取的配置。1:用户同意权限类型0:用户拒绝权限类型
设置 Consent Mode
当开启欧盟用户广告隐私功能时:
- 每次启动游戏都需要调用
SetConsent接口。 - 如果
ANALYTICS_CONSENT_CHANNEL中包含 AppsFlyer 或 Adjust,EEA 用户需传入isDMA = true。isDMA默认为false,且每次调用都会覆盖 SDK 根据 IP 预判断的结果;未传入时,AppsFlyer 会将用户标记为不受 GDPR 约束,Adjust 会上报eea=0,用户拒绝授权的选择将无法传递给这两个渠道。
根据用户返回的信息,调用 Unity SDK 或 Unreal Engine SDK 的 SetConsent 接口来设置同意协议的情况。
- Unity
- Unreal Engine
// EEA 用户同意
INTLAPI.SetConsent(kConsentStatusGranted, "", "", true);
// EEA 用户拒绝
INTLAPI.SetConsent(kConsentStatusDenied, "", "", true);
// 非 EEA 用户
INTLAPI.SetConsent(kConsentStatusGranted, "", "", false);
// EEA 用户同意
UINTLSDKAPI::SetConsent(kConsentStatusGranted, "", "", true);
// EEA 用户拒绝
UINTLSDKAPI::SetConsent(kConsentStatusDenied, "", "", true);
// 非 EEA 用户
UINTLSDKAPI::SetConsent(kConsentStatusGranted, "", "", false);
各渠道上报字段
Player Network SDK 将权限类型与 isDMA 转换为各渠道对应的字段后上报:
| Player Network SDK | Firebase | AppsFlyer | Adjust(partner:google_dma) |
|---|---|---|---|
isDMA | 不使用 | isUserSubjectToGDPR | eea |
ad_user_data | ad_user_data | hasConsentForDataUsage | ad_user_data |
ad_personalization | ad_personalization | hasConsentForAdsPersonalization | ad_personalization |
ad_storage | ad_storage | hasConsentForAdStorage | 不使用 |
analytics_storage | analytics_storage | 不使用 | 不使用 |
- AppsFlyer:
isDMA为false时,按 AppsFlyer 的要求只上报isUserSubjectToGDPR = false,其余字段不上报。isDMA为true时,未纳入 consent 配置的权限类型(如默认配置下的ad_storage)按同意上报。 - Adjust:通过 third party sharing 的 granular option 上报,
1表示是/同意,0表示否/拒绝。eea每次都会上报,ad_user_data与ad_personalization仅在纳入 consent 配置时上报。
流程逻辑图

- 虚线框内逻辑游戏需要处理。
- 读取默认配置进行设置:读取
ANALYTICS_CONSENT_DEFAULT_CONFIG中配置的默认值,在启动游戏时进行设置。 - Set(Granted)/Set(Denied):调用 Unity SDK 或 Unreal Engine SDK 的
SetConsent接口来更新用户同意情况- Set(Granted):传入参数
kConsentStatusGranted,为同意 - Set(Denied):传入参数
kConsentStatusDenied,为拒绝 - 如需同步至 AppsFlyer 或 Adjust,需同时传入
isDMA
- Set(Granted):传入参数
验证 Consent Mode
Consent Mode 功能可通过日志进行验证:
-
在 INTLConfig.ini 中设置
LOG_LEVEL = 1(信息)或LOG_LEVEL = 0(调试)。 -
在日志中搜索关键字,以最后一条为准,查看是否符合配置的
ANALYTICS_CONSENT_REQUIRED_TYPE:-
Android 平台关键字与示例:
FirebaseAnalytics setConsent:FirebaseAnalytics setConsent: consentMap = {AD_USER_DATA=GRANTED, AD_PERSONALIZATION=GRANTED} -
iOS 平台关键字与示例:
Firebase: set consent:Firebase: set consent: {
"ad_personalization" = granted;
"ad_user_data" = granted;} -
AppsFlyer 关键字:Android 平台为
AppsFlyerAnalytics setConsent:,iOS 平台为AppsFlyer: setConsent:。以 Android 平台为例:AppsFlyerAnalytics setConsent: isUserSubjectToGDPR=true, dataUsage=granted, adsPersonalization=granted, adStorage=granted -
Adjust 关键字:Android 平台为
AdjustAnalytics setConsent:,iOS 平台为Adjust: setConsent:。以 Android 平台为例:AdjustAnalytics setConsent: eea=1, ad_user_data=granted, ad_personalization=granted
-
-
对于 EEA 用户,AppsFlyer 日志中应为
isUserSubjectToGDPR=true,Adjust 日志中应为eea=1。也可以搜索关键字consent_result_json查看 SDK 下发给各渠道的内容,其中is_dma即当前生效的isDMA:[Analytics SetConsent] consent_result_json = {"is_dma":"true","ad_user_data":"granted","ad_personalization":"granted"}
修改 CMP 默认配置
不建议改动 ANALYTICS_CONSENT_DEFAULT_CONFIG 配置,如需修改请先联系 Google 商务确认相关权限的政策。
本节配置仅适用于 Firebase。
Player Network SDK 初始化未完成时,Firebase 会读取 XML(Android)/Plist(iOS) 文件中的配置以设置 CMP。应确保 XML/Plist 中对应权限配置与 ANALYTICS_CONSENT_DEFAULT_CONFIG 中一致。
Android 平台配置
- Unity
- Unreal Engine
<meta-data android:name="google_analytics_default_allow_analytics_storage" android:value="true" />
<meta-data android:name="google_analytics_default_allow_ad_storage" android:value="true" />
<meta-data android:name="google_analytics_default_allow_ad_user_data" android:value="true" />
<meta-data android:name="google_analytics_default_allow_ad_personalization_signals" android:value="true" />
由于上述配置存在于 INTLFirebase.aar 而无法直接修改,需在 Unity 引擎项目里的 AndroidManifest.xml 文件中使用 tools:replace 替换权限对应的 android:value,以拒绝 ad_storage 权限为例:
<meta-data android:name="google_analytics_default_allow_ad_storage" android:value="false" tools:replace="android:value"/>
<meta-data android:name="google_analytics_default_allow_analytics_storage" android:value="true" />
<meta-data android:name="google_analytics_default_allow_ad_storage" android:value="true" />
<meta-data android:name="google_analytics_default_allow_ad_user_data" android:value="true" />
<meta-data android:name="google_analytics_default_allow_ad_personalization_signals" android:value="true" />
由于上述配置存在于 INTLFirebase.aar 而无法直接修改,需在 Unreal Engine 项目里的 INTLFirebase_APL.xml 文件中 root 节点下添加 addElements 标签,使用 tools:replace 替换权限对应的 android:value,以拒绝 ad_storage 权限为例:
<addElements tag="application">
<meta-data android:name="google_analytics_default_allow_ad_storage" android:value="false" tools:replace="android:value"/>
</addElements>
iOS 平台配置
- Unity
- Unreal Engine
"GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE":true,
"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE":true,
"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA":true,
"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS":true,
在 INTLFirebaseKit.projmods 文件中,找到 Info.plist 节点,修改对应权限,以拒绝 ad_storage 权限为例:
"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE":false,
<key>GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE</key>
<true/>
<key>GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE</key>
<true/>
<key>GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA</key>
<true/>
<key>GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS</key>
<true/>
在 INTLFirebase_UPL.xml 文件中,修改对应权限,以拒绝 ad_storage 权限为例:
<key>GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE</key>
<false/>