درخواست رضایت از کاربران اروپایی

根据 Google 欧盟地区用户意见征求政策,您必须向位于欧洲经济区 (EEA) 的用户披露相关信息;在法律有相应要求的情况下,您必须征得他们的同意才能使用 Cookie 或其他本地存储方式;您同样必须征得他们的同意才能使用个人数据(如 AdID)来投放广告。此政策反映了欧盟《电子隐私指令》和《一般数据保护条例》(GDPR) 的要求。

为了帮助发布商履行此政策规定的职责,Google 提供了 Consent SDK。Consent SDK 是一个开源库,提供用于征求用户意见的实用函数。完整的源代码可在GitHub

Google 投放的广告可分为个性化广告和非个性化广告,投放这两类广告都需要在欧洲经济区 (EEA) 内征求用户同意。默认情况下,向 Google 发出的广告请求会投放个性化广告,并根据用户先前收集的数据来选择广告。Google 还支持配置广告请求来投放非个性化广告。 详细了解个性化广告和非个性化广告

本指南介绍了如何使用 Consent SDK 来征求用户同意。此外,还介绍了如何在征得用户同意后将用户意见转发给 Google 移动广告 SDK

前提条件

CocoaPods(首选)

将 SDK 导入 iOS 项目的最简单方法是使用 CocoaPods。打开项目的 Podfile 并将下面这行代码添加到应用的目标中:

pod 'PersonalizedAdConsent'

然后,从命令行运行:

pod install --repo-update

如果您不熟悉 CocoaPods,请参阅其官方文档,了解如何创建和使用 Podfile。

手动下载

您也可以直接下载或克隆 SDK 的源代码,然后按照以下说明将其添加到项目中:

  1. 在“访达”中,将 PersonalizedAdConsent.xcodeproj 文件拖动到项目中。

  2. 前往 Build Phases 标签页。在 Target Dependencies 下,点击 + 按钮,然后添加 PersonalizedAdConsent 目标。

  3. 右键点击您的项目,然后选择 Add Files to "MyProject"。转到 PersonalizedAdConsent.bundle。请务必选中创建文件夹引用

    添加完成后,您应该会在 Copy Bundle Resources 部分的 Build Phases 标签页中看到 PersonalizedAdConsent.bundle

在使用 Consent SDK 中的任何其他方法之前,您应更新意见征求状态,以确保 Consent SDK 拥有与您在AdMob 界面中选择的广告技术提供商有关的最新信息。如果广告技术提供商列表在用户上次同意后发生了变化,用户意见征求状态会重新设为未知状态。

如果您不使用中介

如果您不使用中介,则有两种方法可以实现 Consent SDK 来征求用户意见。

一种方法是使用 Consent SDK 向用户显示由 Google 呈现的用户意见征求表单。用户意见征求表单会显示您在 AdMob界面中选择的广告技术提供商列表。Consent SDK 会存储用户意见征求响应。

另一种方法是使用 Consent SDK 从 AdMob动态检索完整的广告技术提供商列表,如由发布商管理的用户意见征求中所述。不过,在这种情况下,您需要确定如何向用户呈现提供商列表,并向用户显示您自己的用户意见征求表单。

用户选择意见征求选项后,您可以按照存储由发布商管理的用户意见征求中的说明,请求 Consent SDK 存储用户的意见选项。

征得用户同意后,如果用户仅同意接收非个性化广告,您需要将用户意见转发给 Google 移动广告 SDK

如果您使用中介 AdMob

您可以使用 Consent SDK 从 AdMob动态检索完整的广告技术提供商列表,详情请参阅由发布商管理的用户意见征求。您需要确定需要向用户呈现其他广告联盟中的其他广告技术提供商。

作为应用开发者,您需要针对 Consent SDK 返回的广告技术提供商以及其他广告联盟的提供商征求用户同意。如果用户仅同意接收非个性化广告,那么您还需要手动存储用户的意见回复,并将用户意见转发给 Google 移动广告 SDK

Google 目前无法为中介广告联盟征求和处理用户意见,因此您需要为每个广告联盟单独征求和处理用户意见。如需了解实现详情,请参阅每个中介合作伙伴的集成指南

更新用户意见状态

