EU ユーザーからの同意の取得

Google の EU ユーザーの同意ポリシーでは、欧州経済領域(EEA)のユーザーに対して、特定の情報を開示し、Cookie などのローカル ストレージの使用に対するユーザーの同意(法律で義務付けられている場合)を得ること、また広告配信を目的とした個人データ(AdID など)の使用に対するユーザーの同意を得ることを定めています。本ポリシーには、EU の e プライバシー指令と一般データ保護規則(GDPR)の要件が反映されています。

Google は、パブリッシャーがこのポリシーで定められた義務を遂行できるようサポートするため、Consent SDK を提供しています。この SDK はオープンソース ライブラリで、ユーザーから同意を取得するためのユーティリティ関数が含まれています。完全なソースコードは、GitHub で入手できます。

Google が配信する広告は「パーソナライズド広告」と「パーソナライズされていない広告」に分類されますが、欧州経済領域ではどちらの広告を配信するにもユーザーからの同意が必要になります。Google への広告リクエストに対してはデフォルトでパーソナライズド広告が配信され、対象ユーザーから以前に取得したデータに基づいて広告が選ばれます。パーソナライズされていない広告を配信するよう広告リクエストも設定することもできます。 パーソナライズド広告とパーソナライズされていない広告についての詳細

このガイドでは、Consent SDK を使ってユーザーから同意を取得する方法を説明します。また、取得した同意を Google Mobile Ads SDK に転送する方法についても解説します。

前提条件

CocoaPods(推奨)

CocoaPods を使えば、iOS プロジェクトに SDK を簡単にインポートすることができます。プロジェクトの Podfile を開き、アプリのターゲットに次の行を追加します。

pod 'PersonalizedAdConsent'

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

pod install --repo-update

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

手動ダウンロード

SDK のソースを直接ダウンロードまたは複製する方法もあります。その場合は、次の手順で SDK をプロジェクトに組み込んでください。

  1. ファインダーから、PersonalizedAdConsent.xcodeproj ファイルをドラッグしてプロジェクトに追加します。

  2. [Build Phases] タブに移動し、[Target Dependencies] で [+] ボタンをクリックし、[PersonalizedAdConsent] ターゲットを追加します。

  3. 対象プロジェクトを右クリックし、[Add Files to "MyProject"] を選択します。PersonalizedAdConsent.bundle に移動します。[Create folder references] をオンにします。

    この作業が完了すると、[Copy Bundle Resources] セクションの [Build Phases] タブに PersonalizedAdConsent.bundle が表示されます。

Consent SDK の他のメソッドを使用するにあたっては、必ず事前に同意ステータスを更新し、AdMob の管理画面でお客様が指定した広告技術プロバイダに関する最新情報が Consent SDK に反映されるようにしてください。対象ユーザーが前回同意してから広告技術プロバイダのリストが変わっている場合、同意ステータスは不明ステータスに戻ります。

メディエーションをご利用でない場合

メディエーションをご利用でない場合、Consent SDK を実装して同意を取得するには 2 つの方法があります。

ひとつは Consent SDK を使用して、Google 提供の同意フォームをユーザーに提示する方法です。この同意フォームには、AdMob 管理画面でお客様が指定した広告技術プロバイダのリストが表示されます。また、同意に関するユーザーからの回答が Consent SDK によって保存されます。

もうひとつは、Consent SDK を使用して、広告技術プロバイダの全リストを AdMob から動的に取得する方法です(詳しくは、パブリッシャー管理の同意の保存をご参照ください)。ただし、この方法を使う場合は、ユーザーにプロバイダのリストを示す方法をお客様がご自身で決定し、ご自身の同意フォームをユーザーに提示する必要があります。

対象ユーザーが同意の回答を選んだら、その同意回答を保存するよう Consent SDK に指示できます(詳しくは、パブリッシャー管理の同意の保存に関する説明をご確認ください)。

なお、同意の取得に際して、パーソナライズされていない広告の配信に限ってユーザーが同意した場合には、その同意を Google Mobile Ads SDK に転送する必要があります。

AdMob メディエーションを使用している場合

Consent SDK を使用して、広告技術プロバイダの全リストを AdMob から動的に取得できます(詳しくは、パブリッシャー管理の同意の保存をご参照ください)。ただし、他の広告ネットワークで使用する追加の広告技術プロバイダについては、同意の取得に向けてユーザーに提示すべきものをご自身で判断する必要があります。

お客様はアプリ デベロッパーとして、Consent SDK から返される広告技術プロバイダと他の広告ネットワークのプロバイダの両方について、ユーザーの同意を取得する必要があります。また、パーソナライズされていない広告の配信に限ってユーザーが同意した場合は、同意に関するユーザーからの回答をご自身で保存して Google Mobile Ads SDK に転送することも必要になります。

