このドキュメントが更新されました。
日本語への翻訳がまだ完了していません。
英語の最終更新: 2021/12/24

iOSアプリに動画リワード広告を追加する

動画リワード広告は、利用者が動画広告を視聴する引き換えに、仮想通貨、アプリ内アイテム、限定コンテンツといった何らかの特典を得られる、フルスクリーンの広告サービスです。広告の長さは15~30秒で、スキップはできず、コールトゥアクションが備わったエンドカードが表示されます。動画の視聴が完了すると、提示したリワードを利用者に付与するためのコールバックが届きます。

以下に、iOSでAudience Networkから動画リワード広告を実装する方法を示します。

動画リワードはiOS 9以上でしかサポートされていないことに注意してください。

SDKの設定

Audience Network動画リワードフォーマットが、公開SDKに含まれるようになりました。動画リワード広告はまもなく、すべてのゲームアプリで利用可能になります。最新のSDKを使用しているのに、収益化マネージャに動画リワードが表示されない場合は、今すぐ適用してください。

続行する前に、必ずAudience Networkのスタートガイドのスタートガイドすべてに目を通しておいてください。

実装

次に、動画コントローラーヘッダーファイル(Swiftユーザーの場合は、Swiftファイル)で、FBAudienceNetworkをインポートし、FBRewardedVideoAdDelegateプロトコルへの適合性を宣言し、動画リワード広告ユニットのインスタンス変数を追加します

import UIKit
import FBAudienceNetwork

class ViewController: UIViewController, FBRewardedVideoAdDelegate {
  private var rewardedVideoAd: FBRewardedVideoAd?
}
#import <UIKit/UIKit.h>
@import FBAudienceNetwork;

@interface ViewController : UIViewController <FBRewardedVideoAdDelegate>

@property (nonatomic, strong) FBRewardedVideoAd *rewardedVideoAd;

@end

動画リワードオブジェクトを初期化し、動画クリエイティブを表示する前にそれをキャシュする関数を、ビューコントローラーに追加します

override func viewDidLoad() {
  super.viewDidLoad()
  
  // Instantiate an rewarded video object.
  // NOTE: the placement ID will eventually identify this as your app. You can ignore it while you are testing
  // and replace it later when you have signed up.
  // While you are using this temporary code you will only get test ads and if you release
  // your code like this to the App Store your users will not receive ads (you will get a 'No Fill' error).
  let rewardedVideoAd = FBRewardedVideoAd(placementID: "YOUR_PLACEMENT_ID")
  rewardedVideoAd.delegate = self
  
  // For auto play video ads, it's recommended to load the ad at least 30 seconds before it is shown
  rewardedVideoAd.load()
  
  self.rewardedVideoAd = rewardedVideoAd
}
- (void) viewDidLoad 
{
  [super viewDidLoad];
  // Instantiate a rewarded video ad object. 
  // NOTE: the placement ID will eventually identify this as your app. You can ignore it while 
  // you are testing and replace it later when you have signed up.
  // While you are using this temporary code you will only get test ads and if you release
  // your code like this to the App Store your users will not receive ads (you will get a 'No Fill' error).
  self.rewardedVideoAd = [[FBRewardedVideoAd alloc] initWithPlacementID:@"YOUR_PLACEMENT_ID"];
  self.rewardedVideoAd.delegate = self;

  // For auto play video ads, it's recommended to load the ad at least 30 seconds before it is shown
  [self.rewardedVideoAd loadAd];
}

YOUR_PLACEMENT_IDで表示されるIDは、テスト目的だけの一時的なIDです。

この一時的なIDを実際のコードで使用しても、ユーザーは広告を受け取りません(No Fillエラーを受け取ります)。テスト後にここに戻って、一時的なIDを実際の配置IDに置き換えてください。

実際の配置IDの生成方法については、Audience Network設定をご覧ください。

これで広告を読み込むコードが追加され、さまざまなイベントを処理する関数を追加できます。

