アプリ起動時広告

このガイドは、アプリ起動時広告の導入を開始されるパブリッシャー様を対象としています。

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

アプリ起動時広告では小さなブランディング領域が自動的に表示されるため、ユーザーはアプリが起動中であることを認識できます。広告の表示例を次に示します。

アプリ起動時広告の導入に必要な手順は、大枠で次のとおりです。

  1. GADAppOpenAd を読み込んで表示するメソッドを、AppDelegate に追加します。
  2. アプリのフォアグラウンド イベントを検出します。
  3. プレゼンテーション コールバックを処理します。

前提条件

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

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

下記のアプリ起動時広告向けのテスト専用広告ユニット ID を使うと、テスト広告を簡単に読み込むことができます。

ca-app-pub-3940256099942544/5662855259

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

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

アプリのデリゲートを変更する

アプリ起動時広告は、アプリが起動したときとユーザーがアプリをフォアグラウンドに移したときに表示されます。ユーザーがアプリを開いたときに広告をすぐに表示できるようにするため、表示する広告への参照を用意しておくことをおすすめします。

広告表示が必要になる前に GADAppOpenAd をプリロードしておくことで、次にアプリが開かれたときにアプリ起動時広告をすぐに表示できます。広告への単独参照を容易にするには、次のプロパティとメソッドを AppDelegate.h に追加します。

#import <GoogleMobileAds/GoogleMobileAds.h>
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property(strong, nonatomic) UIWindow* window;
@property(strong, nonatomic) GADAppOpenAd* appOpenAd;

- (void)requestAppOpenAd;
- (void)tryToPresentAd;

@end

なお、request メソッドと present メソッドは AppDelegate クラスの外からアクセスできるようにします。これにより、iOS 13 以降のデバイスで、これらのメソッドを UISceneDelegate から呼び出すことができます。本件については、後ほど詳しく説明します。

次のように、AppDelegate.mrequestAppOpenAd メソッドを追加します。

- (void)requestAppOpenAd {
  self.appOpenAd = nil;
  [GADAppOpenAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/5662855259"
                         request:[GADRequest request]
                     orientation:UIInterfaceOrientationPortrait
               completionHandler:^(GADAppOpenAd *_Nullable appOpenAd, NSError *_Nullable error) {
                 if (error) {
                   NSLog(@"Failed to load app open ad: %@", error);
                   return;
                 }
                 self.appOpenAd = appOpenAd;
               }];
}

このメソッドは、新しい GADAppOpenAd の読み込みをリクエストします。読み込みが正常に処理されると AppDelegate のプロパティが設定され、ユーザーがアプリをフォアグラウンドに移したときに、広告がすぐに使えるようになります。

orientation(画面の向き)の設定は必須です。orientation の設定が UIInterfaceOrientationUnknown の場合、GADAppOpenAd は縦向きと見なします。横向きのレイアウトを指定する場合は、request メソッドに UIInterfaceOrientationLandscapeLeftUIInterfaceOrientationLandscapeRight のいずれかを渡します。

次に、AppDelegate から広告を表示するメソッドを追加します。

- (void)tryToPresentAd {
  if (self.appOpenAd) {
    UIViewController *rootController = self.window.rootViewController;
    [self.appOpenAd presentFromRootViewController:rootController];
  } else {
    // If you don't have an ad ready, request one.
    [self requestAppOpenAd];
  }
}

このメソッドは、広告の存在を確認したうえで、ルートビュー コントローラから表示できる場合に既存のコンテンツの上に重ねて広告を表示します。表示できる広告がない場合は、このメソッドが新しいリクエストを行います。

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

ユーザーがアプリを初めて起動したときに、広告参照が使える状態であることはほとんどありません。そこで代わりに、上で定義した tryToPresentAd メソッドを使って、使用できる広告がある場合は広告を表示し、そうでない場合は新しい広告をリクエストします。このメソッドは、アプリがフォアグラウンドに来るたびに呼び出す必要があります。それには次のように、AppDelegateapplicationDidBecomeActive: メソッドをオーバーライドします。

- (void)applicationDidBecomeActive:(UIApplication *)application {
  [self tryToPresentAd];
}

プレゼンテーション コールバックを処理する

アプリでアプリ起動時広告を表示する際は、GADFullScreenContentDelegate を使って特定のプレゼンテーション イベントを処理します。特に、最初の広告の表示が終わったら、次のアプリ起動時広告をリクエストすることをおすすめします。

AppDelegate.h ファイルに次の変更を加えます。

#import <GoogleMobileAds/GoogleMobileAds.h>
#import <UIKit/UIKit.h>
@interface AppDelegate
    : UIResponder <UIApplicationDelegate, GADFullScreenContentDelegate>

