このガイドは、アプリ起動時広告を統合するパブリッシャー様を対象としています。
アプリ起動時広告は、アプリの読み込み画面の収益化をご希望のパブリッシャー様向けの広告フォーマットです。アプリ起動時広告は、ユーザーがいつでも閉じることができ、ユーザーがアプリをフォアグラウンドに移したときに表示可能です。
アプリ起動時広告は、小さなブランディング領域を使って自動的に表示されるため、ユーザーはアプリが起動中であることがわかります。以下は、アプリ起動時広告の表示例です。

アプリ起動時広告の導入に必要な手順は、大枠で次のとおりです。
- 広告を表示するタイミングの前に広告を読み込むマネージャー クラスを作成します。
 - アプリのフォアグラウンド イベント中に広告を表示します。
 - 表示コールバックを処理します。
 
前提条件
常にテスト広告でテストする
アプリの開発とテストでは必ずテスト広告を使用し、配信中の実際の広告は使用しないでください。実際の広告でテストすると、アカウントが停止される場合があります。
下記のアプリ起動時広告向けのテスト専用広告ユニット ID を使うと、テスト広告を簡単に読み込むことができます。
/21775744923/example/app-open
この ID は、すべてのリクエストに対してテスト広告を返す特別な ID で、アプリのコーディング、テスト、デバッグで自由に使うことができます。なお、テスト用 ID は、アプリを公開する前に必ずご自身の広告ユニット ID に置き換えてください。
Mobile Ads SDK のテスト広告の仕組みについて詳しくは、テスト広告をご覧ください。
マネージャー クラスを実装する
広告ができるだけ早く表示されるように、表示するタイミングの前に広告を読み込むことをおすすめします。そうすれば、アプリがフォアグランドに移動するとすぐに広告が表示されるようになります。マネージャー クラスを実装して、広告を表示する必要があるタイミングに先立って広告リクエストが行われるようにします。
AppOpenAdManager という名前の新しいシングルトン クラスを作成します。
Swift
class AppOpenAdManager: NSObject {
  /// The app open ad.
  var appOpenAd: AppOpenAd?
  /// Maintains a reference to the delegate.
  weak var appOpenAdManagerDelegate: AppOpenAdManagerDelegate?
  /// Keeps track of if an app open ad is loading.
  var isLoadingAd = false
  /// Keeps track of if an app open ad is showing.
  var isShowingAd = false
  /// Keeps track of the time when an app open ad was loaded to discard expired ad.
  var loadTime: Date?
  /// For more interval details, see https://support.google.com/admanager/answer/9351867
  let timeoutInterval: TimeInterval = 4 * 3_600
  static let shared = AppOpenAdManager()
Objective-C
@interface AppOpenAdManager ()
/// The app open ad.
@property(nonatomic, strong, nullable) GADAppOpenAd *appOpenAd;
/// Keeps track of if an app open ad is loading.
@property(nonatomic, assign) BOOL isLoadingAd;
/// Keeps track of if an app open ad is showing.
@property(nonatomic, assign) BOOL isShowingAd;
/// Keeps track of the time when an app open ad was loaded to discard expired ad.
@property(nonatomic, strong, nullable) NSDate *loadTime;
@end
/// For more interval details, see https://support.google.com/admanager/answer/9351867
static const NSInteger kTimeoutInterval = 4;
@implementation AppOpenAdManager
+ (nonnull AppOpenAdManager *)sharedInstance {
  static AppOpenAdManager *instance = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    instance = [[AppOpenAdManager alloc] init];
  });
  return instance;
}
AppOpenAdManagerDelegate プロトコルを実装します。
Swift
protocol AppOpenAdManagerDelegate: AnyObject {
  /// Method to be invoked when an app open ad life cycle is complete (i.e. dismissed or fails to
  /// show).
  func appOpenAdManagerAdDidComplete(_ appOpenAdManager: AppOpenAdManager)
}
Objective-C
@protocol AppOpenAdManagerDelegate <NSObject>
/// Method to be invoked when an app open ad life cycle is complete (i.e. dismissed or fails to
/// show).
- (void)adDidComplete;
@end
広告を読み込む
次のステップでは、アプリ起動時広告を読み込みます。
Swift
func loadAd() async {
  // Do not load ad if there is an unused ad or one is already loading.
  if isLoadingAd || isAdAvailable() {
    return
  }
  isLoadingAd = true
  do {
    appOpenAd = try await AppOpenAd.load(
      with: "/21775744923/example/app-open", request: AdManagerRequest())
    appOpenAd?.fullScreenContentDelegate = self
    loadTime = Date()
  } catch {
    print("App open ad failed to load with error: \(error.localizedDescription)")
    appOpenAd = nil
    loadTime = nil
  }
  isLoadingAd = false
}
Objective-C
- (void)loadAd {
  // Do not load ad if there is an unused ad or one is already loading.
  if ([self isAdAvailable] || self.isLoadingAd) {
    return;
  }
  self.isLoadingAd = YES;
  [GADAppOpenAd loadWithAdUnitID:@"/21775744923/example/app-open"
                         request:[GADRequest request]
               completionHandler:^(GADAppOpenAd * _Nullable appOpenAd, NSError * _Nullable error) {
    self.isLoadingAd = NO;
    if (error) {
      NSLog(@"App open ad failed to load with error: %@", error);
      self.appOpenAd = nil;
      self.loadTime = nil;
      return;
    }
    self.appOpenAd = appOpenAd;
    self.appOpenAd.fullScreenContentDelegate = self;
    self.loadTime = [NSDate date];
  }];
}
広告を表示する
次のステップで、アプリ起動時広告を表示します。表示できる広告がない場合は、新しい広告の読み込みを試みます。
Swift
func showAdIfAvailable() {
  // If the app open ad is already showing, do not show the ad again.
  if isShowingAd {
    return print("App open ad is already showing.")
  }
  // If the app open ad is not available yet but is supposed to show, load
  // a new ad.
  if !isAdAvailable() {
    print("App open ad is not ready yet.")
    // The app open ad is considered to be complete in this example.
    appOpenAdManagerDelegate?.appOpenAdManagerAdDidComplete(self)
    // Load a new ad.
    return
  }
  if let appOpenAd {
    print("App open ad will be displayed.")
    appOpenAd.present(from: nil)
    isShowingAd = true
  }
}
Objective-C
- (void)showAdIfAvailable {
  // If the app open ad is already showing, do not show the ad again.
  if (self.isShowingAd) {
    NSLog(@"App open ad is already showing.");
    return;
  }
  // If the app open ad is not available yet but is supposed to show, load
  // a new ad.
  if (![self isAdAvailable]) {
    NSLog(@"App open ad is not ready yet.");
    // The app open ad is considered to be complete in this example.
    [self adDidComplete];
    // Load a new ad.
    return;
  }
  [self.appOpenAd presentFromRootViewController:nil];
  self.isShowingAd = YES;
}
アプリのフォアグラウンド イベント中に広告を表示する
アプリがアクティブになったら、showAdIfAvailable() を呼び出して、表示できる広告がある場合は表示し、そうでない場合は新しい広告を読み込みます。
Swift
func applicationDidBecomeActive(_ application: UIApplication) {
  // Show the app open ad when the app is foregrounded.
  AppOpenAdManager.shared.showAdIfAvailable()
}
Objective-C
- (void) applicationDidBecomeActive:(UIApplication *)application {
  // Show the app open ad when the app is foregrounded.
  [AppOpenAdManager.sharedInstance showAdIfAvailable];
}
表示コールバックを処理する
表示イベントに関する通知を受け取るには、返された広告の fullScreenContentDelegate のプロパティに GADFullScreenContentDelegate を割り当てる必要があります。
Swift
appOpenAd?.fullScreenContentDelegate = self
Objective-C
self.appOpenAd.fullScreenContentDelegate = self;
特に、最初の広告の表示が終わったら、次のアプリ起動時広告をリクエストすることをおすすめします。次のコードは、AppOpenAdManager ファイルでプロトコルを実装する方法を示しています。
Swift
func adDidRecordImpression(_ ad: FullScreenPresentingAd) {
  print("App open ad recorded an impression.")
}
func adDidRecordClick(_ ad: FullScreenPresentingAd) {
  print("App open ad recorded a click.")
}
func adWillDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("App open ad will be dismissed.")
}
func adWillPresentFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("App open ad will be presented.")
}
func adDidDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("App open ad was dismissed.")
  appOpenAd = nil
  isShowingAd = false
  appOpenAdManagerDelegate?.appOpenAdManagerAdDidComplete(self)
  Task {
    await loadAd()
  }
}
func ad(
  _ ad: FullScreenPresentingAd,
  didFailToPresentFullScreenContentWithError error: Error
) {
  print("App open ad failed to present with error: \(error.localizedDescription)")
  appOpenAd = nil
  isShowingAd = false
  appOpenAdManagerDelegate?.appOpenAdManagerAdDidComplete(self)
  Task {
    await loadAd()
  }
}
Objective-C
- (void)adDidRecordImpression:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"App open ad recorded an impression.");
}
- (void)adDidRecordClick:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"App open ad recorded a click.");
}
- (void)adWillPresentFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"App open ad will be presented.");
}
- (void)adWillDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"App open ad will be dismissed.");
}
- (void)adDidDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"App open ad was dismissed.");
  self.appOpenAd = nil;
  self.isShowingAd = NO;
  [self adDidComplete];
  [self loadAd];
}
- (void)ad:(nonnull id<GADFullScreenPresentingAd>)ad
    didFailToPresentFullScreenContentWithError:(nonnull NSError *)error {
  NSLog(@"App open ad failed to present with error: %@", error.localizedDescription);
  self.appOpenAd = nil;
  self.isShowingAd = NO;
  [self adDidComplete];
  [self loadAd];
}
広告の有効期限を考慮する
期限切れの広告を表示しないようにするには、広告参照の読み込みからの経過時間をチェックするメソッドをアプリ デリゲートに追加します。
AppOpenAdManager に loadTime という Date プロパティを追加し、広告を読み込む際にそのプロパティを設定します。これで、広告の読み込みからの経過時間が所定の時間に満たない場合に true を返すメソッドを追加できます。広告表示を始める前に、広告参照の有効性を必ずチェックするようにしてください。
Swift
private func wasLoadTimeLessThanNHoursAgo(timeoutInterval: TimeInterval) -> Bool {
  // Check if ad was loaded more than n hours ago.
  if let loadTime = loadTime {
    return Date().timeIntervalSince(loadTime) < timeoutInterval
  }
  return false
}
private func isAdAvailable() -> Bool {
  // Check if ad exists and can be shown.
  return appOpenAd != nil && wasLoadTimeLessThanNHoursAgo(timeoutInterval: timeoutInterval)
}
Objective-C
- (BOOL)wasLoadTimeLessThanNHoursAgo:(int)n {
  // Check if ad was loaded more than n hours ago.
  NSDate *now = [NSDate date];
  NSTimeInterval timeIntervalBetweenNowAndLoadTime = [now timeIntervalSinceDate:self.loadTime];
  double secondsPerHour = 3600.0;
  double intervalInHours = timeIntervalBetweenNowAndLoadTime / secondsPerHour;
  return intervalInHours < n;
}
- (BOOL)isAdAvailable {
  // Check if ad exists and can be shown.
  return self.appOpenAd && [self wasLoadTimeLessThanNHoursAgo:kTimeoutInterval];
}
コールド スタートと読み込み画面
このドキュメントでは、アプリ起動時広告が表示されるのは、メモリ内で一時停止されていたアプリがフォアグラウンドに移動した場合のみを想定しています。「コールド スタート」は、メモリ内で一時停止されていなかったアプリが起動された場合に発生します。
コールド スタートの例として、ユーザーが初めてアプリを開くときを挙げることができます。 コールド スタートでは、直ちに表示することのできる読み込み済みのアプリ起動時広告がありません。広告をリクエストしてから広告が返されるまでに時間差があるため、ユーザーが少しだけアプリを使用したところで突然コンテキストから外れた広告が表示されることになってしまいます。ユーザー エクスペリエンスの低下につながるこのような事態は、避ける必要があります。
コールド スタートでアプリ起動時広告を使用する場合のおすすめの方法は、ゲームまたはアプリのアセットを読み込んでいる読み込み画面からのみ広告を表示することです。アプリの読み込みが完了し、アプリのメイン コンテンツが開いたら、そこには広告を表示しないでください。
ベスト プラクティス
アプリ起動時広告は、アプリの読み込み画面を収益化できるように作られていますが、ユーザーにアプリを楽しんで使ってもらうため、次のベスト プラクティスを常に心がけるようにしてください。
- アプリ起動時広告を使い始めるのは、ユーザーがアプリを何度か使った後にします。
 - アプリ起動時広告は、ユーザーがアプリの読み込みを待っている間に表示します。
 - アプリ起動時広告の下に読み込み画面が存在し、広告が閉じられる前に読み込み画面の読み込みが完了した場合は、
adDidDismissFullScreenContentメソッドで読み込み画面を閉じることができます。 
GitHub のサンプルコードの全文
次のステップ
ユーザーのプライバシーの詳細を確認します。