使用 Consent SDK 时,建议您在每次应用启动时确定用户意见征求状态。为此,请在 PACConsentInformation 的实例上调用 requestConsentInfoUpdateForPublisherIdentifiers:completionHandler:

Swift

import PersonalizedAdConsent
...
class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
    PACConsentInformation.sharedInstance.
    requestConsentInfoUpdate(
    forPublisherIdentifiers: ["pub-0123456789012345"])
    {(_ error: Error?) -> Void in
      if let error = error {
        // Consent info update failed.
      } else {
        // Consent info update succeeded. The shared PACConsentInformation
        // instance has been updated.
      }
    }
  }

Objective-C

#import <PersonalizedAdConsent/PersonalizedAdConsent.h>
...
@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  [PACConsentInformation.sharedInstance
      requestConsentInfoUpdateForPublisherIdentifiers:@[ @"pub-0123456789012345" ]
          completionHandler:^(NSError *_Nullable error) {
            if (error) {
              // Consent info update failed.
            } else {
              // Consent info update succeeded. The shared PACConsentInformation
              // instance has been updated.
            }
          }];
}

调用 requestConsentInfoUpdateForPublisherIdentifiers:completionHandler: 需要两个参数:

  • 一组有效且完全激活的发布商 ID,供您的应用发出广告请求。 查找您的发布商 ID

  • 一个接受 NSError 作为输入参数的块,该块提供有关失败的用户意见征求更新请求的信息。

如果用户意见征求信息已成功更新,则 PACConsentInformation.sharedInstance.consentStatus 会提供更新后的用户意见征求状态。它可能具有下列值:

用户同意情况 定义
PACConsentStatusPersonalized 用户已同意投放个性化广告。
PACConsentStatusNonPersonalized 用户已同意投放非个性化广告。
PACConsentStatusUnknown 用户既未同意接收也未拒绝接收个性化广告或非个性化广告。

用户意见信息更新成功后,您还可以检查 PACConsentInformation.sharedInstance.requestLocationInEEAOrUnknown,以查看用户是否位于欧洲经济区内或者请求位置是否未知。

如果 requestLocationInEEAOrUnknown 属性为 NO,则表明用户不在欧洲经济区内,并且无需根据《欧盟地区用户意见征求政策》征求用户意见。您可以向 Google 移动广告 SDK 发出广告请求。

如果 requestLocationInEEAOrUnknown 属性为 YES

Google 的Consent SDK。提供了两种征求用户同意的方式:

请务必为用户提供更改或撤消同意的选项。

由 Google 呈现的用户意见征求表单是在应用内容之上显示的全屏可配置表单。您可以将表单配置为向用户显示以下选项的组合:

  • 同意观看个性化广告
  • 同意观看非个性化广告
  • 使用付费版应用,而不是观看广告

您应该仔细阅读同意文本:默认情况下,您会看到一条使用 Google 通过应用获利可能适合的消息,但我们无法针对适合您的用户意见征求文本提供法律建议。如需更新由 Google 呈现的用户意见征求表单的用户意见征求文本,请根据需要修改 Consent SDK 中包含的 consentform.html 文件。

使用 PACConsentForm 类配置和显示由 Google 呈现的用户意见征求表单。以下代码演示了如何使用所有三个表单选项来构建 PACConsentForm

Swift

// TODO: Replace with your app's privacy policy url.
guard let privacyUrl = URL(string: "https://www.your.com/privacyurl"),
  let form = PACConsentForm(applicationPrivacyPolicyURL: privacyUrl) else {
    print("incorrect privacy URL.")
    return
}
form.shouldOfferPersonalizedAds = true
form.shouldOfferNonPersonalizedAds = true
form.shouldOfferAdFree = true

Objective-C

// TODO: Replace with your app's privacy policy url.
NSURL *privacyURL = [NSURL URLWithString:@"https://www.your.com/privacyurl"];
PACConsentForm *form = [[PACConsentForm alloc] initWithApplicationPrivacyPolicyURL:privacyURL];
form.shouldOfferPersonalizedAds = YES;
form.shouldOfferNonPersonalizedAds = YES;
form.shouldOfferAdFree = YES;

下面更详细地介绍了 PACConsentForm 的属性:

