リワード広告(従来の API)

リワード広告は、ユーザーが広告を操作することと引き換えにアプリ内で報酬を獲得できる広告です。このガイドでは、AdMob のリワード広告を iOS アプリに組み込む方法を説明します。次の成功事例もご覧ください。事例紹介 1事例紹介 2

前提条件

リワード広告を作成する

リワード広告のリクエストと表示には、GADRewardedAd オブジェクトを使います。このオブジェクトを使う最初のステップは、オブジェクトをインスタンス化し、広告ユニット ID を設定することです。次の例では、UIViewControllerviewDidLoad: メソッドで GADRewardedAd を作成する方法を示します。

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController {
/// The rewarded video ad.
  var rewardedAd: GADRewardedAd?
  override func viewDidLoad() {
    super.viewDidLoad()
    rewardedAd = GADRewardedAd(adUnitID: "ca-app-pub-3940256099942544/1712485313")
  }
}

Objective-C

@import GoogleMobileAds;
@import UIKit;

@interface ViewController ()

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController
- (void)viewDidLoad {
  [super viewDidLoad];

  self.rewardedAd = [[GADRewardedAd alloc]
      initWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"];
}

必ずテスト広告でテストする

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

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

ca-app-pub-3940256099942544/1712485313

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

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

広告を読み込む

リワード広告を読み込むには、GADRewardedAd オブジェクトの loadRequest:completionHandler: を呼び出します。

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController, GADRewardedAdDelegate {
  /// The rewarded video ad.
  var rewardedAd: GADRewardedAd?
  override func viewDidLoad() {
    super.viewDidLoad()
    rewardedAd = GADRewardedAd(adUnitID: "ca-app-pub-3940256099942544/1712485313")
    rewardedAd?.load(GADRequest()) { error in
      if let error = error {
        // Handle ad failed to load case.
      } else {
        // Ad successfully loaded.
      }
    }
  }

Objective-C

@import GoogleMobileAds;
@import UIKit;

@interface ViewController ()

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  self.rewardedAd = [[GADRewardedAd alloc]
      initWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"];

  GADRequest *request = [GADRequest request];
  [self.rewardedAd loadRequest:request completionHandler:^(GADRequestError * _Nullable error) {
    if (error) {
      // Handle ad failed to load case.
    } else {
      // Ad successfully loaded.
    }
  }];
}

このコードは、指定された GADRequest と完了ブロックを使ってリワード広告を読み込みます。広告リクエストが正常に完了すると、nil の GADRequestError パラメータを伴って完了ブロックが実行されます。広告の読み込みが失敗すると、nil 以外のエラー オブジェクトでエラー情報が提供されます。

広告を表示する

リワード広告をユーザーに表示する前に、リワード広告のコンテンツを報酬と引き換えに視聴するかどうか、明確な選択肢を示す必要があります。リワード広告は、必ずユーザーの許可を受けてから表示しなければなりません。

リワード広告を表示するには、広告の読み込みが完了したことを GADRewardedAdisReady プロパティで確認してから、presentFromRootViewController:delegate: を呼び出します。この手順を UIViewController のアクション メソッドの 1 つで行う方法を次の例で示します。

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController, GADRewardedAdDelegate {
  /// The rewarded video ad.
  var rewardedAd: GADRewardedAd?
  ...
  @IBAction func doSomething(sender: UIButton) {
    if rewardedAd?.isReady == true {
       rewardedAd?.present(fromRootViewController: self, delegate:self)
    }
  }
}

Objective-C

@import GoogleMobileAds;

@import UIKit;

@interface ViewController () <GADRewardedAdDelegate>

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

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

広告イベント通知を受け取る

presentFromRootViewController:delegate: メソッドで指定された GADRewardedAdDelegate は、リワード広告のイベントが発生すると呼び出されます。GADRewardedAdDelegate の各メソッドは、それぞれがリワード広告のライフサイクルで生じるイベントに対応しています。rewardedAd:userDidEarnReward: メソッドは必ず実装する必要があります。クラスの他のメソッドはすべてオプションであるため、必要なメソッドだけを実装できます。以下のサンプルでは、各メソッドを実装して、コンソールにログとしてメッセージを出力しています。

Swift

/// Tells the delegate that the user earned a reward.
func rewardedAd(_ rewardedAd: GADRewardedAd, userDidEarn reward: GADAdReward) {
  print("Reward received with currency: \(reward.type), amount \(reward.amount).")
}
/// Tells the delegate that the rewarded ad was presented.
func rewardedAdDidPresent(_ rewardedAd: GADRewardedAd) {
  print("Rewarded ad presented.")
}
/// Tells the delegate that the rewarded ad was dismissed.
func rewardedAdDidDismiss(_ rewardedAd: GADRewardedAd) {
  print("Rewarded ad dismissed.")
}
/// Tells the delegate that the rewarded ad failed to present.
func rewardedAd(_ rewardedAd: GADRewardedAd, didFailToPresentWithError error: Error) {
  print("Rewarded ad failed to present.")
}

Objective-C

/// Tells the delegate that the user earned a reward.
- (void)rewardedAd:(GADRewardedAd *)rewardedAd userDidEarnReward:(GADAdReward *)reward {
  // TODO: Reward the user.
  NSLog(@"rewardedAd:userDidEarnReward:");
}

/// Tells the delegate that the rewarded ad was presented.
- (void)rewardedAdDidPresent:(GADRewardedAd *)rewardedAd {
  NSLog(@"rewardedAdDidPresent:");
}

/// Tells the delegate that the rewarded ad failed to present.
- (void)rewardedAd:(GADRewardedAd *)rewardedAd didFailToPresentWithError:(NSError *)error {
  NSLog(@"rewardedAd:didFailToPresentWithError");
}

/// Tells the delegate that the rewarded ad was dismissed.
- (void)rewardedAdDidDismiss:(GADRewardedAd *)rewardedAd {
  NSLog(@"rewardedAdDidDismiss:");
}

GADRewardedAdDelegate を使用して次のリワード広告をプリロードする

GADRewardedAd は使い捨てオブジェクトです。つまり、リワード広告を一度表示すると、このオブジェクトを使って他の広告を読み込むことはできません。他のリワード広告をリクエストするには、新しい GADRewardedAd オブジェクトを作成します。

おすすめの方法は、GADRewardedAdDelegaterewardedAdDidDismiss: メソッドで別のリワード広告を読み込んでおき、前のリワード広告の表示が終了したらすぐに次のリワード広告の読み込みを開始できるようにすることです。次の例をご覧ください。

Swift

override func viewDidLoad() {
  super.viewDidLoad()
  rewardedAd = createAndLoadRewardedAd()
}

func createAndLoadRewardedAd() {
  rewardedAd = GADRewardedAd(adUnitID: "ca-app-pub-3940256099942544/1712485313")
  rewardedAd?.load(GADRequest()) { error in
    if let error = error {
      print("Loading failed: \(error)")
    } else {
      print("Loading Succeeded")
    }
  }
  return rewardedAd
}

func rewardedAdDidDismiss(_ rewardedAd: GADRewardedAd) {
  rewardedAd = createAndLoadRewardedAd()
}

Objective-C

- (void)viewDidLoad {
  [super viewDidLoad];
  self.rewardedAd = [self createAndLoadRewardedAd];
}

- (GADRewardedAd *)createAndLoadRewardedAd {
  GADRewardedAd *rewardedAd = [[GADRewardedAd alloc]
      initWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"];
  GADRequest *request = [GADRequest request];
  [rewardedAd loadRequest:request completionHandler:^(GADRequestError * _Nullable error) {
    if (error) {
      // Handle ad failed to load case.
    } else {
      // Ad successfully loaded.
    }
  }];
  return rewardedAd;
}

- (void)rewardedAdDidDismiss:(GADRewardedAd *)rewardedAd {
  self.rewardedAd = [self createAndLoadRewardedAd];
}

複数のリワード広告を読み込む

複数のリワード広告を読み込むには、広告ごとにリワード広告のオブジェクトを作成するおよび広告を読み込むで説明されている手順を行います。次のコード スニペットは、2 つの異なる広告プレースメントに 2 つのリワード広告を読み込む方法を示しています。

Swift

override func viewDidLoad() {
  super.viewDidLoad()
  rewardedAd1 = createAndLoadRewardedAd("first-ad-unit-id")
  rewardedAd2 = createAndLoadRewardedAd("second-ad-unit-id")
}

func createAndLoadRewardedAd(adUnitId) {
  rewardedAd = GADRewardedAd(adUnitID: adUnitId)
  rewardedAd?.load(GADRequest()) { error in
    if let error = error {
      print("Loading failed: \(error)")
    } else {
      print("Loading Succeeded")
    }
  }
  return rewardedAd
}

Objective-C

- (void)viewDidLoad {
  [super viewDidLoad];
  GADRewardedAd *gameOverRewardedAd = [self
    createAndLoadRewardedAdForAdUnit:@"ca-app-pub-3940256099942544/1712485313"];
  GADRewardedAd *extraCoinsRewardedAd = [self
    createAndLoadRewardedAdForAdUnit:@"ca-app-pub-3940256099942544/1712485313"];
}

- (GADRewardedAd *)createAndLoadRewardedAdForAdUnit:(NSString *) adUnitId {
  GADRewardedAd *rewardedAd = [[GADRewardedAd alloc] initWithAdUnitID:adUnitId];
  GADRequest *request = [GADRequest request];
  [rewardedAd loadRequest:request completionHandler:^(GADRequestError * _Nullable error) {
    if (error) {
      // Handle ad failed to load case.
    } else {
      // Ad successfully loaded.
    }
  }];
  return rewardedAd;
}

よくある質問

GADRewardedAd の報酬の詳細情報を取得することはできますか?
はい。userDidEarnReward コールバックが呼び出される前に報酬値を確認する必要がある場合、GADRewardedAd では reward プロパティを使って、広告の読み込み後に報酬値の情報を取得することができます。
初期化の呼び出しでタイムアウトは発生しますか?
Google Mobile Ads SDK では、10 秒が経過すると、メディエーション ネットワークの初期化が完了していなくても、startWithCompletionHandler: メソッドで指定されている GADInitializationCompletionHandler が呼び出されます。
初期化コールバックを取得したときに対応準備が完了していないメディエーション ネットワークはどうなりますか?

広告は、GADInitializationCompletionHandler 内で読み込むことが推奨されています。メディエーション ネットワークの対応準備が完了していなくても、Google Mobile Ads SDK はそのネットワークに対して広告を要求します。そのため、いったんタイムアウトされても、その後に初期化が完了すれば、メディエーション ネットワークはそのセッション中に発生する後続の広告リクエストに対応することができます。

GADMobileAds.initializationStatus を呼び出せば、アプリ セッションの間、すべてのアダプタの初期化ステータスを継続的にポーリングすることができます。

特定のメディエーション ネットワークの対応準備が完了していない理由を確認するには、どうすればよいですか?

GADAdapterStatus オブジェクトの description プロパティを参照すると、アダプタが広告リクエストの処理に対応できない理由を確認できます。