GDPR IAB 支持

根据 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 ->
      // ...
    })

中介

请按照向已发布的 GDPR 消息添加广告合作伙伴中的步骤,将您的中介合作伙伴添加到广告合作伙伴名单中。否则,可能会导致合作伙伴无法在您的应用中投放广告。

中介合作伙伴可能还有其他一些工具可帮助您遵守 GDPR。如需了解详情,请参阅具体合作伙伴的集成指南

收集 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);
  boolean hasConsentForPurposeOne = purposeOneString.equals("1");
}

Kotlin

val sharedPref = PreferenceManager.getDefaultSharedPreferences(context)
// Example value: "1111111111"
val purposesConsents = sharedPref.getString("IABTCF_PurposeConsents", "")
// Purposes are zero-indexed. Index 0 contains information about Purpose 1.
if (!purposeConsents.isEmpty()) {
  val purposeOneString = purposeConsents.first()
  val hasConsentForPurposeOne = purposeOneString == "1"
}

常见问题解答

如果我未采取任何措施来满足针对在欧洲经济区 (EEA) 和英国投放广告的意见征求管理平台要求,会怎么样?

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

我们将于 2024 年 1 月 16 日开始针对一小部分欧洲经济区 (EEA) 和英国的流量实施这项要求,然后逐步扩大范围,最终在 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

如需调试单个广告请求,请使用广告检查器中的高级广告单元调试功能导出广告请求字符串。然后,查找以下查询参数:

查询参数 含义
gdpr GDPR 是否适用于此广告请求。
gdpr_consent TC 字符串。IAB 提供了一个 Web 工具,您可以在其中手动解码该值。
addtl_consent Google 的“额外同意模式”技术规范中的 AC 字符串。

如需程序化地读取用户的意见征求选项,请参阅如何读取用户的意见征求选项,了解详情。

我是否需要使用 Google 的 UMP SDK 才能满足 CMP 要求?

不需要,您可以使用经 Google 认证的 CMP 名单中的任何 CMP 来投放广告。

即使用户已同意,如何使用 UMP SDK 再次显示意见征求表单?

如果用户已做出意见征求决定,则在 TC 字符串到期或以其他方式失效之前,Google 的意见征求管理解决方案不会请求收集新的意见征求。

根据 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 时,您应执行以下操作:

  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"
}