ユーザーメッセージングプラットフォームとの同意の取得

Prerequisites

IAB の要件が EU ユーザー向け同意メッセージに与える影響をご覧ください。

はじめに

UMP SDK には、パブリッシャーがパーソナライズド広告の同意をリクエストする方法や、Apple の App Tracking Transparency(ATT)要件に対応しているツールが用意されています。すべての設定はAdMob のプライバシーとメッセージで発生するため、パブリッシャーは UMP SDK を使用して 1 つのフォームを表示することで、これらのリクエストのいずれかまたは両方を処理できます。

Google の EU ユーザーの同意ポリシーに基づき、欧州経済領域(EEA)のユーザーには英国に加えて特定の開示を行い、法的に必要な場合は Cookie などのローカル ストレージを使用することと、広告配信に個人データ(AdID など)を使用することに同意する必要があります。このポリシーには、EU の e プライバシー指令と一般データ保護規則(GDPR)の要件が反映されています。

Google は、パブリッシャー様がこのポリシーで定められた義務を果たすために、これまでのオープンソースの Consent SDK に代わる、User Messaging Platform(UMP)SDK を提供しています。UMP SDK は、最新の IAB 標準をサポートするように更新されています。また、同意フォームの設定と広告パートナーのリスティング手続きも簡素化されました。これらの設定はすべて、AdMob の「プライバシーとメッセージ」で手軽に処理できるようになりました。

このガイドでは、SDK のインストール、IAB ソリューションの実装、テスト機能の有効化について説明します。

SDK をインポートする

CocoaPods(推奨)

UMP SDK は、Google Mobile Ads SDK 7.64.0 以降の Google Mobile Ads SDK Pod の依存関係として含まれています。

iOS プロジェクトに SDK を簡単にインポートするには、CocoaPods を使う方法がおすすめです。プロジェクトの Podfile を開き、アプリのターゲットに次の行を追加します。

pod 'Google-Mobile-Ads-SDK'

次に、コマンドラインから次のコマンドを実行します。

pod install --repo-update

CocoaPods を初めてご利用の場合は、CocoaPods の公式ドキュメントで Podfile の作成方法と使用方法をご確認ください。

手動ダウンロード

SDK をダウンロード

次に、そのフレームワークを Xcode プロジェクトにドラッグし、[Copy items if needed] が選択されていることを確認します。

その後、必要なファイルにフレームワークを含めることができます。

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 フレームワークをリンクする必要があります。

テスト中は、requestTrackingAuthorization: が 1 回限りのリクエストであるため、IDFA ATT ダイアログは 1 回だけ表示されます。アラートが再度表示されるようにするには、テストデバイスでアプリをアンインストールしてから再インストールする必要があります。

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 で作成されます。ユーザーに同意を求めると、次のステップは、フォームが利用可能かどうかを判断します。フォームを使用できない場合は、次のようなさまざまな理由が考えられます。

  • ユーザーは広告トラッキング制限を有効にしています。
  • 同意年齢に満たないユーザーとしてタグ付けしました。

フォームが利用可能かどうかを確認するには、UMPConsentInformationformStatus プロパティを使用します。これは UMPFormStatus 型の列挙型を返します。UMPFormStatus には次の 3 つの値があります。

  • 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 には次の 4 つの値があります。

  • 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 を使用すると、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 がデバイスを EEA または英国にないものとして扱うようにするには、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 Consent Framework をサポートしていますが、独自のカスタム同意ソリューションを利用することもできます。以下に、これらの各オプションによるメディエーションの処理方法の詳細を示します。 同意取得ソリューションの詳細

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

現在のところ、パーソナライズされていない広告をリクエストした場合、その広告リクエストの URL には &npa=1 が含まれます。ただし、この情報は Google Mobile Ads SDK に関する内部の実装情報であり、変更される可能性があります。