しっぽを追いかけて

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

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 を下記のように設定

f:id:matatabi_ux:20210409212228p:plain
測定の遅延を有効にする

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 のプロジェクトを開いたら・・・

f:id:matatabi_ux:20210409205044p:plain
SKAdNetworkIdentifier

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

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

f:id:matatabi_ux:20210409211908g:plain
ATT 対応と AdMob 広告表示

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

スポンサードリンク