インタースティシャル広告

インタースティシャル広告は、ユーザーが閉じるまでアプリのインターフェース上に全画面表示される広告です。通常は、次のアクティビティに移行する前や、ゲームレベルをクリアした後の合間など、アプリの操作中に画面が切り替わるタイミングで表示されます。アプリにインタースティシャル広告が表示されると、ユーザーは広告をタップしてリンク先 URL に移動するか、広告を閉じてアプリに戻るかを選択することになります。 事例紹介

このガイドでは、iOS アプリにインタースティシャル広告を組み込む方法について説明します。

前提条件

インタースティシャル広告オブジェクトを作成する

インタースティシャル広告は、GADInterstitial オブジェクトによってリクエストされ、表示されます。このオブジェクトを使用するには、最初に、オブジェクトのインスタンス化と広告ユニット ID の設定を行います。たとえば、UIViewControllerviewDidLoad メソッドで GADInterstitial を作成する方法は次のとおりです。

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController {

  var interstitial: GADInterstitial!

  override func viewDidLoad() {
    super.viewDidLoad()
    interstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910")
  }
}

Objective-C

@import GoogleMobileAds;
@import UIKit;

@interface ViewController ()

@property(nonatomic, strong) GADInterstitial *interstitial;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  self.interstitial = [[GADInterstitial alloc]
      initWithAdUnitID:@"ca-app-pub-3940256099942544/4411468910"];
}

GADInterstitial は、1 つのインタースティシャル広告を読み込んで表示する、使い捨てオブジェクトです。他のインタースティシャル広告を表示するには、アプリで広告ごとに GADInterstitial を作成する必要があります。

テストには必ずテスト広告を使用する

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

テスト広告は、次に示す iOS インタースティシャル向けのテスト専用広告ユニット ID を使うと簡単に読み込むことができます。 ca-app-pub-3940256099942544/4411468910

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

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

広告を読み込む

インタースティシャル広告を読み込むには、GADRequest オブジェクトの loadRequest: を呼び出します。

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController {

  var interstitial: GADInterstitial!

  override func viewDidLoad() {
    super.viewDidLoad()
    interstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910")
    let request = GADRequest()
    interstitial.load(request)
  }
}

Objective-C

@import GoogleMobileAds;
@import UIKit;

@interface ViewController ()

@property(nonatomic, strong) GADInterstitial *interstitial;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  self.interstitial = [[GADInterstitial alloc]
      initWithAdUnitID:@"ca-app-pub-3940256099942544/4411468910"];
  GADRequest *request = [GADRequest request];
  [self.interstitial loadRequest:request];
}

広告を表示する

インタースティシャルは、アプリの操作が一時中断するタイミングで表示される必要があります。ゲームレベルをクリアした後の合間やタスクが完了した直後などが適しています。インタースティシャルを表示するには、GADInterstitialisReady プロパティで読み込みが完了したことを確認してから、presentFromRootViewController を呼び出します。これを UIViewController のいずれかのアクション メソッドで行う方法について、次に例を示します。

Swift

@IBAction func doSomething(_ sender: AnyObject) {
  ...
  if interstitial.isReady {
    interstitial.present(fromRootViewController: self)
  } else {
    print("Ad wasn't ready")
  }
}

Objective-C

- (IBAction)doSomething:(id)sender {
  ...
  if (self.interstitial.isReady) {
    [self.interstitial presentFromRootViewController:self];
  } else {
    NSLog(@"Ad wasn't ready");
  }
}

「Cannot present interstitial. It is not ready.」というメッセージが表示された場合は、インタースティシャルの読み込みが終わっていないか、読み込みが失敗しています。このメッセージが表示されないようにするには、isReady メソッドを使用して、presentFromRootViewController: を呼び出す前にインタースティシャル広告を表示可能かどうかを確認してください。

GADInterstitialDelegate を使用して再読み込みする

GADInterstitial は使い捨てオブジェクトです。つまり、インタースティシャルを一度表示すると、hasBeenUsedtrue を返し、インタースティシャルを使って別の広告を読み込むことはできなくなります。別のインタースティシャルをリクエストするには、新しい GADInterstitial オブジェクトを作成する必要があります。インタースティシャル オブジェクトを再利用しようとすると、「Request Error: Will not send request because interstitial object has been used」というエラーが表示されます。

