くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Flutter x AdMobでATT/GDPR対応

AATやGDPRをちゃんと対応しようと、
いろいろ調べてみたときの備忘録(*´ω`*)

どちらともAdMobで対応できたので便利

流れ

同メッセージの表示などのために、
User Messaging Platform(UMP)というのがあるらしい。

GDPRだけでなくIDFA(ATT)もサポート

メッセージを作成する

google_mobile_adsでの実装

FlutterからUser Messaging Platform(UMP)を使う形。
google_mobile_adsパッケージから利用できる。

各メソッドのFuture化

UMP周りのコードはコールバック関数だけでFutureじゃない。。
ちょっとめんどくさいので、Future化していく

必要な関数は以下の3つ

  • requestConsentInfoUpdate ... リクエス
  • loadAndShowConsentFormIfRequired ... メッセージを表示
  • showPrivacyOptionsForm ... プライバシー設定フォームの表示
import 'dart:async';

import 'package:flutter/material.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';

/// 同意のリクエスト
Future<void> _requestConsentInfoUpdate(ConsentRequestParameters params) {
  final completer = Completer<void>();
  ConsentInformation.instance.requestConsentInfoUpdate(
    params,
    () => completer.complete(),
    (FormError error) => completer.completeError(error),
  );
  return completer.future;
}

/// 必要に応じて同意フォームの読み込み&同意メッセージを表示
Future<FormError?> _loadAndShowConsentFormIfRequired() {
  final completer = Completer<FormError?>();
  ConsentForm.loadAndShowConsentFormIfRequired((error) {
    completer.complete(error);
  });
  return completer.future;
}

/// プライバシー設定フォームの表示
Future<FormError?> _showPrivacyOptionsForm() {
  final completer = Completer<FormError?>();
  ConsentForm.showPrivacyOptionsForm((formError) {
    completer.complete(formError);
  });
  return completer.future;
}

初回実行時

まだ一度もリクエストしておらず、
同意も拒否も確認していないときの処理

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';

// 同意のリクエスト
Future<void> checkAndRequestAdConsent() async {
  // リクエストパラメタの作成
  final params = ConsentRequestParameters();

  // 同意情報のリクエスト
  await _requestConsentInfoUpdate(params);
  
  // 現在の同意ステータスの読み込み完了後、
  // 必要に応じて同意フォームの読み込み&同意メッセージを表示
  final error = await _loadAndShowConsentFormIfRequired();
  if (error != null) {
    // TODO: 同意ステータスが取得できなかったとき
  }

  // 広告をリクエストできる同意ステータス化の確認
  final canRequestAds = await ConsentInformation.instance.canRequestAds();
  
  // 広告の初期化
  if (canRequestAds) MobileAds.instance.initialize();
}

プライバシー設定フォームの表示時

以下によると、プライバシー設定を変更できる必要があるらしい

一部の同意フォームでは、ユーザーがいつでも同意内容を変更する必要があります。必要に応じて、次の手順に沿ってプライバシー オプション ボタンを実装します。

処理としては、こんな感じで、設定画面などに配置しておけばOK

/// プライバシー設定フォームの表示時
Future<void> showPrivacyOptionsForm() async {
  // 同意ステータスの取得
  final status = await ConsentInformation.instance.getConsentStatus();
  
  // 確認済みでない場合は、表示しない
  if (status != ConsentStatus.obtained) return;

  final error = await _showPrivacyOptionsForm();
  if (error != null) {
    // TODO: 同意ステータスが取得できなかったとき
  }
}

同意状態のリセット/クリア

開発/テスト時に同意状態をリセットするときはこれでOK。
アンインストールして再インストールするのでもOK

/// 同意のリセット
void resetConsent() {
  ConsentInformation.instance.reset();
}

地域の指定

開発/テスト時に、動きを確認するため、
デバッグ用の設定で地域を指定できる

final consentDebugSettings = ConsentDebugSettings(
  // 地域の指定: EEA(欧州経済地域)
  debugGeography: DebugGeography.debugGeographyEea,
  // テスト端末のIdentifier
  testIdentifiers: [
    "33BE2250B43518CCDA7DE426D04EE231",
    "2077ef9a63d2b398840261c8221a0c9b",
  ],
);

テスト端末のIdentifierは、ログを見て確認

# Android
Use new ConsentDebugSettings.Builder().addTestDeviceHashedId("33BE2250B43518CCDA7DE426D04EE231")
to set this as a debug device.

# iOS
<UMP SDK>To enable debug mode for this device,
set: UMPDebugSettings.testDeviceIdentifiers = @[2077ef9a63d2b398840261c8221a0c9b]

以上!! AdMobというかUMP、便利だな(*´ω`*)

参考にしたサイト様