Google では現在のところ、メディエーション ネットワークに関する同意は取得することも処理することもできません。そのため、それぞれの広告ネットワークについて、お客様がご自身で個別に同意を取得、処理していただく必要があります。 現在 Google では、オープンソースおよびバージョン対応のすべてのメディエーション ネットワークと積極的に連携し、同意の転送方法に関する詳しい情報を記載したドキュメントの提供を進めています。次のメディエーション ネットワークについては、すでにドキュメントが公開されています。

同意ステータスの更新

Consent SDK を使う場合は、アプリを起動するたびにユーザーの同意ステータスを把握することをおすすめします。これを行うには、PACConsentInformation インスタンスで requestConsentInfoUpdateForPublisherIdentifiers:completionHandler: を呼び出します。

Swift

import PersonalizedAdConsent
...
class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
    PACConsentInformation.sharedInstance.
    requestConsentInfoUpdate(
    forPublisherIdentifiers: ["pub-0123456789012345"])
    {(_ error: Error?) -> Void in
      if let error = error {
        // Consent info update failed.
      } else {
        // Consent info update succeeded. The shared PACConsentInformation
        // instance has been updated.
      }
    }
  }

Objective-C

#import <PersonalizedAdConsent/PersonalizedAdConsent.h>
...
@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  [PACConsentInformation.sharedInstance
      requestConsentInfoUpdateForPublisherIdentifiers:@[ @"pub-0123456789012345" ]
          completionHandler:^(NSError *_Nullable error) {
            if (error) {
              // Consent info update failed.
            } else {
              // Consent info update succeeded. The shared PACConsentInformation
              // instance has been updated.
            }
          }];
}

requestConsentInfoUpdateForPublisherIdentifiers:completionHandler: を呼び出すには、次の 2 つの引数が必要です。

  • アプリの広告リクエストの送信元となる、完全に有効なパブリッシャー ID の配列。 パブリッシャー ID を確認してください

  • 入力パラメータとして NSError(同意の更新リクエストのエラー情報)を受け取るブロック。

同意情報が正常に更新されると、PACConsentInformation.sharedInstance.consentStatus に最新の同意ステータスが含まれます。その値は、以下のいずれかになる可能性があります。

同意ステータス 定義
PACConsentStatusPersonalized 対象ユーザーは、パーソナライズド広告の表示に同意しています。
PACConsentStatusNonPersonalized 対象ユーザーは、パーソナライズされていない広告の表示に同意しています。
PACConsentStatusUnknown 対象ユーザーは、パーソナライズド広告やパーソナライズされていない広告の表示について、同意も拒否もしていません。

同意情報が正常に更新されると、PACConsentInformation.sharedInstance.requestLocationInEEAOrUnknown をチェックすることによって、対象ユーザーが欧州経済領域にいるか、またはリクエスト元の地域が不明かどうかを確認できます。

requestLocationInEEAOrUnknown プロパティが NO だった場合は、対象ユーザーが欧州経済領域にいないため、EU ユーザーの同意ポリシーに基づく同意の取得は不要となり、Google Mobile Ads SDK に対して広告リクエストを行えます。

requestLocationInEEAOrUnknown プロパティが YES の場合:

  • PACConsentStatus の値が PACConsentStatusPersonalized または PACConsentStatusNonPersonalized だった場合は、対象ユーザーがすでに同意済みであるため、Google Mobile Ads SDK に同意を転送できます

  • 対象ユーザーの同意ステータスが PACConsentStatusUnknown だった場合は、同意の取得に関する後述の説明で、同意を取得するためのユーティリティ メソッドの使用方法をご確認ください。

Google の Consent SDK。 には、ユーザーからの同意を取得する 2 つの方法があります。

なお、同意を変更または撤回する選択肢を必ずユーザーに提供するようにしてください。

Google 提供の同意フォームは全画面表示可能なフォームで、アプリ コンテンツの上に重ねて表示されます。このフォームは、次のオプションを組み合わせて対象ユーザーに提示するよう設定できます。

  • パーソナライズド広告の表示に同意する
  • パーソナライズされていない広告の表示に同意する
  • アプリの有料版(広告表示なし)を使用する

同意テキストは内容をよくご確認ください。デフォルトで表示されるメッセージは、アプリの収益化に Google を利用している場合には適切だと考えられますが、それがお客様に適しているかどうかについて、Google が法的なアドバイスを提供することはできません。Google 提供の同意フォームの同意テキストを更新するには、Consent SDK に含まれている consentform.html ファイルを必要に応じて変更してください。