別のインタースティシャルを割り当てる場所としては、GADInterstitialDelegateinterstitialDidDismissScreen メソッド内が最適です。そうすることで、前のインタースティシャルの表示が終了したらすぐに次のインタースティシャルの読み込みが開始されるようになります。インタースティシャルの初期化を、そのインタースティシャルのヘルパー メソッドで実行することもおすすめします。

Swift

override func viewDidLoad() {
  super.viewDidLoad()
  interstitial = createAndLoadInterstitial()
}

func createAndLoadInterstitial() -> GADInterstitial {
  var interstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910")
  interstitial.delegate = self
  interstitial.load(GADRequest())
  return interstitial
}

func interstitialDidDismissScreen(_ ad: GADInterstitial) {
  interstitial = createAndLoadInterstitial()
}

Objective-C

- (void)viewDidLoad {
  [super viewDidLoad];
  self.interstitial = [self createAndLoadInterstitial];
}

- (GADInterstitial *)createAndLoadInterstitial {
  GADInterstitial *interstitial =
      [[GADInterstitial alloc] initWithAdUnitID:@"ca-app-pub-3940256099942544/4411468910"];
  interstitial.delegate = self;
  [interstitial loadRequest:[GADRequest request]];
  return interstitial;
}

- (void)interstitialDidDismissScreen:(GADInterstitial *)interstitial {
  self.interstitial = [self createAndLoadInterstitial];
}

前のインタースティシャルの表示が終了したらすぐに次のインタースティシャルがプリロードされるようにすると、アプリの画面が次に切り替わったときにインタースティシャルをあらためて表示できます。

広告イベント

GADInterstitialDelegate を使用すると、ユーザーが広告を閉じたときやアプリを終了したときなどのライフサイクル イベントをリッスンできます。

インタースティシャル イベントを登録する

インタースティシャル広告イベントを登録するには、GADInterstitialDelegate プロトコルを実装しているオブジェクトに、GADInterstitialdelegate プロパティを設定します。通常、インタースティシャル広告を実装するクラスは、デリゲート クラスとしての役割も果たします。その場合は、次のように delegate プロパティを self に設定できます。

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController, GADInterstitialDelegate {

  var interstitial: GADInterstitial!

  override func viewDidLoad() {
    super.viewDidLoad()
    interstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910")
    interstitial.delegate = self
  }
}

Objective-C

#import "GADInterstitial.h"
#import "GADInterstitialDelegate.h"

@interface ViewController () <GADInterstitialDelegate>

@property(nonatomic, strong) GADInterstitial *interstitial;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  self.interstitial = [[GADInterstitial alloc] initWithAdUnitID:"ca-app-pub-3940256099942544/4411468910"];
  self.interstitial.delegate = self;
}

インタースティシャル イベントを実装する

GADInterstitialDelegate の各メソッドは省略可能となっているため、必要なメソッドを実装するだけでかまいません。各メソッドを実装してメッセージのログをコンソールに記録する場合のサンプルを、次に示します。

Swift

/// Tells the delegate an ad request succeeded.
func interstitialDidReceiveAd(_ ad: GADInterstitial) {
  print("interstitialDidReceiveAd")
}

/// Tells the delegate an ad request failed.
func interstitial(_ ad: GADInterstitial, didFailToReceiveAdWithError error: GADRequestError) {
  print("interstitial:didFailToReceiveAdWithError: \(error.localizedDescription)")
}

/// Tells the delegate that an interstitial will be presented.
func interstitialWillPresentScreen(_ ad: GADInterstitial) {
  print("interstitialWillPresentScreen")
}

/// Tells the delegate the interstitial is to be animated off the screen.
func interstitialWillDismissScreen(_ ad: GADInterstitial) {
  print("interstitialWillDismissScreen")
}

/// Tells the delegate the interstitial had been animated off the screen.
func interstitialDidDismissScreen(_ ad: GADInterstitial) {
  print("interstitialDidDismissScreen")
}