shouldOfferPersonalizedAds
用于指明用户意见征求表单是否应显示个性化广告选项。 默认值为 YES
shouldOfferNonPersonalizedAds
用于指明用户意见征求表单是否应显示非个性化广告选项。 默认值为 YES
shouldOfferAdFree
表示用户意见征求表单是否应显示无广告应用选项。 默认值为 NO

创建并配置 PACConsentForm 对象后,请调用 PACConsentFormloadWithCompletionHandler: 方法加载用户意见征求表单,如下所示:

Swift

form.load {(_ error: Error?) -> Void in
  print("Load complete.")
  if let error = error {
    // Handle error.
    print("Error loading form: \(error.localizedDescription)")
  } else {
    // Load successful.
  }
}

Objective-C

[form loadWithCompletionHandler:^(NSError *_Nullable error) {
  NSLog(@"Load complete. Error: %@", error);
  if (error) {
    // Handle error.
  } else {
    // Load successful.
  }
}];

如需向用户显示由 Google 呈现的用户意见征求表单,请对加载的 PACConsentForm 调用 presentFromViewController:dismissCompletion:,如下所示:

Swift

form.present(from: self) { (error, userPrefersAdFree) in
      if let error = error {
        // Handle error.
      } else if userPrefersAdFree {
        // User prefers to use a paid version of the app.
      } else {
        // Check the user's consent choice.
        let status =
             PACConsentInformation.sharedInstance.consentStatus
      }
    }

Objective-C

 [form presentFromViewController:self
     dismissCompletion:^(NSError *_Nullable error, BOOL userPrefersAdFree) {
       if (error) {
         // Handle error.
       } else if (userPrefersAdFree) {
         // The user prefers to use a paid version of the app.
       } else {
         // Check the user's consent choice.
         PACConsentStatus status =
             PACConsentInformation.sharedInstance.consentStatus;
       }
     }];

调用 presentFromViewController:dismissCompletion: 需要两个参数:

  • 要呈现的 UIViewController

  • 接受 NSErrorBOOL 作为输入参数的块。如果显示用户意见征求表单时出现错误,则 NSError 会提供相关信息。当用户选择使用付费版本应用而不观看广告时,userPrefersAdFree BOOL 的值为 YES

在用户选择一个选项并关闭表单后,Consent SDK 会保存用户的选择并调用 dismissCompletion: 代码块。您可以读取用户的选择并将用户意见转发给 Google 移动广告 SDK

由发布商管理的用户意见征求

如果您选择自行征求用户意见,则可以使用 PACConsentInformation 类的 adProviders 属性来获取与您应用中使用的发布商 ID 相关联的广告技术提供商。请注意,凡是针对您的发布商 ID 配置的所有广告技术提供商,您均需为其征求用户意见。

在访问 PACConsentInformationadProviders 属性之前,您必须等待用户同意状态的成功更新(如更新用户意见状态部分所述)。

Swift

let adProviders = PACConsentInformation.sharedInstance.adProviders

Objective-C

NSArray *adProviders = PACConsentInformation.sharedInstance.adProviders;

然后,您可以使用广告提供商列表自行征求用户意见。

征得用户同意后,请使用 PACConsentInformation 类的 status 属性记录用户回复所对应的 PACConsentStatus

Swift

PACConsentInformation.sharedInstance.consentStatus = .personalized

Objective-C

PACConsentInformation.sharedInstance.consentStatus = PACConsentStatusPersonalized;

在向 Consent SDK 报告用户意见后,您可以将用户意见转发给 Google 移动广告 SDK

如需允许用户更新其意见,只需在用户选择更新用户意见征求状态时重复征求用户意见部分列出的步骤。

如果发布商知道用户未达到同意年龄,则所有广告请求都必须设置 TFUA(用于表示用户位于欧洲且未达到同意年龄的标记)。要在您的应用发出的所有广告请求中包含此标记, 将 tagForUnderAgeOfConsent 属性设置为 YES。此设置将在以后的所有广告请求中生效。

Swift

PACConsentInformation.sharedInstance.isTaggedForUnderAgeOfConsent = true

Objective-C

PACConsentInformation.sharedInstance.tagForUnderAgeOfConsent = YES;

启用 TFUA 设置后,系统将无法加载 Google 呈现的用户意见征求表单。所有包含 TFUA 的广告请求都将不符合投放个性化广告和再营销的条件。TFUA 会禁止向第三方广告技术提供商(例如广告衡量像素和第三方广告服务器)发送请求。

