کسب رضایت با بستر پیام‌رسانی کاربر

前提条件

阅读 IAB 要求对欧盟地区用户意见征求消息有何影响

简介

UMP SDK 为发布商提供了一系列工具,以便发布商就个性化广告征求用户意见并处理 Apple 的应用跟踪透明度 (ATT) 要求。由于所有配置都发生在AdMob 的“隐私权和消息”中,因此发布商可以使用 UMP SDK,通过显示单个表单来处理这两个请求之一或同时处理这两个请求。

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

为了帮助发布商履行此政策规定的职责,Google 提供了 User Messaging Platform (UMP) SDK,该 SDK 取代了之前的开源 Consent SDK。UMP SDK 已更新,可支持最新的 IAB 标准。此外,我们还简化了设置用户意见征求表单和列出广告合作伙伴的流程。所有这些配置现在都可以方便地在AdMob 的“隐私权和消息”中进行处理。

本指南将向您介绍如何安装 SDK、实现 IAB 解决方案以及启用测试功能。

导入 SDK

CocoaPods(首选)

从 Google 移动广告 SDK 7.64.0 开始,UMP SDK 已作为 Google 移动广告 SDK Pod 的依赖项包含在内。

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

pod 'Google-Mobile-Ads-SDK'

然后,从命令行运行:

pod install --repo-update

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

手动下载

下载 SDK

然后,将框架拖动到您的 Xcode 项目中,确保选择 Copy items if necessary

然后,您可以使用以下任何文件包含框架:

Swift

import UserMessagingPlatform

Objective-C

#include <UserMessagingPlatform/UserMessagingPlatform.h>

更新您的 Info.plist

将应用 ID 添加到“ Info.plist”

按照帮助中心的说明获取应用 ID。

将应用 ID 添加到您的 Info.plist中:

<key>GADApplicationIdentifier</key>
<string>YOUR-APP-ID</string>

应用跟踪透明度

如果您打算使用 UMP SDK 处理 Apple 的应用跟踪透明度要求,请务必使用AdMob 的“隐私权和消息”页面创建、配置和发布 ATT 消息。

为了让 UMP SDK 显示自定义提醒消息,请更新 Info.plist 以添加 NSUserTrackingUsageDescription 键,并在其中添加描述使用情况的自定义消息字符串。

<key>NSUserTrackingUsageDescription</key>
<string>This identifier will be used to deliver personalized ads to you.</string>

当您呈现用户意见征求表单时,使用情况说明会作为 ATT 对话框的一部分显示:

接下来,您需要关联 AppTrackingTransparency 框架:

在测试时请注意,根据 Apple 的要求,IDFA ATT 对话框仅显示一次,因为 requestTrackingAuthorization: 是一次性请求。如需再次显示此提醒,您必须在测试设备上卸载并重新安装您的应用。

使用 SDK

SDK 以线性方式使用。使用 SDK 的步骤如下:

  1. 请求最新的用户意见征求信息。
  2. 检查是否需要征得用户同意。
  3. 检查表单是否可用,如果可用,则加载表单。
  4. 呈现表单。
  5. 为用户提供更改同意声明的方式。

建议您在每次应用启动时请求更新用户意见征求信息。这将决定您的用户是否需要提供同意声明。

只能从主线程调用此方法。

Swift

// Create a UMPRequestParameters object.
let parameters = UMPRequestParameters()
// Set tag for under age of consent. Here false means users are not under age.
parameters.tagForUnderAgeOfConsent = false

// Request an update to the consent information.
UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(
    with: parameters,
    completionHandler: { error in
      if error != nil {
        // Handle the error.
      } else {
        // The consent information state was updated.
        // You are now ready to check if a form is
        // available.
      }
    })

Objective-C

// Create a UMPRequestParameters object.
UMPRequestParameters *parameters = [[UMPRequestParameters alloc] init];
// Set tag for under age of consent. Here NO means users are not under age.
parameters.tagForUnderAgeOfConsent = NO;

// Request an update to the consent information.
[UMPConsentInformation.sharedInstance
    requestConsentInfoUpdateWithParameters:parameters
                         completionHandler:^(NSError *_Nullable error) {
                           if (error) {
                             // Handle the error.
                           } else {
                             // The consent information state was updated.
                             // You are now ready to check if a form is
                             // available.
                           }
                         }];

