根据 Google 《欧盟地区用户意见征求政策》,您必须向位于欧洲经济区 (EEA)、英国和瑞士境内的用户披露相关信息;在法律有相应要求的情况下,您必须征得他们的同意才能使用 Cookie 或其他本地存储方式;您还必须征得他们的同意才能使用其个人数据(例如 AdID)来投放广告。
此政策反映了《欧盟电子隐私指令》和《一般数据保护条例》(GDPR) 的要求。
本指南介绍了通过 UMP SDK 支持 GDPR IAB TCF v2 消息的操作步骤。本指南应与使用 入门搭配使用,后者概述了如何在您的应用中运行 UMP SDK,还介绍了一些关于设置消息的基础知识。以下指南专门针对 GDPR IAB TCF v2 消息。如需了解详情,请参阅 IAB 要求对欧盟地区用户意见征求消息有何影响。
前提条件
- 设置 UMP SDK。
- 为应用创建 欧洲法规消息。
用户撤消同意
GDPR 要求 用户能够随时撤消其同意选择 。请参阅 隐私设置选项 ,了解如何实现一种方式,让用户能够撤消其同意选择。
“未达到同意年龄”标记
如需指明用户是否未达到同意年龄,请设置
setTagForUnderAgeOfConsent (TFUA)。如果您将 TFUA 设置为
true,UMP SDK 将不会向用户征求同意。如果您的应用面向的是混合受众群体,请为儿童用户设置此参数,以确保系统不会向他们征求同意。
以下示例在 UMP 用户意见征求请求中将 TFUA 设置为 true:
Java
ConsentRequestParameters params =
new ConsentRequestParameters.Builder()
// Indicate the user is under age of consent.
.setTagForUnderAgeOfConsent(true)
.build();
Kotlin
val params =
ConsentRequestParameters.Builder()
// Indicate the user is under age of consent.
.setTagForUnderAgeOfConsent(true)
.build()
在 AdMob 中介中设置用户意见征求
如需在 AdMob 中介中设置用户意见征求,请完成以下部分中的步骤。
向 GDPR 消息添加广告合作伙伴
请按照 向已发布的 GDPR 消息添加广告合作伙伴 中所述的步骤,将您的中介合作伙伴添加到广告合作伙伴名单中。否则,合作伙伴可能无法在您的应用中投放广告。
下表列出了每个广告来源对应的广告技术合作伙伴名称:
| 广告来源 | 广告技术合作伙伴名称 |
|---|---|
| AppLovin | AppLovin Corp. |
| BidMachine | BidMachine |
| BIGO Ads SDK | Empathy Technology Pte.Ltd. (BIGO Ads) |
| Chartboost | Chartboost |
| DT Exchange | DT Exchange (Fyber Monetization) |
| i-mobile | i-mobile |
| InMobi | InMobi |
| ironSource Ads | ironSource Mobile |
| Liftoff Monetize | Liftoff |
| LY Ads Network | LY Ads Network |
| maio | maio |
| Meta Audience Network | Meta |
| Mintegral | Mobvista/Mintegral |
| Moloco Ads SDK | Moloco Ads |
| myTarget | Mail.ru |
| Pangle | Pangle DSP |
| PubMatic OpenWrap SDK | PubMatic |
| Unity Ads | Unity Ads |
| Verve HyBid SDK | Verve Group |
将用户意见征求转发给广告来源
下表显示了哪些广告来源支持将 GDPR 意见征求 信号从与 IAB 的透明度 和用户意见征求框架 (TCF) 以及 Google 的“额外同意模式”规范 集成的意见征求管理平台传递给广告来源的 SDK:
| 广告来源 | 支持的最低版本 |
|---|---|
| AppLovin | 12.0.0.0 |
| BidMachine | 3.3.0.0 |
| BIGO Ads SDK | 5.5.2.0 |
| Chartboost | 9.13.0.0 |
| DT Exchange | 8.3.0.0 |
| i-mobile | 不适用1 |
| InMobi | 10.7.5.0 |
| ironSource Ads | 7.7.0.0 |
| Liftoff Monetize | 7.4.1.0 |
| LY Ads Network | 不适用1 |
| maio | 不适用1 |
| Meta Audience Network | 不适用2 |
| Mintegral | 17.1.61.1 |
| Moloco Ads SDK | 3.5.0.0 |
| myTarget | 5.51.2.0 |
| Pangle | 7.9.0.9.0 |
| PubMatic OpenWrap SDK | 4.7.0.0 |
| Unity Ads | 4.19.0.1 |
| Verve HyBid SDK | 3.7.1.0 |
1 广告来源不投放欧洲经济区流量。
2 如需了解详情,请与您的 Meta 合作伙伴经理联系。
如何读取用户意见征求选择
收集 GDPR 用户意见征求后,您可以按照
TCF v2 规范从本地
存储空间读取用户意见征求选择。
IABTCF_PurposeConsents 键表示用户对每个
TCF 用途的同意情况。
以下代码段展示了如何检查用户对用途 1 的同意情况:
Java
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
// Example value: "1111111111"
String purposeConsents = sharedPref.getString("IABTCF_PurposeConsents", "");
// Purposes are zero-indexed. Index 0 contains information about Purpose 1.
if (!purposeConsents.isEmpty()) {
String purposeOneString = String.valueOf(purposeConsents.charAt(0));
boolean hasConsentForPurposeOne = purposeOneString.equals("1");
}
Kotlin
val sharedPref = PreferenceManager.getDefaultSharedPreferences(context)
// Example value: "1111111111"
val purposeConsents = sharedPref.getString("IABTCF_PurposeConsents", "")
// Purposes are zero-indexed. Index 0 contains information about Purpose 1.
if (!purposeConsents.isNullOrEmpty()) {
val purposeOneString = purposeConsents.first().toString()
val hasConsentForPurposeOne = purposeOneString == "1"
}
常见问题解答
- 如果我不采取任何措施来满足在欧洲经济区、英国和瑞士投放广告的 用户意见征求管理平台要求,会发生什么情况?
自 2024 年 1 月 16 日起,如果合作伙伴未采用经 Google 认证的 CMP, 只有 受限广告 有资格在欧洲经济区和英国投放。
自 2024 年 1 月 16 日起,Google 将开始针对一小部分欧洲经济区和英国流量执行此要求,并逐步扩大执行范围,直到 2024 年 2 月底针对所有欧洲经济区和英国流量执行此要求。请在 2024 年 1 月 16 日之前采用经认证的 CMP,以确保您的变现不受影响。
- 如何检查用户是否已同意?
用户意见征求并非由单个位表示,而是由一组用途和 供应商表示,具体由 IAB TCF 规范定义。如需了解 Google Ads 广告个性化的标准,请参阅 意见征求政策:个性化广告和非个性化广告 。
此外,如果 Google 广告技术提供商 (ATP) 列表中的广告技术未在 TCF 供应商列表中注册,则会使用 Google 的“额外同意模式”技术规范 来收集用户意见征求。Google 会在以下位置发布未向 IAB 注册的广告技术提供商列表及其 ID: https://storage.googleapis.com/tcfac/additional-consent-providers.csv。
如需调试单个广告请求,请使用广告检查器中的 “排查隐私设置问题” 功能,查看在 广告请求中传递的以下隐私信号(作为 发布商集成 IAB Europe TCF的一部分):
广告检查器标签 广告请求查询参数 含义 GDPR 适用情况 (IABTCF_gdprApplies) gdprGDPR 是否适用于此广告请求。 TC 字符串 (IABTCF_TCString) gdpr_consentTC 字符串。IAB 提供了一个 Web 工具,您可以在其中手动 解码该值。 AC 字符串 (IABTCF_AddtlConsent) addtl_consentGoogle 的“额外同意模式”技术规范中的 AC 字符串。 如需以编程方式读取用户意见征求选择,请参阅 如何读取用户意见征求选择 了解详情。
- 我是否需要使用 Google 的 UMP SDK 才能满足 CMP 要求?
不需要,您可以使用 经 Google 认证的 CMP 列表 中的任何 CMP 来投放广告。
- 即使用户已同意,我也可以使用 UMP SDK 再次显示用户意见征求表单吗?
如果用户已做出用户意见征求决定,Google 的用户意见征求管理解决方案将不会请求收集新的用户意见征求,除非 TC 字符串已过期或以其他方式失效。
GDPR 要求用户能够随时撤消其同意选择。请参阅 隐私设置选项,了解如何 实现一种方式,让用户能够撤消其同意选择。如需再次显示 同意书,请调用
showPrivacyOptionsForm()。- 我集成了经 Google 认证的 CMP,但即使是已同意的用户,我也看不到任何向中介合作伙伴发出的广告请求。为什么会出现这种情况?
根据 TCF,Google 会先确认广告技术提供商及其他程序化需求来源未违反 Google 政策,且至少拥有一条处理数据的法律依据,然后才会将其纳入中介广告瀑布流。 如需了解详情,请前往 中介 部分。
Google 广告技术提供商 (ATP) 列表 中的一些中介合作伙伴未在 TCF 供应商列表中注册。 这些合作伙伴会改用 Google 的“额外同意模式”技术规范 来收集用户意见征求。Google 会在以下位置发布未向 IAB 注册的广告技术提供商列表及其 ID: https://storage.googleapis.com/tcfac/additional-consent-providers.csv
UMP SDK 支持存储 ACString,让您 无需了解合作伙伴是否已注册 TCF,即可 向已发布的 GDPR 消息添加广告合作伙伴。使用第三方 CMP 时,您应执行以下操作:
- 确认第三方 CMP 支持存储 ACString。
- 将每个中介合作伙伴添加到第三方 CMP 用于收集用户意见征求的广告技术提供商列表中。
- 如果用户不同意,我可以更改应用的功能吗?政策是否允许这样做?
发布商可以在自己的应用中读取 IAB TCF 字符串。如需了解如何以编程方式读取用户意见征求选择,请参阅 如何读取用户意见征求选择 。发布商应与法律顾问一起审核相关法规规定的义务。
- 当我选择管理选项 并同意所有用途时,为什么看不到任何广告?为什么会出现这种情况?
除了收集用途同意之外,您还需要收集供应商同意。任何供应商(例如 Google)都必须同时获得用途同意和供应商同意,才能投放合适的广告。
- 如何为已同意版本 1 的用户实现 AC 字符串版本 2?
请按照 Google 的“额外同意模式”技术规格 检查本地存储空间中的
IABTCF_AddtlConsent键,以确定用户是否已同意 AC 字符串版本 2,以及您是否需要再次显示同意书。Java
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); // Example value: "2~1.35.41.101~dv.9.21.81" String additionalConsent = sharedPref.getString("IABTCF_AddtlConsent", ""); // Index 0 contains information about the specification version number. if (!additionalConsent.isEmpty()) { String specACVersion = additionalConsent.charAt(0); boolean isACVersion2 = purposeOneString.equals("2"); }Kotlin
val sharedPref = PreferenceManager.getDefaultSharedPreferences(context) // Example value: "2~1.35.41.101~dv.9.21.81" val additionalConsent = sharedPref.getString("IABTCF_AddtlConsent", "") // Index 0 contains information about the specification version number. if (!additionalConsent.isEmpty()) { val specACVersion = additionalConsent.first() val isACVersion2 = specACVersion == "2" }