如需从广告请求中移除 TFUA, 将 tagForUnderAgeOfConsent 属性设置为 NO

测试

Consent SDK 的行为会有所不同,具体取决于 PACConsentInformation.sharedInstance.requestLocationInEEAOrUnknown。 例如,如果用户不在欧洲经济区 (EEA) 内,则无法加载用户意见征求表单。

为了让您在欧洲经济区 (EEA) 内外都可以更轻松地测试您的应用,Consent SDK 支持可在调用 Consent SDK 中的任何其他方法之前设置的调试选项。

  1. 获取设备的广告 ID。您可以使用以下代码来记录广告 ID:

    #import <AdSupport/AdSupport.h>
    // ...
    
    NSLog(@"Advertising ID: %@",
          ASIdentifierManager.sharedManager.advertisingIdentifier.UUIDString);

    然后检查控制台以获取结果:

    Advertising ID: 41E538F6-9C98-4EF2-B3EE-D7BD8CAF8339
  2. 使用控制台中的广告 ID 将您的设备指定为测试设备:

    PACConsentInformation.sharedInstance.debugIdentifiers =
        @[ @"41E538F6-9C98-4EF2-B3EE-D7BD8CAF8339" ];
  3. 最后,将 debugGeography 设置为您的首选地理测试位置。

    // Geography appears as in EEA for debug devices.
    PACConsentInformation.sharedInstance.debugGeography = PACDebugGeographyEEA;
    // Geography appears as not in EEA for debug devices.
    PACConsentInformation.sharedInstance.debugGeography = PACDebugGeographyNotEEA;

完成这些步骤后,对更新用户意见状态的调用会将您的调试地理位置考虑在内。

کد موجود در این بخش را می توان با هر نسخه از Google Mobile Ads SDK استفاده کرد. همچنین می‌تواند بدون توجه به اینکه آیا از Consent SDK برای جمع‌آوری رضایت استفاده کرده‌اید، استفاده شود.

رفتار پیش‌فرض Google Mobile Ads SDK ارائه تبلیغات شخصی‌شده است. اگر کاربر رضایت داده است که فقط تبلیغات غیرشخصی دریافت کند، می توانید یک شی GADRequest را پیکربندی کنید تا مشخص کنید که فقط تبلیغات غیرشخصی درخواست شود. کد زیر باعث می شود بدون توجه به اینکه کاربر در منطقه اقتصادی اروپا باشد یا نه، تبلیغات غیرشخصی درخواست شود:

سریع

let request = GADRequest()
let extras = GADExtras()
extras.additionalParameters = ["npa": "1"]
request.register(extras)

هدف-C

GADRequest *request = [GADRequest request];
GADExtras *extras = [[GADExtras alloc] init];
extras.additionalParameters = @{@"npa": @"1"};
[request registerAdNetworkExtras:extras];

اگر تبلیغات غیرشخصی درخواست شود، URL درخواست آگهی در حال حاضر شامل &npa=1 است. با این حال، توجه داشته باشید که این جزئیات پیاده‌سازی داخلی Google Mobile Ads SDK است و ممکن است تغییر کند.

延迟应用衡量(可选)

默认情况下,Google 移动广告 SDK 会初始化应用衡量并在应用启动时立即开始向 Google 发送用户级事件数据。 此初始化行为可确保您可以启用 AdMob 用户指标,而无需更改额外的代码。

但是,如果您的应用需要在征求用户意见后才能发送这些事件,则可以延迟应用衡量,直到显式初始化移动广告 SDK 或加载广告为止。

如需延迟应用衡量,请将布尔值为 YESGADDelayAppMeasurementInit 键添加到应用的 Info.plist。您可以通过编程方式进行此项更改:

<key>GADDelayAppMeasurementInit</key>
<true/>

您也可以在属性列表编辑器中进行修改:

常见问题解答

Consent SDK 支持多少家广告技术提供商?
Consent SDK 不限制发布商选择启用的广告技术提供商数量。
如果我在 AdMob 界面中更改我的选择,SDK 返回的广告技术提供商列表是否会自动更新?
可以,如果您对AdMob 界面中的广告技术提供商列表进行了更改,这些更改会在大约一小时内传播到 Google 的广告服务器。