リワード広告 - 新しい API(ベータ版)

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

前提条件

  • Google Mobile Ads SDK 7.42.2 以降

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

モバイル広告を初期化する

広告を読み込む前に、GADInitializationCompletionHandler を指定した startWithCompletionHandler: を呼び出して、アプリで Mobile Ads SDK を初期化します。この処理は 1 回だけ行います(アプリの起動時に行うのが理想的です)。

@import GoogleMobileAds;
...
@implementation AppDelegate

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  // Initialize Google Mobile Ads SDK
  [[GADMobileAds sharedInstance]
      startWithCompletionHandler:^(GADInitializationStatus *_Nonnull status){
          // TODO: Load an ad. Optionally check initialization status.
      }];

  return YES;
}

@end

アプリがメディエーションを使用する場合、この呼び出しによってメディエーション パートナーの SDK も初期化されます。

初期化が完了すると、指定された GADInitializationCompletionHandler が実行されます。引数 GADInitializationStatus は Google Mobile Ads SDK の初期化ステータスのスナップショット(イミュータブル)です。

GADInitializationStatus オブジェクトの adapterStatusesByClassName プロパティは、アダプタのクラス名をキーとして Google Mobile Ads SDK で使用できる各メディエーション広告ネットワークの初期化ステータスを提供します。次のコードは、Google Mobile Ads SDK を初期化し、サンプル広告ネットワークの初期化ステータスを確認する方法を示しています。

@import GoogleMobileAds;
...
@implementation AppDelegate

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  // Initialize Google Mobile Ads SDK
  [[GADMobileAds sharedInstance]
      startWithCompletionHandler:^(GADInitializationStatus *_Nonnull status) {
        GADAdapterInitializationState adapterState =
            status.adapterStatusesByClassName[@"SampleAdapter"].state;

        if (adapterState == GADAdapterInitializationStateReady) {
          // Sample adapter was successfully initialized.
        } else {
          // Sample adapter is not ready.
        }
      }];

  return YES;
}

@end

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

リワード広告は、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];
  [self.rewardedAd loadRequest:request completionHandler:^(GADRequestError * _Nullable error) {
    if (error) {
      // Handle ad failed to load case.
    } else {
      // Ad successfully loaded.
    }
  }];
  return rewardedAd;
}

よくある質問

初期化の呼び出しでタイムアウトは発生しますか?
Google Mobile Ads SDK では、10 秒が経過すると、メディエーション ネットワークの初期化が完了していなくても、startWithCompletionHandler: メソッドで指定されている GADInitializationCompletionHandler が呼び出されます。
初期化コールバックを取得したときに対応準備が完了していないメディエーション ネットワークはどうなりますか?

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

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

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

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

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。