獲得用戶消息平台的同意

必要條件

請參閱 IAB 規定對歐盟地區同意授權訊息的影響

引言

UMP SDK 提供工具,讓發布商能針對個人化廣告請求同意,以及處理 Apple 的應用程式追蹤透明度 (ATT) 規定。發布商可以使用 UMP SDK 顯示單一表單,以便處理這兩項要求,所有設定都發生在AdMob 隱私權與訊息訊息中。

根據 Google 的《歐盟地區使用者同意授權政策》規定,您必須向歐洲經濟區和英國境內的使用者揭露特定資訊;且依據法規要求,您在使用 Cookie 或其他本機儲存空間,並可使用個人資料 (例如 AdID) 放送廣告時,都需徵得使用者同意。本政策是配合《歐盟地區電子通訊隱私指令》和《一般資料保護規則》(GDPR) 而製定。

為支援發布商根據這項政策履行自身責任,Google 提供了 User Messaging Platform (UMP) SDK,取代之前的開放原始碼 Consent SDK。UMP SDK 已根據最新 IAB 標準進行更新。我們也簡化了設定表單和廣告合作夥伴設定流程的流程。所有設定現在都能在AdMob 隱私權與訊息中處理。

本指南將逐步引導您安裝 SDK、導入 IAB 解決方案及啟用測試功能。

匯入 SDK

CocoaPods (建議使用)

UMP SDK 包含在以 Google Mobile Ads SDK 7.64.0 開始的 Google Mobile Ads SDK Pod 內。

將 SDK 匯入 iOS 專案最簡單的方法是使用 CocoaPods。開啟專案的 Podfile,然後將這一行新增至應用程式的目標:

pod 'Google-Mobile-Ads-SDK'

接著,透過指令列執行:

pod install --repo-update

如果你是初次使用 CocoaPods,請參閱官方說明文件,瞭解如何建立及使用 Podfiles。

手動下載

下載 SDK

然後,將架構拖曳至您的 Xcode 專案,確認您已選取 [視需要複製項目]

然後透過以下方法,將架構加入所需的檔案:

Swift

import UserMessagingPlatform

Objective-C

#include <UserMessagingPlatform/UserMessagingPlatform.h>

更新您的 Info.plist

將應用程式 ID 新增至 Info.plist

按照說明中心的操作說明取得應用程式 ID。

在 Info.plist中加入應用程式 ID:

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

應用程式追蹤透明度

如果您打算使用 UMP SDK 處理 Apple 的 App Tracking Transparency 要求,請確認您是使用 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 的要求,「廣告識別碼 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.
                           }
                         }];

載入表單 (如果有的話)

建議您在每次使用者啟動應用程式時都載入表單,就算您並不需要取得使用者同意也沒問題。如此一來,就算使用者想變更同意聲明設定,表單也能順利顯示。

取得同意聲明的表單是在 AdMobUI 中建立。決定徵詢使用者同意後,下一步是決定表單是否可用。無法使用表單的原因有很多,例如:

  • 使用者已啟用廣告追蹤功能,
  • 您已經將使用者標示為未滿規定年齡。

如要檢查表單是否可用,請使用 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:不需要使用者同意。例如,使用者不在歐洲經濟區或英國境內。
  • 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 提供一個簡單的方法測試應用程式的行為,就像在歐洲經濟區或英國使用 UMPDebugSettingsUMPDebugGeography 類型 debugGeography 屬性一樣。

您必須在應用程式的偵錯設定中提供測試裝置的雜湊 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 判定裝置不在歐洲經濟區或英國境內,請使用 UMPDebugGeographyNotEEA。請注意,偵錯設定只適用於測試裝置。 根據預設,模擬器無須加入裝置 ID 清單。

使用 UMP SDK 測試應用程式時,建議您重設 SDK 的狀態,以便模擬使用者的首次安裝體驗。 SDK 提供 reset 方法,方便您完成這項作業。

Swift

UMPConsentInformation.sharedInstance.reset()

Objective-C

[UMPConsentInformation.sharedInstance reset];

如果您決定從專案中徹底移除 UMP SDK,則應呼叫重設。

延後應用程式評估 (選用)

根據預設,Google Mobile Ads SDK 會初始化應用程式評估作業,並在應用程式啟動時,立即將使用者層級事件資料傳送給 Google。 這項初始化行為可確保您能夠直接啟用 AdMob 使用者指標,無需另外修改程式碼。

不過,如果您的應用程式需要經過使用者同意才能傳送這些事件,您就能延後應用程式評估作業,直到您明確初始化 Mobile Ads SDK 或載入廣告為止。

如要延遲應用程式評估作業,請將具有布林值 YESGADDelayAppMeasurementInit 金鑰新增至應用程式的 Info.plist。您可以透過程式進行這項變更:

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

您也可以在屬性清單編輯器中加以編輯:

調解

如果您使用中介服務,就必須根據您選擇在應用程式中使用的同意聲明架構,以不同方式處理中介服務合作夥伴的同意聲明。Google 支援 IAB 同意聲明架構,但也提供了您專屬的自訂同意聲明解決方案。以下詳細說明如何在各個選項下處理中介服務。 進一步瞭解我們的同意聲明解決方案

UMP SDK 和 Mobile Ads SDK 都無法將同意聲明資訊轉寄給中介服務合作夥伴。而在使用 IAB 解決方案時,UMP SDK 會將同意聲明狀態資訊寫入本機儲存空間,而每個中介服務合作夥伴的 SDK 也負責讀取適當的金鑰。請務必與每個第三方聯播網聯絡,確認對方是否支援 IAB 解決方案。

使用自訂同意聲明解決方案時,您必須負責通知應用程式的第三方 SDK 同意聲明狀態。如需如何將同意聲明資訊傳送給相關的第三方,請參閱各中介服務合作夥伴的整合指南,瞭解導入詳情。

本節中的代碼可用於任何版本的 Google 移動廣告 SDK。無論您是否使用 Consent SDK 來收集同意,它也都可以使用。

Google 移動廣告 SDK 的默認行為是提供個性化廣告。如果用戶已同意僅接收非個性化廣告,您可以配置一個GADRequest對象來指定只應請求非個性化廣告。無論用戶是否在 EEA 中,以下代碼都會導致請求非個性化廣告:

迅速

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

Objective-C

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

如果請求非個性化廣告,則廣告請求 URL 當前包含&npa=1 。不過請注意,這是 Google 移動廣告 SDK 的內部實施細節,可能會發生變化。