/// Tells the delegate that a user click will open another app
/// (such as the App Store), backgrounding the current app.
func interstitialWillLeaveApplication(_ ad: GADInterstitial) {
  print("interstitialWillLeaveApplication")
}

Objective-C

/// Tells the delegate an ad request succeeded.
- (void)interstitialDidReceiveAd:(GADInterstitial *)ad {
  NSLog(@"interstitialDidReceiveAd");
}

/// Tells the delegate an ad request failed.
- (void)interstitial:(GADInterstitial *)ad
    didFailToReceiveAdWithError:(GADRequestError *)error {
  NSLog(@"interstitial:didFailToReceiveAdWithError: %@", [error localizedDescription]);
}

/// Tells the delegate that an interstitial will be presented.
- (void)interstitialWillPresentScreen:(GADInterstitial *)ad {
  NSLog(@"interstitialWillPresentScreen");
}

/// Tells the delegate the interstitial is to be animated off the screen.
- (void)interstitialWillDismissScreen:(GADInterstitial *)ad {
  NSLog(@"interstitialWillDismissScreen");
}

/// Tells the delegate the interstitial had been animated off the screen.
- (void)interstitialDidDismissScreen:(GADInterstitial *)ad {
  NSLog(@"interstitialDidDismissScreen");
}

/// Tells the delegate that a user click will open another app
/// (such as the App Store), backgrounding the current app.
- (void)interstitialWillLeaveApplication:(GADInterstitial *)ad {
  NSLog(@"interstitialWillLeaveApplication");
}

おすすめの方法

インタースティシャル広告が自分のアプリに適しているかどうかをよく見極めましょう。
インタースティシャル広告は、画面の切り替わりがあるアプリに適しています。画像の共有やゲームレベルのクリアなど、アプリ内でのタスクが完了したときに、こうした切り替わりがあります。ユーザーもアクションが中断することを想定しているため、利便性を損なわずにインタースティシャル広告を表示することができます。アプリ操作のどのタイミングでインタースティシャル広告を表示し、ユーザーからどのような反応が得られる可能性があるかをご検討ください。
インタースティシャル広告を表示する際には必ずアクションを一時停止しましょう。
インタースティシャル広告には、テキスト、イメージ、動画など、さまざまな種類があります。アプリにインタースティシャル広告を表示する際は、一部のリソースの使用を停止して、広告でそのリソースを利用できるようにすることも重要です。たとえば、インタースティシャル広告を表示するための呼び出しを行う場合は、アプリで行っている音声出力を一時停止してください。音声出力は interstitialDidDismissScreen イベント ハンドラで再開できます。このハンドラはユーザーが広告の操作を終了すると呼び出されます。また、広告の表示中は、計算の集中処理(ゲームループなど)を一時的に停止することをご検討ください。こうすることで、グラフィックの読み込みが遅れたり、反応が停止したり、動画が途切れたりしなくなります。
十分な読み込み時間を確保しましょう。
インタースティシャル広告の読み込みに時間がかからないようにすることは、適切なタイミングで表示することと同じくらい重要です。presentFromRootViewController を呼び出す前に loadRequest を呼び出して広告の読み込みを事前に完了しておくと、表示の段階で待ち時間が発生しません。
過度に広告を表示しないよう注意しましょう。
インタースティシャル広告の表示頻度を引き上げれば、収益を効果的に増やせるように思えますが、ユーザー エクスペリエンスが損なわれてクリック率が低下する可能性もあります。広告が頻繁に表示されることで、ユーザーがアプリを楽しめなくならないようにしてください。
interstitialDidReceiveAd イベントを使用してインタースティシャルを表示しないようにしましょう。
このイベントを使用すると、ユーザー エクスペリエンスが低下する可能性があります。代わりに、広告を表示する前にプリロードして、GADInterstitialisReady メソッドで、その広告が表示可能な状態になっているかどうかを確認してください。

その他のリソース

GitHub のサンプル

チュートリアル動画シリーズ「Mobile Ads Garage」

成功事例

今後の流れ