Google 提供の同意フォームは、PACConsentForm クラスを使用して設定および表示されます。次のコードは、3 つのフォーム オプションすべてを含む PACConsentForm の作成方法を示しています。

Swift

// TODO: Replace with your app's privacy policy url.
guard let privacyUrl = URL(string: "https://www.your.com/privacyurl"),
  let form = PACConsentForm(applicationPrivacyPolicyURL: privacyUrl) else {
    print("incorrect privacy URL.")
    return
}
form.shouldOfferPersonalizedAds = true
form.shouldOfferNonPersonalizedAds = true
form.shouldOfferAdFree = true

Objective-C

// TODO: Replace with your app's privacy policy url.
NSURL *privacyURL = [NSURL URLWithString:@"https://www.your.com/privacyurl"];
PACConsentForm *form = [[PACConsentForm alloc] initWithApplicationPrivacyPolicyURL:privacyURL];
form.shouldOfferPersonalizedAds = YES;
form.shouldOfferNonPersonalizedAds = YES;
form.shouldOfferAdFree = YES;

PACConsentForm のプロパティについて、以下でさらに詳しく説明します。

shouldOfferPersonalizedAds
パーソナライズド広告のオプションを同意フォームに表示するかどうかを示します。 デフォルトは YES です。
shouldOfferNonPersonalizedAds
パーソナライズされていない広告のオプションを同意フォームに表示するかどうかを示します。デフォルトは YES です。
shouldOfferAdFree
広告表示のないアプリのオプションを同意フォームに表示するかどうかを示します。デフォルトは NO です。

PACConsentForm オブジェクトを作成および設定したら、PACConsentFormloadWithCompletionHandler: メソッドを呼び出すことで同意フォームを読み込みます。次の例をご参照ください。

Swift

form.load {(_ error: Error?) -> Void in
  print("Load complete.")
  if let error = error {
    // Handle error.
    print("Error loading form: \(error.localizedDescription)")
  } else {
    // Load successful.
  }
}

Objective-C

[form loadWithCompletionHandler:^(NSError *_Nullable error) {
  NSLog(@"Load complete. Error: %@", error);
  if (error) {
    // Handle error.
  } else {
    // Load successful.
  }
}];

対象ユーザーに Google 提供の同意フォームを提示するには、読み込まれた PACConsentFormpresentFromViewController:dismissCompletion: を呼び出します。次の例をご参照ください。

Swift

form.present(from: self) { (error, userPrefersAdFree) in
      if let error = error {
        // Handle error.
      } else if userPrefersAdFree {
        // User prefers to use a paid version of the app.
      } else {
        // Check the user's consent choice.
        let status =
             PACConsentInformation.sharedInstance.consentStatus
      }
    }

Objective-C

 [form presentFromViewController:self
     dismissCompletion:^(NSError *_Nullable error, BOOL userPrefersAdFree) {
       if (error) {
         // Handle error.
       } else if (userPrefersAdFree) {
         // The user prefers to use a paid version of the app.
       } else {
         // Check the user's consent choice.
         PACConsentStatus status =
             PACConsentInformation.sharedInstance.consentStatus;
       }
     }];

presentFromViewController:dismissCompletion: を呼び出すには、次の 2 つの引数が必要です。

  • フォームを提示するための UIViewController

  • 入力パラメータとして NSErrorBOOL を受け取るブロック。NSError には、同意フォームの表示中にエラーが発生した場合に、その情報が含まれます。userPrefersAdFree BOOL の値は、対象ユーザーが広告表示のない有料版アプリの使用を選んだ場合に YES になります。

対象ユーザーがオプションを選んでフォームを閉じると、Consent SDK はそのユーザーの選択を保存し、dismissCompletion: ブロックを呼び出します。お客様は対象ユーザーの選択を読み取って、Google Mobile Ads SDK に同意を転送できます。

パブリッシャー管理の同意の保存

ご自身で同意を取得する場合は、PACConsentInformation クラスの adProviders プロパティを使うと、アプリ内で使われたパブリッシャー ID に関連する広告技術プロバイダの情報を取得できます。なお、ユーザーの同意は、お客様のパブリッシャー ID で設定されたすべての広告技術プロバイダについて必要です。

PACConsentInformationadProviders プロパティには、ユーザーの同意ステータスが更新されるまで待ってからアクセスしてください(詳しくは、同意ステータスの更新をご参照ください)。

Swift

let adProviders = PACConsentInformation.sharedInstance.adProviders

Objective-C

NSArray *adProviders = PACConsentInformation.sharedInstance.adProviders;

その後、広告技術プロバイダのリストを使用して、ご自身で同意を取得できます。