:

  • rewardedVideoAdDidLoadにより、広告がキャッシュされて広告の表示の準備ができると、アプリがそのことを認識できるようになります
  • rewardedVideoAdVideoCompleteにより、動画視聴後にユーザーにリワードを提供するタイミングを知ることができます
func rewardedVideoAdDidLoad(_ rewardedVideoAd: FBRewardedVideoAd) {
  print("Video ad is loaded and ready to be displayed")
}

func rewardedVideoAd(_ rewardedVideoAd: FBRewardedVideoAd, didFailWithError error: Error) {
  print("Rewarded video ad failed to load")
}

func rewardedVideoAdDidClick(_ rewardedVideoAd: FBRewardedVideoAd) {
  print("Video ad clicked")
}

func rewardedVideoAdDidClose(_ rewardedVideoAd: FBRewardedVideoAd) {
  print("Rewarded Video ad closed - this can be triggered by closing the application, or closing the video end card")
}

func rewardedVideoAdVideoComplete(_ rewardedVideoAd: FBRewardedVideoAd) {
  print("Rewarded Video ad video completed - this is called after a full video view, before the ad end card is shown. You can use this event to initialize your reward")
}
- (void)rewardedVideoAdDidLoad:(FBRewardedVideoAd *)rewardedVideoAd
{
  NSLog(@"Video ad is loaded and ready to be displayed");
}
    
- (void)rewardedVideoAd:(FBRewardedVideoAd *)rewardedVideoAd didFailWithError:(NSError *)error
{
  NSLog(@"Rewarded video ad failed to load");
}

- (void)rewardedVideoAdDidClick:(FBRewardedVideoAd *)rewardedVideoAd
{
  NSLog(@"Video ad clicked");
}
    
- (void)rewardedVideoAdDidClose:(FBRewardedVideoAd *)rewardedVideoAd
{
  NSLog(@"Rewarded Video ad closed - this can be triggered by closing the application, or closing the video end card");
}

- (void)rewardedVideoAdVideoComplete:(FBRewardedVideoAd *)rewardedVideoAd;
{
  NSLog(@"Rewarded Video ad video completed - this is called after a full video view, before the ad end card is shown. You can use this event to initialize your reward");
}

最後に、動画リワード広告を表示する準備ができたら、自身のリワード機能内で次のコードを呼び出すことができます。

private func showRewardedVideoAd() {
  guard let rewardedVideoAd = rewardedVideoAd, rewardedVideoAd.isAdValid else {
    return
  }
  rewardedVideoAd.show(fromRootViewController: self)
}
- (void)showRewardedVideoAd
{
  if (self.rewardedVideoAd && self.rewardedVideoAd.isAdValid) {
    [self.rewardedVideoAd showAdFromRootViewController:self];
  }
}

動画リワード広告を表示するメソッドには、プレゼンテーションのアニメーション再生を行うための、animatedブーリアンフラグがあります。デフォルトではYES / trueに設定されていますが、オーバーライドすることもできます。

シミュレーターで実行している場合、デフォルトでテスト広告が表示されます。テスト広告をデバイスで有効にするには、広告の読み込みの前に次のコードを追加します: AdSettings.addTestDevice(HASHED ID)。デバイスで広告の読み込みを初めてリクエストする際にlog catに出力される、ハッシュ化されたIDを使用してください。

必要に応じて、動画リワード広告が閉じられた場合や動画リワードインプレッションがキャプチャされた場合に処理を実行する、以下の別の関数を追加することもできます。

func rewardedVideoAdWillClose(_ rewardedVideoAd: FBRewardedVideoAd) {
  print("The user clicked on the close button, the ad is just about to close")
}

func rewardedVideoAdWillLogImpression(_ rewardedVideoAd: FBRewardedVideoAd) {
  print("Rewarded Video impression is being captured")
}
- (void)rewardedVideoAdWillClose:(FBRewardedVideoAd *)rewardedVideoAd
{
  NSLog(@"The user clicked on the close button, the ad is just about to close");
}

