アプリ起動時広告

アプリ起動時広告は、アプリの読み込み画面を収益化することを望むパブリッシャー様を対象とした広告フォーマットです。この広告は、ユーザーがアプリをフォアグラウンドに移動すると表示され、いつでも閉じることが可能です。

アプリ起動時広告は、小さなブランディング領域を使って自動的に表示されるため、ユーザーはアプリが起動中であることがわかります。以下は、アプリ起動時広告の表示例です。

前提条件

  • Unity プラグイン 6.1.0 以降。
  • スタートガイドの手順を完了し、Unity アプリに Google Mobile Ads Unity プラグインをインポートしておく必要があります。

常にテスト広告でテストする

アプリの開発とテストでは必ずテスト広告を使用し、配信中の実際の広告は使用しないでください。実際の広告を使用すると、アカウントが停止される可能性があります。

テスト広告を読み込む際は、次に示すリワード広告(Android と iOS)向けのテスト専用広告ユニット ID を使うと簡単です。

Android

ca-app-pub-3940256099942544/3419835294

iOS

ca-app-pub-3940256099942544/5662855259

この ID は、すべてのリクエストに対してテスト広告を返す特別な ID で、アプリのコーディング、テスト、デバッグで自由に使うことができます。なお、このテスト用 ID は、アプリを公開する前に必ずご自身の広告ユニット ID に置き換えてください。

Mobile Ads SDK のテスト広告の仕組みについて詳しくは、テスト広告をご覧ください。

実装

アプリ起動時広告を統合する主な手順は、以下のとおりです。

  1. 広告を表示するタイミングの前に広告を読み込むユーティリティ クラスを作成します。
  2. 広告を読み込みます。
  3. コールバックを登録して広告を表示します。
  4. フォアグラウンド イベント中に広告を表示するよう、MonoBehavior.OnApplicationPause(bool) をリッスンします。

ユーティリティ クラスを作成する

AppOpenAdManager という新しいクラスを作成して、広告を読み込みます。このクラスにより、読み込まれた広告と、各プラットフォームの広告ユニット ID をトラッキングするためのインスタンス変数が管理されます。

using System;
using GoogleMobileAds.Api;
using UnityEngine;

public class AppOpenAdManager
{
    #if UNITY_ANDROID
    private const string AD_UNIT_ID = "ca-app-pub-3940256099942544/3419835294";
    #elif UNITY_IOS
    private const string AD_UNIT_ID = "ca-app-pub-3940256099942544/5662855259";
    #else
    private const string AD_UNIT_ID = "unexpected_platform";
    #endif

    private static AppOpenAdManager instance;

    private AppOpenAd ad;

    private bool isShowingAd = false;

    public static AppOpenAdManager Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new AppOpenAdManager();
            }

            return instance;
        }
    }

    private bool IsAdAvailable
    {
        get
        {
            return ad != null;
        }
    }

    public void LoadAd()
    {
        // We will implement this below.
    }
}

広告を読み込む

アプリ起動時広告は、ユーザーがアプリを開くかアプリに戻る前に、準備が完了している必要があります。ユーティリティ クラスを実装して、広告を表示する必要があるタイミングに先立って広告リクエストが行われるようにします。

広告の読み込みは、AppOpenAd クラスで静的 LoadAd() メソッドを使用して行います。読み込みメソッドには、広告ユニット ID、ScreenOrientation モード、AdRequest オブジェクトのほか、広告の読み込みの成功時または失敗時に呼び出される完了ハンドラが必要です。読み込まれた AppOpenAd オブジェクトは、完了ハンドラのパラメータとして提供されます。以下の例は、AppOpenAd を読み込む方法を示しています。

public class AppOpenAdManager
{
    ...

    public void LoadAd()
    {
        AdRequest request = new AdRequest.Builder().Build();

        // Load an app open ad for portrait orientation
        AppOpenAd.LoadAd(AD_UNIT_ID, ScreenOrientation.Portrait, request, ((appOpenAd, error) =>
        {
            if (error != null)
            {
                // Handle the error.
                Debug.LogFormat("Failed to load the ad. (reason: {0})", error.LoadAdError.GetMessage());
                return;
            }

            // App open ad is loaded.
            ad = appOpenAd;
        }));
    }
}

広告を表示して全画面表示コールバックを処理する

広告を表示する前に、イベント ハンドラごとにデリゲートを登録して、各広告イベントをリッスンします。

public class AppOpenAdManager
{
    ...

    public void ShowAdIfAvailable()
    {
        if (!IsAdAvailable || isShowingAd)
        {
            return;
        }

        ad.OnAdDidDismissFullScreenContent += HandleAdDidDismissFullScreenContent;
        ad.OnAdFailedToPresentFullScreenContent += HandleAdFailedToPresentFullScreenContent;
        ad.OnAdDidPresentFullScreenContent += HandleAdDidPresentFullScreenContent;
        ad.OnAdDidRecordImpression += HandleAdDidRecordImpression;
        ad.OnPaidEvent += HandlePaidEvent;

        ad.Show();
    }