同意を取得できたら、PACConsentInformation クラスの status プロパティを使って、対象ユーザーの回答に対応する PACConsentStatus を記録します。

Swift

PACConsentInformation.sharedInstance.consentStatus = .personalized

Objective-C

PACConsentInformation.sharedInstance.consentStatus = PACConsentStatusPersonalized;

Consent SDK に同意をレポートすると、Google Mobile Ads SDK に同意を転送できるようになります。

ユーザーが同意を更新できるようにするため、ユーザーが同意ステータスの更新を選んだ場合には、同意取得の手順を繰り返してください。

対象ユーザーが同意年齢に満たないことをパブリッシャーが認識した場合は、すべての広告リクエストに TFUA(Tag For Users under the Age of Consent in Europe: 同意年齢に満たない欧州ユーザーに対するタグ)を設定してください。アプリからのすべての広告リクエストにこのタグを含めるには、tagForUnderAgeOfConsent プロパティを YES に設定します。この設定は、その後のすべての広告リクエストで有効になります。

Swift

PACConsentInformation.sharedInstance.isTaggedForUnderAgeOfConsent = true

Objective-C

PACConsentInformation.sharedInstance.tagForUnderAgeOfConsent = YES;

TFUA 設定が有効になると、Google 提供の同意フォームが読み込まれなくなります。TFUA を含むすべての広告リクエストがパーソナライズド広告とリマーケティングの対象から外れます。TFUA によって、第三者広告技術プロバイダ(広告測定ピクセル事業者や第三者広告サーバーなど)へのリクエストも無効になります。

広告リクエストから TFUA を削除するには、tagForUnderAgeOfConsent プロパティを NO に設定します。

テスト

Consent SDK は、PACConsentInformation.sharedInstance.requestLocationInEEAOrUnknown の値に応じて動作が異なります。 たとえば、対象ユーザーが欧州経済領域にいない場合は、同意フォームを読み込めません。

欧州経済領域の内外の両方でアプリを簡単にテストできるよう、Consent SDK にはデバッグ オプションが用意されており、Consent SDK の他のメソッドを呼び出す前に設定することができます。

  1. ご利用デバイスの広告 ID を取得します。広告 ID は次のコードで記録できます。

    #import <AdSupport/AdSupport.h>
    // ...
    
    NSLog(@"Advertising ID: %@",
          ASIdentifierManager.sharedManager.advertisingIdentifier.UUIDString);

    次に、コンソールに表示される次のような行で広告 ID を確認します。

    Advertising ID: 41E538F6-9C98-4EF2-B3EE-D7BD8CAF8339
  2. コンソールに表示された広告 ID を使用して、ご利用のデバイスをデバッグ デバイスとして次のようにホワイトリストに登録します。

    PACConsentInformation.sharedInstance.debugIdentifiers =
        @[ @"41E538F6-9C98-4EF2-B3EE-D7BD8CAF8339" ];
  3. 最後に、ご希望のテスト対象地域を debugGeography に設定します。

    // Geography appears as in EEA for debug devices.
    PACConsentInformation.sharedInstance.debugGeography = PACDebugGeographyEEA;
    // Geography appears as not in EEA for debug devices.
    PACConsentInformation.sharedInstance.debugGeography = PACDebugGeographyNotEEA;

上記の手順が完了すると、同意ステータスの更新を行う呼び出しで、デバッグ対象地域が考慮されるようになります。

ここで示すコードは、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 に関する内部の実装情報であり、変更される可能性があります。

アプリ測定の遅延(オプション)

デフォルトでは、Google Mobile Ads SDK はアプリの測定を初期化し、アプリの起動時に直ちにユーザーレベルのイベントデータを Google に送信し始めます。この初期化動作により、コードを追加変更することなく AdMob のユーザーに関する指標を有効にできます。

ただし、これらのイベントを送信する前にアプリでユーザーの同意が必要な場合は、明示的に Mobile Ads SDK を初期化するか広告を読み込むまで、アプリの測定を遅らせることができます。

アプリの測定を遅らせるには、ブール値が YESGADDelayAppMeasurementInit キーをアプリの Info.plist に追加します。この変更は、次のようにプログラムで行うことができます。

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

または、プロパティ リスト エディタで編集することもできます。

よくある質問

Consent SDK でサポートされる広告技術プロバイダの数はどれくらいですか?
Consent SDK では、パブリッシャーが有効にできる広告技術プロバイダの数に制限を設けていません。
AdMob の管理画面で設定を変更すると、SDK から返される広告技術プロバイダのリストは自動的に更新されますか?
はい。お客様が AdMob の管理画面で広告技術プロバイダのリストに変更を加えると、その変更内容は 1 時間ほどで Google の広告サーバーに反映されます。