取得使用者訊息平台的同意聲明

必要條件

請參閱 互動廣告局規定對歐盟地區同意授權訊息的影響

引言

UMP SDK 可讓發布商申請個人化廣告同意聲明,並處理 Apple #應用程式追蹤透明度 (ATT) 規定。發布商可以使用 UMP SDK 顯示單一表單,以處理這兩項要求,或是同時處理這兩項要求,因為所有設定都會發生在 Ad Manager 隱私權與廣告相關訊息

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

為了協助發布商達成這項政策的責任,Google 提供 User Messaging Platform (UMP) SDK,取代原先的開放原始碼 Consent SDK。UMP SDK 已更新,現在可支援最新的 IAB 標準。此外,我們也簡化了同意聲明表單設定和列出廣告合作夥伴的程序。您現在可以在 Ad Manager 隱私權與廣告相關訊息

本指南將逐步說明如何安裝 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 的新手,請參閱他們的 官方說明文件,瞭解如何建立及使用 Podfile。

手動下載

下載 SDK

接著,將架構拖曳至您的 Xcode 專案,請務必選取 [Copy items of 視需要]

接著,您可以在您需要的任何檔案中加入架構:

Swift

import UserMessagingPlatform

Objective-C

#include <UserMessagingPlatform/UserMessagingPlatform.h>

更新 Info.plist

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

從 Ad Manager 的「行動應用程式」部分取得應用程式 ID:

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

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

應用程式追蹤透明度

如果您打算使用 UMP SDK 處理 Apple 的 App Tracking Transparency 規定,請務必使用 Ad Manager 隱私權與廣告相關訊息

為了讓 UMP SDK 顯示自訂快訊訊息,請更新 Info.plist,以便新增 NSUserTrackingUsageDescription 金鑰以及用來說明您使用方式的自訂訊息字串。

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

當您提供同意聲明表單時,使用情形說明會成為 ATT 對話方塊的一部分:

接下來,您必須連結 AppTrackingTransparency 架構:

進行測試時,由於 requestTrackingAuthorization: 是一次性要求,因此根據 Apple 的要求,廣告識別碼 ATT 對話方塊只會顯示一次。如要讓快訊再次顯示,您必須在測試裝置上解除安裝應用程式,然後再重新安裝。

使用 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.
                           }
                         }];

載入表單

最佳做法是每次使用者啟動應用程式時載入表單,即使您確定不需要同意聲明也不受影響。這樣一來,即使使用者想變更同意聲明設定,表單也能顯示。

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

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

如要檢查表單是否可用,請在 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 可讓您輕鬆測試應用程式的行為,就像在裝置的歐洲經濟區或英國境內使用 UMPDebugSettings 類型的 debugGeography 屬性 UMPDebugGeography 一樣。

您必須在應用程式的偵錯設定中提供測試裝置的雜湊 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。

不過,如果應用程式必須先徵得使用者同意,才能傳送這些事件,您就可以延後應用程式評估,直到明確初始化 Mobile Ads SDK 或載入廣告為止。

如要延後應用程式評估作業,請在應用程式的 Info.plist 中新增包含 YES 布林值的 GADDelayAppMeasurementInit 鍵。您可以透過程式輔助方式進行這項變更:

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

或者在資源清單編輯器中進行編輯:

調解

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

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

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

本節中的程式碼可與任何 Google Mobile Ads SDK 版本搭配使用。無論您是否使用 Consent SDK 收集同意聲明,也可以使用這個屬性。

Google Mobile Ads SDK 的預設行為是放送個人化廣告。 如果使用者同意只接收非個人化廣告,您可以設定 GAMRequest 物件,指定只應請求非個人化廣告。下列程式碼用於請求非個人化廣告,無論使用者是否位於歐洲經濟區都一樣:

Swift

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

Objective-C

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

如果請求非個人化廣告,廣告請求目前包含 &npa=1。不過請注意,這是 Google Mobile Ads SDK 的內部導入詳細資料,隨時可能變更。