加载表单(如有)

最佳做法是每次用户启动您的应用时都加载表单,即使确定不需要征求用户同意,也可以让表单做好显示准备,以防用户想要更改用户意见征求设置。

用于征求用户同意的表单是在 AdMob界面中创建的。确定向用户征求意见后,下一步是确定表单是否可用。有很多原因会导致表单无法使用,例如:

  • 用户启用了广告限制跟踪。
  • 您已将用户标记为未达到同意年龄。

如需检查表单是否可用,请使用 UMPConsentInformation 中的 formStatus 属性,该属性会返回 UMPFormStatus 类型的枚举。UMPFormStatus 有三个可能的值:

  • UMPFormStatusUnknown:表单状态未知。在这种情况下,您应该调用 requestConsentInfoUpdateWithParameters:completionHandler:
  • UMPFormStatusAvailable:用户意见征求表单可用,并且可以加载。
  • UMPFormStatusUnavailable:意见征求表单不可用。

添加加载表单的封装容器方法,如下所示:

Swift

// Request an update to the consent information.
UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(
    withParameters: parameters,
    completionHandler: { [self] error in

      // The consent information has updated.
      if error != nil {
        // Handle the error.
      } else {
        // The consent information state was updated.
        // You are now ready to see if a form is available.
        let formStatus = UMPConsentInformation.sharedInstance.formStatus
        if formStatus == UMPFormStatus.available {
          loadForm()
        }
      }
    })
...
func loadForm() {

}

Objective-C

// Request an update to the consent information.
[UMPConsentInformation.sharedInstance
    requestConsentInfoUpdateWithParameters:parameters
                         completionHandler:^(NSError* _Nullable error) {

                           // The consent information has updated.
                           if (error) {
                             // Handle the error.
                           } else {
                             // The consent information state was updated.
                             // You are now ready to see if a form is available.
                             UMPFormStatus formStatus =
                                 UMPConsentInformation.sharedInstance
                                     .formStatus;
                             if (formStatus == UMPFormStatusAvailable) {
                               [self loadForm];
                             }
                           }
                         }];
...
- (void) loadForm {

}

如需加载表单,请对 UMPConsentForm 类使用静态 loadWithCompletionHandler: 方法。只能从主线程调用此方法。按如下方式更改 loadForm 方法:

Swift

func loadForm() {
  UMPConsentForm.load(
      withCompletionHandler: { form, loadError in
        if loadError != nil {
          // Handle the error
        } else {
          // Present the form
        }
      })
}

Objective-C

- (void)loadForm {
  [UMPConsentForm
      loadWithCompletionHandler:^(UMPConsentForm *form, NSError *loadError) {
        if (loadError) {
          // Handle the error
        } else {
          // Present the form
        }
      }];
}

根据需要呈现表单

如需呈现用户意见征求表单,请对 UMPConsentForm 类使用 presentFromViewController:completionHandler: 方法。在呈现表单之前,您必须确定是否需要用户同意。如需检查是否需要征得用户同意,请检查 UMPConsentInformation 对象的 consentStatus 属性,该属性会返回 UMPConsentStatus 类型的枚举。UMPConsentStatus 有四个可能的值:

  • UMPConsentStatusUnknown:意见征求状态未知。
  • UMPConsentStatusRequired:需要用户同意,但尚未获得。
  • UMPConsentStatusNotRequired:不需要用户同意。例如,用户不在欧洲经济区 (EEA) 或英国。
  • UMPConsentStatusObtained:已征得用户同意。未定义个性化设置。

按如下方式更改 loadForm 方法:

Swift

func loadForm() {
  UMPConsentForm.load(withCompletionHandler: { form, loadError in
    if loadError != nil {
      // Handle the error.
    } else {
      // Present the form. You can also hold on to the reference to present
      // later.
      if UMPConsentInformation.sharedInstance.consentStatus == UMPConsentStatus.required {
        form?.present(
            from: self,
            completionHandler: { dismissError in
              if UMPConsentInformation.sharedInstance.consentStatus == UMPConsentStatus.obtained {
                // App can start requesting ads.
              }

            })
      } else {
        // Keep the form available for changes to user consent.
      }
    }
  })
}

