リワード広告

リワード広告は、ユーザーが広告を操作することと引き換えに、アプリ内で報酬を獲得できる広告です。このガイドでは、AdMob のリワード広告を iOS アプリに組み込む方法について説明します。

前提条件

  • Google Mobile Ads SDK 7.42.2 以降

  • Google Mobile Ads SDK がインポート済みであること(単独または Firebase の一部として)

リワード広告のオブジェクトを作成する

リワード広告は、GADRewardedAd オブジェクトによってリクエストされ、表示されます。このオブジェクトを使用するには、まずオブジェクトをインスタンス化し、広告ユニット ID を設定する必要があります。たとえば、UIViewControllerviewDidLoad: メソッドを使って次のように GADRewardedAd を作成できます。

@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: を呼び出します。

@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 と完了ブロックが指定されているリワード広告を読み込みます。広告リクエストが正常に完了すると、GADRequestError パラメータは nil になり、完了ブロックが実行されます。広告の読み込みが失敗すると、エラー情報を提供する非 nil エラー オブジェクトが生成されます。

広告を表示する

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

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

@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: メソッドは必ず実装する必要があります。クラスの他のメソッドはすべてオプションであるため、必要なメソッドだけを実装できます。以下のサンプルでは、各メソッドを実装して、コンソールにログとしてメッセージを出力しています。

/// 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: メソッドで別のリワード広告を読み込んでおき、前のリワード広告の表示が終了したらすぐに次のリワード広告の読み込みを開始できるようにすることです。

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

- (GADRewardedAd *)createAndLoadRewardedAd {
  GADRewardedAd *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.
    }
  }];
  return rewardedAd;
}

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

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

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

- (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 プロパティを参照すると、アダプタが広告リクエストの処理に対応できない理由を確認できます。