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

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

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

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

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

前提条件

CocoaPods(推奨)

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

pod 'PersonalizedAdConsent'

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

pod install --repo-update

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

手動ダウンロード

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

  1. Finder から PersonalizedAdConsent.xcodeproj ファイルをプロジェクトにドラッグします。

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

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

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

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

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

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

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

もう 1 つは、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 提供の同意フォームを提示するには、読み込まれた presentFromViewController:dismissCompletion:PACConsentForm を呼び出します。次の例をご覧ください。

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 で設定されたすべての広告技術プロバイダについて必要です。

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 のデフォルトの動作では、パーソナライズド広告が配信されます。パーソナライズされていない広告の配信に限ってユーザーが同意した場合には、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 に関する内部の実装情報であり、変更される可能性があります。

よくある質問

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

フィードバックを送信...

Google AdMob > Mobile Ads SDK > iOS
Google AdMob > Mobile Ads SDK > iOS
ご不明な点がありましたら、Google のサポートページをご覧ください。