@property(strong, nonatomic) UIWindow* window;
@property(strong, nonatomic) GADAppOpenAd* appOpenAd;

- (void)requestAppOpenAd;
- (void)tryToPresentAd;

@end

そして、AppDelegate.m ファイルに次の行を追加します。

- (void)requestAppOpenAd {
  self.appOpenAd = nil;
  [GADAppOpenAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/5662855259"
                         request:[GADRequest request]
                     orientation:UIInterfaceOrientationPortrait
               completionHandler:^(GADAppOpenAd *_Nullable appOpenAd, NSError *_Nullable error) {
                 if (error) {
                   NSLog(@"Failed to load app open ad: %@", error);
                   return;
                 }
                 self.appOpenAd = appOpenAd;
                 self.appOpenAd.fullScreenContentDelegate = self;
               }];
}

#pragma mark - GADFullScreenContentDelegate

/// Tells the delegate that the ad failed to present full screen content.
- (void)ad:(nonnull id<GADFullScreenPresentingAd>)ad
    didFailToPresentFullScreenContentWithError:(nonnull NSError *)error {
  NSLog(@"didFailToPresentFullScreenContentWithError");
  [self requestAppOpenAd];

}

/// Tells the delegate that the ad presented full screen content.
- (void)adDidPresentFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"adDidPresentFullScreenContent");
}

/// Tells the delegate that the ad dismissed full screen content.
- (void)adDidDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"adDidDismissFullScreenContent");
  [self requestAppOpenAd];
}
...

これらのコールバックが、アプリ起動時広告のライフサイクルにおけるさまざまなイベントを処理します。

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

期限切れの広告を表示しないようにするには、広告参照の読み込みからの経過時間をチェックするメソッドをアプリ デリゲートに追加します。

それにはまず、次のように AppDelegate.hNSDate プロパティを追加します。

#import <GoogleMobileAds/GoogleMobileAds.h>
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property(strong, nonatomic) UIWindow* window;
@property(strong, nonatomic) GADAppOpenAd* appOpenAd;
@property(weak, nonatomic) NSDate *loadTime;

- (void)requestAppOpenAd;
- (void)tryToPresentAd;

@end

これで、広告の読み込みからの経過時間が所定の時間未満の場合に true を返すメソッドを追加できます。

具体的には、AppDelegate.m に次のメソッドを追加します。

- (BOOL)wasLoadTimeLessThanNHoursAgo:(int)n {
  NSDate *now = [NSDate date];
  NSTimeInterval timeIntervalBetweenNowAndLoadTime = [now timeIntervalSinceDate:self.loadTime];
  double secondsPerHour = 3600.0;
  double intervalInHours = timeIntervalBetweenNowAndLoadTime / secondsPerHour;
  return intervalInHours < n;
}

次に、広告を読み込む際に loadTime プロパティを設定します。

- (void)requestAppOpenAd {
  self.appOpenAd = nil;
  [GADAppOpenAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/5662855259"
                         request:[GADRequest request]
                     orientation:UIInterfaceOrientationPortrait
               completionHandler:^(GADAppOpenAd *_Nullable appOpenAd, NSError *_Nullable error) {
                 if (error) {
                   NSLog(@"Failed to load app open ad: %@", error);
                   return;
                 }
                 self.appOpenAd = appOpenAd;
                 self.appOpenAd.fullScreenContentDelegate = self;
                 self.loadTime = [NSDate date];
               }];
}

最後に、広告表示を始める前に、広告参照の有効性を必ずチェックします。

- (void)tryToPresentAd {
  if (self.appOpenAd && [self wasLoadTimeLessThanNHoursAgo:4]) {
    UIViewController *rootController = self.window.rootViewController;
    [self.appOpenAd presentFromRootViewController:rootController];
  } else {
    // If you don't have an ad ready, request one.
    [self requestAppOpenAd];
  }
}

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

上述の説明は、メモリ内で停止中のアプリがフォアグラウンドに移された際にアプリ起動時広告を表示するケースのみが対象です。一方「コールド スタート」は、メモリ内で停止中ではないアプリが起動されたケースが対象となります。

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

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

ベスト プラクティス

アプリ起動時広告は、アプリの読み込み画面を収益化できるように作られていますが、ユーザーにアプリを楽しんで使ってもらうため、次のベスト プラクティスを常に心がけるようにしてください。

  • アプリ起動時広告を使い始めるのは、ユーザーがアプリを何度か使った後にします。
  • アプリ起動時広告は、ユーザーがアプリの読み込みを待っている間に表示します。
  • アプリ起動時広告の下に読み込み画面が存在し、広告が閉じられる前に読み込み画面の読み込みが完了した場合は、adDidDismissFullScreenContent メソッドで読み込み画面を閉じることができます。