- (void)rewardedVideoAdWillLogImpression:(FBRewardedVideoAd *)rewardedVideoAd
{
  NSLog(@"Rewarded Video impression is being captured");
}

サーバー側でのリワード確認

概要

利用者のリワードをサーバー側で管理する場合に備えて、Facebookでは、検証技術を使用してこれらの処理を安全に実行するためのソリューションを用意しています。Facebookのサーバーが指定のhttpsエンドポイントとやり取りして各広告インプレッションを確認し、リワードを提供するかどうかを確認します。

  1. Audience Network SDKでは、次のパラメーターを使用して動画リワード広告をリクエストします。
    • Facebook Audience Network配置ID
    • 固有ユーザーID - ユニークユーザーを特定するために使用する属性です。例: 数値によるID
    • リワード値 - ユーザーに提供するリワードの値です。例えば、100コインを、エンドポイントとApp Secretと一緒に指定します。
  2. サーバーはリクエストを受け取り次第確認し、次のように応答します。
    • 200の応答: リクエストは有効であり、リワードを提供する必要があります
    • 200でない応答: リクエストが有効でないため、リワードを提供する必要はありません
  3. 動画の視聴が完了すると、エンドカードが表示され、次のいずれかのイベントが開始されます。
    • onRewardServerSuccess - ステップ3で200の応答を受け取った場合にのみトリガーされます。
    • onRewardServerFailed - ステップ3で200でない応答を受け取った場合にトリガーされます。

以下は、Facebookのサーバーからの、パブリッシャーエンドポイントに動作させるURLの例です。

https://www.your_end_point.com/?token=APP_SECRET&puid=USER_ID&pc=REWARD_ID&ptid=UNIQUE_TRANSACTION_ID

この機能を有効にするには、パブリッシャーのエンドポイントをFacebookの担当者にお知らせください。

SDKの実装

リワードデータ(USER_IDCURRENCY)は、loadAdメソッドの前後どちらでも設定できます。以下のコードスニペットにこの両方を示します。

let rewardedVideoAd = FBRewardedVideoAd(placementID: "YOUR_PLACEMENT_ID")
rewardedVideoAd.delegate = self

// Set the rewarded ad data before or after `load` method is called
rewardedVideoAd.setRewardDataWithUserID("USER_ID", withCurrency: "CURRENCY")

// For auto play video ads, it's recommended to load the ad at least 30 seconds before it is shown
rewardedVideoAd.load()

self.rewardedVideoAd = rewardedVideoAd
self.rewardedVideoAd = [[FBRewardedVideoAd alloc] initWithPlacementID:@"YOUR_PLACEMENT_ID"];
self.rewardedVideoAd.delegate = self;

// Set the rewarded ad data before or after `loadAd` method is called
[self.rewardedVideoAd setRewardDataWithUserID:@"USER_ID" withCurrency:@"CURRENCY"];

[self.rewardedVideoAd loadAd];

上記のFBRewardedVideoAdDelegate内の関数に加えて、次のイベントを使用してアプリ内でのリワード付与の処理を行います。次の関数は前述のイベントとともに使用できます。

func rewardedVideoAdServerRewardDidFail(_ rewardedVideoAd: FBRewardedVideoAd) {
  print("Rewarded video ad not validated, or no response from server")
}

func rewardedVideoAdServerRewardDidSucceed(_ rewardedVideoAd: FBRewardedVideoAd) {
  print("Rewarded video ad validated by server")
}
- (void)rewardedVideoAdServerRewardDidSucceed:(FBRewardedVideoAd *)rewardedVideoAd
{
  NSLog(@"Rewarded video ad validated by server");
}

- (void)rewardedVideoAdServerRewardDidFail:(FBRewardedVideoAd *)rewardedVideoAd
{
  NSLog(@"Rewarded video ad not validated, or no response from server");
}

サーバー確認のコールバックは、利用者がエンドカードを閉じた後にのみ発生することに注意してください。これらのコールバックのいずれかを受け取るまでは、動画リワードオブジェクトの割り当てを解除しないでください。

Next Steps