IMA DAI SDK スタートガイド

IMA SDK を使用すると、マルチメディア広告をウェブサイトやアプリに簡単に統合できます。IMA SDK は、 VAST 準拠の任意の広告サーバーから広告をリクエストし、アプリ内の広告再生を管理できます。IMA DAI SDK を使用すると、アプリは広告とコンテンツ動画(VOD またはライブ コンテンツ)のストリーム リクエストを行います。SDK は統合された動画ストリームを返すため、アプリ内で広告動画とコンテンツ動画を切り替える必要はありません。

関心のある DAI ソリューションを選択する

フルサービス DAI

このガイドでは、IMA DAI SDK をシンプルな動画プレーヤー アプリに統合する方法について説明します。統合済みのサンプルを表示または確認するには、GitHub から BasicExample をダウンロードしてください。

IMA DAI の概要

IMA DAI の実装には、このガイドで説明するように、4 つの主要な SDK コンポーネントが関与します。

  • IMAAdDisplayContainer - 動画再生要素の上に配置され、広告 UI 要素を格納するコンテナ オブジェクト。
  • IMAAdsLoader - ストリームをリクエストし、ストリーム リクエスト レスポンス オブジェクトによってトリガーされたイベントを処理するオブジェクト。インスタンス化すべき広告ローダは 1 つだけです。この広告ローダは、アプリの存続期間全体で再利用できます。
  • IMAStreamRequest - IMAVODStreamRequest または IMALiveStreamRequest のいずれか。ストリーム リクエストを定義するオブジェクト。ストリーム リクエストは、ビデオ オンデマンドまたはライブ配信のいずれかです。リクエストでは、コンテンツ ID のほか、API キーまたは認証トークンなどのパラメータを指定します。
  • IMAStreamManager - ダイナミック広告挿入ストリームと DAI バックエンドとのインタラクションを処理するオブジェクト。ストリーム マネージャーは、トラッキング ピングも処理し、ストリーム イベントと広告イベントをパブリッシャーに転送します。

前提条件

始める前に、次のものが必要になります。

  • Xcode 13 以降
  • CocoaPods(推奨)、Swift パッケージ マネージャー、または iOS 用 IMA DAI SDK のダウンロード コピー

また、IMA SDK からストリームをリクエストするために使用するパラメータも必要です。リクエスト パラメータの例については、サンプル ストリームをご覧ください。

ライブ配信パラメータ
アセットキー Google アド マネージャーでライブ配信を識別するアセットキー。
例: c-rArva4ShKVIAkNfy6HUQ
VOD ストリーム パラメータ
コンテンツ ソース ID Google アド マネージャーのコンテンツ ソース ID。
例: 2548831
動画 ID Google アド マネージャーの動画 ID。
例: tears-of-steel

新しい Xcode プロジェクトを作成する

Xcode で、Objective-C を使用して新しい iOS プロジェクトを作成します。プロジェクト名には BasicExample を使用します。

IMA DAI SDK を Xcode プロジェクトに追加する

次の 3 つの方法のいずれかを使用して IMA DAI SDK をインストールします。

CocoaPods を使用して SDK をインストールする(推奨)

