向欧洲经济区用户披露

根据 Google《欧盟地区用户意见征求政策》,您必须向位于欧洲经济区 (EEA)、英国和瑞士境内的用户披露相关信息;在法律有相应要求的情况下,您必须征得他们的同意才能使用 Cookie 或其他本地存储方式;您还必须征得他们的同意才能使用其个人数据(例如 AdID)来投放广告。

此政策反映了《欧盟电子隐私指令》和《一般数据保护条例》(GDPR) 的要求。

本指南介绍了通过 UMP SDK 支持 GDPR IAB TCF v2 消息的操作步骤。本指南应与使用入门搭配使用,后者概述了如何在您的应用中运行 UMP SDK,还介绍了一些关于设置消息的基础知识。下述指南仅适用于 GDPR IAB TCF v2 消息。如需了解详情,请参阅 IAB 要求对欧盟地区用户意见征求消息的影响。

前提条件

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();

consentInformation = UserMessagingPlatform.getConsentInformation(this);
consentInformation.requestConsentInfoUpdate(
    this,
    params,
    (OnConsentInfoUpdateSuccessListener) () -> {
      // ...
    },
    (OnConsentInfoUpdateFailureListener) requestConsentError -> {
      // ...
    });

Kotlin

val params = ConsentRequestParameters
    .Builder()
    // Indicate the user is under age of consent.
    .setTagForUnderAgeOfConsent(true)
    .build()

consentInformation = UserMessagingPlatform.getConsentInformation(this)
consentInformation.requestConsentInfoUpdate(
    this,
    params,
    ConsentInformation.OnConsentInfoUpdateSuccessListener {
      // ...
    },
    ConsentInformation.OnConsentInfoUpdateFailureListener {
      requestConsentError ->
      // ...
    })

如需在 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 广告来源不向欧洲经济区 (EEA) 流量投放广告。

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 = purposeConsents.charAt(0).toString();
  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?.isEmpty() == false) {
  val purposeOneString = purposeConsents.first().toString()
  val hasConsentForPurposeOne = purposeOneString == "1"
}

常见问题解答

如果我未采取任何行动来满足在欧洲经济区 (EEA)、英国和瑞士投放广告时在意见征求管理平台方面须满足的要求,会怎么样?

自 2024 年 1 月 16 日起,如果合作伙伴未采用经 Google 认证的 CMP,则只有受限广告有资格在欧洲经济区 (EEA) 和英国投放。

我们将于 2024 年 1 月 16 日开始针对一小部分欧洲经济区 (EEA) 和英国的流量实施这项要求,并在 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) gdpr GDPR 是否适用于此广告请求。
TC 字符串 (IABTCF_TCString) gdpr_consent TC 字符串。IAB 提供了一个 Web 工具,您可以在其中手动解码该值。
AC 字符串 (IABTCF_AddtlConsent) addtl_consent Google 的“额外同意模式”技术规范中的 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,使您能够向已发布的 GDPR 消息添加广告合作伙伴,而无需了解合作伙伴是否已在 TCF 注册。使用第三方 CMP 时,您应执行以下操作:

  1. 确认第三方 CMP 支持存储 ACString。
  2. 将每个中介合作伙伴纳入第三方 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"
}