Objective-C

- (void)loadForm {
  [UMPConsentForm loadWithCompletionHandler:^(UMPConsentForm *form,
                                              NSError *loadError) {
    if (loadError) {
      // Handle the error.
    } else {
      // Present the form. You can also hold on to the reference to present
      // later.
      if (UMPConsentInformation.sharedInstance.consentStatus ==
          UMPConsentStatusRequired) {
        [form
            presentFromViewController:self
                    completionHandler:^(NSError *_Nullable dismissError) {
                      if (UMPConsentInformation.sharedInstance.consentStatus ==
                          UMPConsentStatusObtained) {
                        // App can start requesting ads.
                      }

                    }];
      } else {
        // Keep the form available for changes to user consent.
      }
    }
  }];
}

如果不需要征求用户同意,您可以保留对表单的引用,以便用户更改其同意状态。

测试

强制使用地理位置

UMP SDK 提供了一种简单的方法来测试您的应用的行为,就好像设备位于 EEA 或英国,使用的是 UMPDebugSettings 上类型为 UMPDebugGeographydebugGeography 属性。

您需要在应用的调试设置中提供测试设备的经过哈希处理的 ID,才能使用调试功能。如果您调用 requestConsentInfoUpdateWithParameters 而不设置此值,您的应用会在运行时记录所需的 ID 哈希。

Swift

let parameters = UMPRequestParameters()
let debugSettings = UMPDebugSettings()
debugSettings.testDeviceIdentifiers = ["TEST-DEVICE-HASHED-ID"]
debugSettings.geography = UMPDebugGeography.EEA
parameters.debugSettings = debugSettings
UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(
    with: parameters,
    completionHandler: { error in
      ...
    })

Objective-C

UMPRequestParameters *parameters = [[UMPRequestParameters alloc] init];
UMPDebugSettings *debugSettings = [[UMPDebugSettings alloc] init];
debugSettings.testDeviceIdentifiers = @[ @"TEST-DEVICE-HASHED-ID" ];
debugSettings.geography = UMPDebugGeographyEEA;
parameters.debugSettings = debugSettings;
[UMPConsentInformation.sharedInstance
    requestConsentInfoUpdateWithParameters:parameters
                         completionHandler:^(NSError *_Nullable error){
                           ...
}];

如需强制 SDK 将设备视为不在 EEA 或英国境内,请使用 UMPDebugGeographyNotEEA。请注意,调试设置仅适用于测试设备。模拟器无需添加到设备 ID 列表中,因为它们在默认情况下启用了测试。

使用 UMP SDK 测试应用时,重置 SDK 的状态可能会有所帮助,以便您模拟用户的首次安装体验。SDK 提供了 reset 方法来执行此操作。

Swift

UMPConsentInformation.sharedInstance.reset()

Objective-C

[UMPConsentInformation.sharedInstance reset];

如果您决定从项目中完全移除 UMP SDK,也应调用 reset。

延迟应用衡量(可选)

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

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

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

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

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

中介

如果您使用中介功能,则需要根据您选择在应用中使用的意见征求框架,为中介合作伙伴处理意见征求方式。Google 支持 IAB 用户意见征求框架,但也允许您拥有自己的自定义用户意见征求解决方案。下面将详细介绍如何在每个选项下处理中介。 详细了解我们的用户意见征求解决方案

UMP SDK 和移动广告 SDK 都不会将用户意见征求信息转发给中介合作伙伴。相反,使用 IAB 解决方案时,UMP SDK 会将用户意见征求状态信息写入本地存储空间,并且每个中介合作伙伴的 SDK 均负责读取相应的密钥。请务必咨询每个第三方广告联盟,以确定其是否支持 IAB 解决方案。

如果使用自定义用户意见征求解决方案,您有责任通知第三方 SDK 您的应用是否会征得用户同意。如需详细了解如何向相关第三方传递意见征求信息,请参阅每个中介合作伙伴的集成指南,了解实现详情。

کد موجود در این بخش را می توان با هر نسخه از 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 است و ممکن است تغییر کند.