CocoaPods は Xcode プロジェクトの依存関係マネージャーであり、IMA DAI SDK のインストールに推奨される方法です。CocoaPods のインストールまたは使用の詳細については、CocoaPods のドキュメントをご覧ください。CocoaPods をインストールしたら、次の手順で IMA DAI SDK をインストールします。

  1. BasicExample.xcodeproj ファイルと同じディレクトリに Podfile というテキスト ファイルを作成し、次の構成を追加します。

    source 'https://github.com/CocoaPods/Specs.git'
    
    platform :ios, '14'
    
    target 'BasicExample' do
      pod 'GoogleAds-IMA-iOS-SDK', '~> 3.23.0'
    end
    
  2. Podfile が含まれているディレクトリから、次のコマンドを実行します。

    pod install --repo-update`
    
  3. BasicExample.xcworkspace ファイルを開き、BasicExamplePods(CocoaPods によってインストールされた依存関係)の 2 つのプロジェクトが含まれていることを確認して、インストールが正常に完了したことを確認します。

Swift Package Manager を使用して SDK をインストールする

Interactive Media Ads SDK はバージョン 3.18.4 以降で Swift Package Manager に対応しています。Swift パッケージをインポートする手順は次のとおりです。

  1. Xcode で [File] > [Add Packages] に移動し、IMA DAI SDK Swift パッケージをインストールします。

  2. 表示されたプロンプトで、IMA DAI SDK Swift パッケージの GitHub リポジトリ(下記)を検索します。

    https://github.com/googleads/swift-package-manager-google-interactive-media-ads-ios
    
  3. 使用する IMA DAI SDK Swift パッケージのバージョンを選択します。新しいプロジェクトの場合は [Up to Next Major Version] を選択することをおすすめします。

完了すると、Xcode はパッケージの依存関係を解決し、バックグラウンドでダウンロードします。パッケージの依存関係の追加について詳しくは、Apple の記事を参照してください。

SDK を手動でダウンロードしてインストールする

Swift Package Manager または CocoaPods を使用しない場合は、IMA DAI SDK をダウンロードして、手動でプロジェクトに追加できます。

シンプルな動画プレーヤーを作成する

UI ビューにラップされた AV プレーヤーを使用して、メイン ビュー コントローラに動画プレーヤーを実装します。IMA SDK は、UI ビューを使用して広告 UI 要素を表示します。

#import "ViewController.h"

#import <AVKit/AVKit.h>

/// Content URL.
static NSString *const kBackupContentUrl =
    @"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8";

@interface ViewController ()
/// Play button.
@property(nonatomic, weak) IBOutlet UIButton *playButton;

@property(nonatomic, weak) IBOutlet UIView *videoView;
/// Video player.
@property(nonatomic, strong) AVPlayer *videoPlayer;
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  self.view.backgroundColor = [UIColor blackColor];

  // Load AVPlayer with the path to your content.
  NSURL *contentURL = [NSURL URLWithString:kBackupContentUrl];
  self.videoPlayer = [AVPlayer playerWithURL:contentURL];

  // Create a player layer for the player.
  AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.videoPlayer];

  // Size, position, and display the AVPlayer.
  playerLayer.frame = self.videoView.layer.bounds;
  [self.videoView.layer addSublayer:playerLayer];
}

- (IBAction)onPlayButtonTouch:(id)sender {
  [self.videoPlayer play];
  self.playButton.hidden = YES;
}

@end

広告ローダを初期化する

IMA SDK をビュー コントローラにインポートし、IMAAdsLoaderDelegate プロトコルと IMAStreamManagerDelegate プロトコルを実装して、広告ローダーとストリーム マネージャーのイベントを処理します。

次のプライベート プロパティを追加して、重要な IMA SDK コンポーネントを保存します。

  • IMAAdsLoader - アプリのライフサイクル全体でストリーム リクエストを管理します。
  • IMAAdDisplayContainer - 広告のユーザー インターフェース要素の挿入と管理を処理します。
  • IMAAVPlayerVideoDisplay - IMA SDK とメディア プレーヤーの間で通信し、タイミング付きメタデータを処理します。
  • IMAStreamManager - ストリームの再生を管理し、広告関連のイベントを発生させます。

ビューの読み込み後に、広告ローダ、広告表示コンテナ、動画表示を初期化します。

@import GoogleInteractiveMediaAds;

// ...

@interface ViewController () <IMAAdsLoaderDelegate, IMAStreamManagerDelegate>
/// The entry point for the IMA DAI SDK to make DAI stream requests.
@property(nonatomic, strong) IMAAdsLoader *adsLoader;
/// The container where the SDK renders each ad's user interface elements and companion slots.
@property(nonatomic, strong) IMAAdDisplayContainer *adDisplayContainer;
/// The reference of your video player for the IMA DAI SDK to monitor playback and handle timed
/// metadata.
@property(nonatomic, strong) IMAAVPlayerVideoDisplay *imaVideoDisplay;
/// References the stream manager from the IMA DAI SDK after successful stream loading.
@property(nonatomic, strong) IMAStreamManager *streamManager;

// ...

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  // ...

  self.adsLoader = [[IMAAdsLoader alloc] initWithSettings:nil];
  self.adsLoader.delegate = self;

  // Create an ad display container for rendering each ad's user interface elements and companion
  // slots.
  self.adDisplayContainer =
      [[IMAAdDisplayContainer alloc] initWithAdContainer:self.videoView
                                          viewController:self
                                          companionSlots:nil];

  // Create an IMAAVPlayerVideoDisplay to give the SDK access to your video player.
  self.imaVideoDisplay = [[IMAAVPlayerVideoDisplay alloc] initWithAVPlayer:self.videoPlayer];
}

ストリーム リクエストを行う

ユーザーが再生ボタンを押すと、新しいストリーミング リクエストを行います。ライブ配信には IMALiveStreamRequest クラスを使用します。VOD ストリームの場合は、IMAVODStreamRequest クラスを使用します。

ストリーム リクエストには、ストリーム パラメータと、広告ディスプレイ コンテナと動画ディスプレイへの参照が必要です。

- (IBAction)onPlayButtonTouch:(id)sender {
  [self requestStream];
  self.playButton.hidden = YES;
}

- (void)requestStream {
  // Create a stream request. Use one of "Live stream request" or "VOD request", depending on your
  // type of stream.
  IMAStreamRequest *request;
  // Switch this variable to NO to make a VOD request.
  BOOL useLiveStream = YES;
  if (useLiveStream) {
    // Live stream request. Replace the asset key with your value.
    request = [[IMALiveStreamRequest alloc] initWithAssetKey:@"c-rArva4ShKVIAkNfy6HUQ"
                                          adDisplayContainer:self.adDisplayContainer
                                                videoDisplay:self.imaVideoDisplay
                                                 userContext:nil];
  } else {
    // VOD request. Replace the content source ID and video ID with your values.
    request = [[IMAVODStreamRequest alloc] initWithContentSourceID:@"2548831"
                                                           videoID:@"tears-of-steel"
                                                adDisplayContainer:self.adDisplayContainer
                                                      videoDisplay:self.imaVideoDisplay
                                                       userContext:nil];
  }
  [self.adsLoader requestStreamWithRequest:request];
}

ストリーム読み込みイベントをリッスンする

IMAAdsLoader クラスは、ストリーム リクエストの初期化が成功した場合または失敗した場合に、IMAAdsLoaderDelegate メソッドを呼び出します。

adsLoadedWithData デリゲート メソッドで、IMAStreamManagerDelegate を設定し、ストリーム マネージャーを初期化します。初期化時に、ストリーム マネージャーが再生を開始します。

failedWithErrorData デリゲート メソッドで、エラーをログに記録します。必要に応じて、バックアップ ストリームを再生します。DAI のベスト プラクティスをご覧ください。

- (void)adsLoader:(IMAAdsLoader *)loader adsLoadedWithData:(IMAAdsLoadedData *)adsLoadedData {
  NSLog(@"Stream created with: %@.", adsLoadedData.streamManager.streamId);
  self.streamManager = adsLoadedData.streamManager;
  self.streamManager.delegate = self;
  [self.streamManager initializeWithAdsRenderingSettings:nil];
}

- (void)adsLoader:(IMAAdsLoader *)loader failedWithErrorData:(IMAAdLoadingErrorData *)adErrorData {
  // Log the error and play the content.
  NSLog(@"AdsLoader error, code:%ld, message: %@", adErrorData.adError.code,
        adErrorData.adError.message);
  [self.videoPlayer play];
}

広告イベントをリッスンする

IMAStreamManagerIMAStreamManagerDelegate メソッドを呼び出して、ストリーム イベントとエラーをアプリに渡します。

この例では、メインの広告イベントをコンソールに記録します。

- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdEvent:(IMAAdEvent *)event {
  NSLog(@"Ad event (%@).", event.typeString);
  switch (event.type) {
    case kIMAAdEvent_STARTED: {
      // Log extended data.
      NSString *extendedAdPodInfo = [[NSString alloc]
          initWithFormat:@"Showing ad %ld/%ld, bumper: %@, title: %@, description: %@, contentType:"
                         @"%@, pod index: %ld, time offset: %lf, max duration: %lf.",
                         (long)event.ad.adPodInfo.adPosition, (long)event.ad.adPodInfo.totalAds,
                         event.ad.adPodInfo.isBumper ? @"YES" : @"NO", event.ad.adTitle,
                         event.ad.adDescription, event.ad.contentType,
                         (long)event.ad.adPodInfo.podIndex, event.ad.adPodInfo.timeOffset,
                         event.ad.adPodInfo.maxDuration];

      NSLog(@"%@", extendedAdPodInfo);
      break;
    }
    case kIMAAdEvent_AD_BREAK_STARTED: {
      NSLog(@"Ad break started");
      break;
    }
    case kIMAAdEvent_AD_BREAK_ENDED: {
      NSLog(@"Ad break ended");
      break;
    }
    case kIMAAdEvent_AD_PERIOD_STARTED: {
      NSLog(@"Ad period started");
      break;
    }
    case kIMAAdEvent_AD_PERIOD_ENDED: {
      NSLog(@"Ad period ended");
      break;
    }
    default:
      break;
  }
}

- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdError:(IMAAdError *)error {
  NSLog(@"StreamManager error with type: %ld\ncode: %ld\nmessage: %@", error.type, error.code,
        error.message);
  [self.videoPlayer play];
}

アプリを実行します。成功した場合は、IMA SDK を使用して Google DAI ストリームをリクエストして再生できます。SDK の高度な機能について詳しくは、左側のサイドバーに表示されている他のガイドまたは GitHub のサンプルをご覧ください。