獲得用戶消息平台的同意

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

必要條件

請參閱 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,請參閱其官方說明文件,瞭解如何建立及使用 Podfile。

手動下載

下載 SDK

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

然後,您可以在任何所需的檔案中將架構加入:

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 的 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 的要求,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.
                           }
                         }];

載入表單 (如果有的話)

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

取得同意聲明的表單是在 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 提供一個簡單的方式,可用來測試應用程式的行為,就像在裝置位於歐洲經濟區或英國一樣使用 UMPDebugSettings 類型的 UMPDebugGeography 屬性為 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。 這個初始化行為可確保您無須啟用其他程式碼,就能啟用 AdMob 使用者指標。

不過,如果應用程式必須先取得使用者同意才能傳送這些事件,您就可以延後應用程式評估作業,直到您明確初始化 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 的預設行為是放送個人化廣告。 如果使用者同意只接收非個人化廣告,您可以設定 GADRequest 物件,指定只應請求非個人化廣告。下列程式碼用於請求非個人化廣告,無論使用者是否位於歐洲經濟區都一樣:

Swift

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];

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