    private void HandleAdDidDismissFullScreenContent(object sender, EventArgs args)
    {
        Debug.Log("Closed app open ad");
        // Set the ad to null to indicate that AppOpenAdManager no longer has another ad to show.
        ad = null;
        isShowingAd = false;
        LoadAd();
    }

    private void HandleAdFailedToPresentFullScreenContent(object sender, AdErrorEventArgs args)
    {
        Debug.LogFormat("Failed to present the ad (reason: {0})", args.AdError.GetMessage());
        // Set the ad to null to indicate that AppOpenAdManager no longer has another ad to show.
        ad = null;
        LoadAd();
    }

    private void HandleAdDidPresentFullScreenContent(object sender, EventArgs args)
    {
        Debug.Log("Displayed app open ad");
        isShowingAd = true;
    }

    private void HandleAdDidRecordImpression(object sender, EventArgs args)
    {
        Debug.Log("Recorded ad impression");
    }

    private void HandlePaidEvent(object sender, AdValueEventArgs args)
    {
        Debug.LogFormat("Received paid event. (currency: {0}, value: {1}",
                args.AdValue.CurrencyCode, args.AdValue.Value);
    }
}

これにより、ユーザーがアプリ起動時広告をクリックしてからアプリに戻った場合に、別のアプリ起動時広告がユーザーに表示されることがなくなります。

アプリのフォアグラウンド イベントをリッスンする

アプリのフォアグラウンド イベントについて通知を受け取るには、アプリの一時停止メッセージをリッスンする必要があります。MonoBehavior.OnApplicationPause(bool) メソッドを実装することにより、アプリ起動イベントとフォアグラウンド イベントに対して通知され、広告を表示できます。

using UnityEngine;

using GoogleMobileAds.Api;

public class GoogleMobileAdsDemoScript : MonoBehaviour
{

    public void Start()
    {
        // Load an app open ad when the scene starts
        AppOpenAdManager.Instance.LoadAd();
    }

    public void OnApplicationPause(bool paused)
    {
        // Display the app open ad when the app is foregrounded
        if (!paused)
        {
            AppOpenAdManager.Instance.ShowAdIfAvailable();
        }
    }
}

広告の有効期限に関する考察

期限切れの広告を表示しないようにするには、メソッドを AppOpenAdManager に追加して、広告の読み込みからの経過時間と、広告の有効性を確認できるようにします。

public class AppOpenAdManager
{
    ...
    private DateTime loadTime;

    private bool IsAdAvailable
    {
        get
        {
            return ad != null && (System.DateTime.UtcNow - loadTime).TotalHours < 4;
        }
    }

    public void LoadAd()
    {
        if (IsAdAvailable)
        {
            return;
        }

        AdRequest request = new AdRequest.Builder().Build();
        AppOpenAd.LoadAd(AD_UNIT_ID, ScreenOrientation.Portrait, request, ((appOpenAd, error) =>
        {
            if (error != null)
            {
                Debug.LogFormat("Failed to load the ad. (reason: {0})", error.LoadAdError.GetMessage());
                return;
            }

            ad = appOpenAd;
            loadTime = DateTime.UtcNow;
        }));
    }
}

コールド スタートと読み込み画面

このドキュメントではこれまでのところ、アプリがメモリで一時停止した後に、アプリがフォアグラウンドに移動した場合にのみ、アプリ起動時広告を表示することが前提とされていました。「コールド スタート」は、メモリ内で一時停止されていなかったアプリが起動された場合に発生します。

コールド スタートの例として、ユーザーが初めてアプリを開くときを挙げることができます。 コールド スタートでは、直ちに表示することのできる読み込み済みのアプリ起動時広告がありません。広告をリクエストしてから広告が返されるまでに時間差があるため、ユーザーが少しだけアプリを使用したところで突然コンテキストから外れた広告が表示されることになってしまいます。ユーザー エクスペリエンスの低下につながるこのような事態は、避ける必要があります。

コールド スタートでアプリ起動時広告を使用する場合のおすすめの方法は、ゲームまたはアプリのアセットを読み込んでいる読み込み画面からのみ広告を表示することです。アプリの読み込みが完了し、アプリのメイン コンテンツが開いたら、そこには広告を表示しないでください。

ベスト プラクティス

アプリ起動時広告では、アプリの初回起動時やアプリの切り替え時にアプリの読み込み画面が収益化されますが、ユーザーがアプリをスムーズに使用できるよう、以下のベスト プラクティスを念頭に置いてください。

  • ユーザーがアプリを数回使用した後に、アプリ起動時広告を初めて表示します。
  • ユーザーが本来ならアプリの読み込みを待機しているだけの間に、アプリ起動時広告を表示します。
  • アプリ起動時広告の下に読み込み画面が存在し、広告が閉じられる前に読み込み画面の読み込みが完了した場合は、OnAdDidDismissFullScreenContent イベント ハンドラで読み込み画面を閉じることができます。