しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

Unity + AdMob 利用時に iOS 14 の ATT 対応する

※ これは 2021/04/09 時点の Unity 2020.3.3f1, Xcode 12.4, AdMob v5.4.0 の情報です

最新版では動作が異なる可能性がありますのでご注意ください

前回はざっくり iOS 14 の ATT 許可ダイアログ表示をできるようにしてみたが、実際には単体で対応することは少なく、広告表示や利用状況分析の SDK を使うために必要になることが多い

というわけで今回は広告表示のほぼデファクトになりつつある AdMob SDK を利用する場合、上記前回の手順に加えて必要になる iOS 14 ATT 対応を試してみる

AdMob 自体の導入手順は 公式サイト をはじめいくらでも紹介されていると思うので省略

まず AdMob の設定用 ScriptableObject を下記のように設定

測定の遅延を有効にする

App ID などは今回はテスト用の ID を設定し、許可を得るまで測定を開始しないように Delay app measurement に忘れずにチェックを入れるようにする

次に広告表示用に下記のようなサービスクラスを用意

using GoogleMobileAds.Api;

/// <summary>
/// 広告制御サービスクラス
/// </summary>
public class AdvertisingService
{
    /// <summary>
    /// ユーザー情報収集許可フラグ
    /// </summary>
    private bool isTrackingEnable = false;

    /// <summary>
    /// フッターバナー広告
    /// </summary>
    private BannerView footerBannerView = null;

    /// <summary>
    /// バナー広告ユニットID(テスト用)
    /// </summary>
    private const string BannerAdUnitId = @"ca-app-pub-3940256099942544/6300978111";

    /// <summary>
    /// 初期化
    /// </summary>
    /// <param name="isTrackingEnable">ユーザー情報収集許可フラグ</param>
    public void Initialize(bool isTrackingEnable)
    {
        this.isTrackingEnable = isTrackingEnable;
        MobileAds.Initialize(OnInitializeCompleted);
    }

    /// <summary>
    /// AdMob 初期化完了イベントハンドラ
    /// </summary>
    /// <param name="status"></param>
    private void OnInitializeCompleted(InitializationStatus status)
    {
        var builder = new AdRequest.Builder();

        if (!this.isTrackingEnable)
        {
            // ユーザー情報の収集を止める
            builder = builder.AddExtra("npa", "1");
        }
        var request = builder.Build();

        // フッターバナー広告を読み込んで表示
        var adSize = AdSize.GetCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(AdSize.FullWidth);
        this.footerBannerView = new BannerView(BannerAdUnitId, adSize, AdPosition.Bottom);
        this.footerBannerView.LoadAd(request);
    }
}

何の変哲もない AdMob でフッターバナー広告を表示するだけのコードで、重要なのは AdRequest を生成する際にユーザー情報を収集しない場合に AddExtra("npa", "1") のメソッドを使用するようにすることだけ

あとはもともとあった Bootstrap.cs を下記のように変更

using UnityEngine;

public class Bootstrap : MonoBehaviour
{
    /// <summary>
    /// 広告制御サービス
    /// </summary>
    private AdvertisingService advertisingService = null;

    /// <summary>
    /// 開始処理
    /// </summary>
    public async void Start()
    {
#if UNITY_IOS && !UNITY_EDITOR

        var status = NativeService.GetIOSTrackingAuthorizationStatus();

        // 未回答だった場合は ATT 許可要求ダイアログを表示
        if (!status.HasValue)
        {
            status = await NativeService.RequestTrackingAuthorization() as bool?;
        }

        // 本当はシーン遷移などに備えて何らかの方法でシングルトン化した方がよい
        this.advertisingService = new AdvertisingService();

        if (status.Value)
        {
            // 許可時の処理
            this.advertisingService.Initialize(true);
        }
        else
        {
            // 不許可時の処理
            this.advertisingService.Initialize(false);
        }
#endif
    }
}

許可状態に応じて広告制御サービスの初期化を切り替える

あとは AdMob の SDK が必要なビルド時の設定を全部やってくれるっぽい

Unity がエクスポートした Xcode のプロジェクトを開いたら・・・

SKAdNetworkIdentifier

Info.plist に AdMob 用の SKAdNetworkIdentifier が自動で追加されていた・・・これはありがたい

さっそくビルドして動かしてみると

ATT 対応と AdMob 広告表示

ATT 許可を拒否しても AdMob のフッターバナー広告が表示された!