IMA SDK を使用すると、マルチメディア広告をウェブサイトやアプリに簡単に統合できます。IMA SDK では、 VAST 準拠の広告サーバーから広告をリクエストし、アプリ内での広告再生を管理できます。IMA DAI SDK を使用すると、アプリは広告とコンテンツ動画(VOD またはライブ コンテンツ)のストリーム リクエストを行います。SDK は結合された動画ストリームを返すため、アプリ内で広告とコンテンツ動画の切り替えを管理する必要がありません。
このガイドでは、IMA SDK をシンプルな動画プレーヤー アプリに統合する方法について説明します。統合のサンプルを確認する場合は、GitHub から BasicExample をダウンロードしてください。
IMA DAI の概要
IMA DAI の実装には、このガイドで説明する次の 4 つの主要な SDK コンポーネントが必要です。
IMAAdDisplayContainer
: 動画再生要素の上に配置され、広告の UI 要素を収容するコンテナ オブジェクト。IMAAdsLoader
: ストリームをリクエストし、ストリーム リクエスト レスポンス オブジェクトによってトリガーされたイベントを処理するオブジェクト。インスタンス化するのは、アプリのライフサイクル全体で再利用できる広告ローダを 1 つだけにする必要があります。IMAStreamRequest
-IMAVODStreamRequest
またはIMALiveStreamRequest
のいずれか。ストリーム リクエストを定義するオブジェクト。ストリーム リクエストは、ビデオ オンデマンドまたはライブ ストリームのいずれかになります。リクエストには、コンテンツ ID のほか、API キーまたは認証トークンなどのパラメータを指定します。IMAStreamManager
: ダイナミック広告挿入ストリームと DAI バックエンドとのやり取りを処理するオブジェクト。また、ストリーム マネージャーはトラッキング ping を処理し、ストリームと広告のイベントをパブリッシャーに転送します。
前提条件
始める前に、次のものが必要になります。
- Xcode 13 以降
- CocoaPods(推奨)、Swift Package Manager、IMA SDK for iOS のダウンロード コピー
1. 新しい Xcode プロジェクトを作成する
Xcode で、Objective-C を使用して新しい iOS プロジェクトを作成します。プロジェクト名として BasicExample を使用します。
2. IMA SDK を Xcode プロジェクトに追加する
CocoaPods を使用して SDK をインストールする(推奨)
CocoaPods は Xcode プロジェクトの依存関係マネージャーであり、IMA SDK のインストールにはおすすめの方法です。CocoaPods のインストールと使用について詳しくは、CocoaPods のドキュメントをご覧ください。CocoaPods をインストールしたら、次の手順で IMA SDK をインストールします。
BasicExample.xcodeproj ファイルと同じディレクトリに Podfile という名前のテキスト ファイルを作成し、次の構成を追加します。
source 'https://github.com/CocoaPods/Specs.git' platform :ios, '14' target "BasicExample" do pod 'GoogleAds-IMA-iOS-SDK', '~> 3.19.1' end
Podfile を含むディレクトリから
pod install --repo-update
を実行します。インストールが正常に完了したことを確認します。BasicExample.xcworkspace ファイルを開き、BasicExample と Pods(CocoaPods によってインストールされる依存関係)の 2 つのプロジェクトが含まれていることを確認します。
Swift Package Manager を使用して SDK をインストールする
Interactive Media Ads SDK は、バージョン 3.18.4 以降、Swift Package Manager をサポートしています。Swift パッケージをインポートする手順は次のとおりです。
Xcode で [File] > [Add Packages...] の順に移動して、IMA SDK Swift パッケージをインストールします。
表示されるプロンプトで、IMA SDK Swift パッケージ GitHub リポジトリを検索します。
https://github.com/googleads/swift-package-manager-google-interactive-media-ads-ios
使用する IMA SDK Swift パッケージのバージョンを選択します。 新しいプロジェクトの場合は、[Up to Next メジャー バージョン] を使用することをおすすめします。
作業が完了すると、Xcode はパッケージの依存関係を解決し、それらをバックグラウンドでダウンロードします。パッケージの依存関係を追加する方法について詳しくは、Apple の記事をご覧ください。
SDK を手動でダウンロードしてインストールする
Swift Package Manager や CocoaPods を使用しない場合は、IMA SDK をダウンロードして手動でプロジェクトに追加できます。
3. シンプルな動画プレーヤーを作成する
まず、基本的な動画プレーヤーを実装します。当初は、このプレーヤーは IMA SDK を使用しておらず、再生をトリガーするメソッドをまだ含んでいません。
ViewController.m
#import "ViewController.h" #import <AVKit/AVKit.h> @interface ViewController () @property(nonatomic) AVPlayerViewController *playerViewController; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor blackColor]; // Create a stream video player. AVPlayer *player = [[AVPlayer alloc] init]; self.playerViewController = [[AVPlayerViewController alloc] init]; self.playerViewController.player = player; // Attach the video player to the view hierarchy. [self addChildViewController:self.playerViewController]; self.playerViewController.view.frame = self.view.bounds; [self.view addSubview:self.playerViewController.view]; [self.playerViewController didMoveToParentViewController:self]; } @end
4. SDK をインポートして IMA 操作用のスタブを追加する
IMA SDK をプロジェクトに追加したら、SDK をインポートして、IMA の操作の主なポイントとなるスタブを追加します。
ViewController.m
#import "ViewController.h" #import <AVKit/AVKit.h> #import <GoogleInteractiveMediaAds/GoogleInteractiveMediaAds.h> @interface ViewController () @property(nonatomic) IMAAdsLoader *adsLoader; @property(nonatomic) UIView *adContainerView; @property(nonatomic) IMAStreamManager *streamManager; @property(nonatomic) AVPlayerViewController *playerViewController; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor blackColor]; [self setupAdsLoader]; // Create a stream video player. AVPlayer *player = [[AVPlayer alloc] init]; self.playerViewController = [[AVPlayerViewController alloc] init]; self.playerViewController.player = player; // Attach the video player to the view hierarchy. [self addChildViewController:self.playerViewController]; self.playerViewController.view.frame = self.view.bounds; [self.view addSubview:self.playerViewController.view]; [self.playerViewController didMoveToParentViewController:self]; [self attachAdContainer]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self requestStream]; } - (void)setupAdsLoader {} - (void)attachAdContainer {} - (void)requestStream {} @end
5. IMAAdsLoader を実装する
次に、IMAAdsLoader
をインスタンス化して、広告コンテナのビューをビュー階層にアタッチします。
ViewController.m
... - (void)setupAdsLoader { self.adsLoader = [[IMAAdsLoader alloc] init]; self.adsLoader.delegate = self; } - (void)attachAdContainer { self.adContainerView = [[UIView alloc] init]; [self.view addSubview:self.adContainerView]; self.adContainerView.frame = self.view.bounds; } ...
6. ストリーミング リクエストを行う
ストリーム情報を保持する定数をいくつか作成し、リクエストを行うストリーム リクエスト関数を実装します。
ViewController.m
... #import <GoogleInteractiveMediaAds/GoogleInteractiveMediaAds.h> static NSString *const kAssetKey = @"sN_IYUG8STe1ZzhIIE_ksA"; static NSString *const kContentSourceID = @"2528370"; static NSString *const kVideoID = @"tears-of-steel"; @interface ViewController () ... - (void)requestStream { IMAAVPlayerVideoDisplay *videoDisplay = [[IMAAVPlayerVideoDisplay alloc] initWithAVPlayer:self.playerViewController.player]; IMAAdDisplayContainer *adDisplayContainer = [[IMAAdDisplayContainer alloc] initWithAdContainer:self.adContainerView]; IMALiveStreamRequest *request = [[IMALiveStreamRequest alloc] initWithAssetKey:kAssetKey adDisplayContainer:adDisplayContainer videoDisplay:videoDisplay]; // VOD request. Comment out the IMALiveStreamRequest above and uncomment this IMAVODStreamRequest // to switch from a livestream to a VOD stream. // IMAVODStreamRequest *request = // [[IMAVODStreamRequest alloc] initWithContentSourceId:kContentSourceID // videoId:kVideoID // adDisplayContainer:adDisplayContainer // videoDisplay:videoDisplay]; [self.adsLoader requestStreamWithRequest:request]; } ...
7. ストリーム イベントを処理する
IMAAdsLoader
と IMAStreamManager
は、初期化、エラー、ストリーム状態の変化を処理するために使用されるイベントを発生させます。これらのイベントは、IMAAdsLoaderDelegate
プロトコルと IMAStreamManagerDelegate
プロトコルを介して呼び出されます。広告の読み込みイベントをリッスンして、ストリームを初期化します。広告の読み込みに失敗した場合は、代わりにバックアップ ストリームを再生します。
ViewController.m
... static NSString *const kAssetKey = @"sN_IYUG8STe1ZzhIIE_ksA"; static NSString *const kContentSourceID = @"2528370"; static NSString *const kVideoID = @"tears-of-steel"; static NSString *const kBackupStreamURLString = @"https://storage.googleapis.com/interactive-media-ads/media/bbb.m3u8"; @interface ViewController () <IMAAdsLoaderDelegate, IMAStreamManagerDelegate> ... [self.adsLoader requestStreamWithRequest:request]; } - (void)playBackupStream { NSURL *backupStreamURL = [NSURL URLWithString:kBackupStreamURLString]; AVPlayerItem *backupStreamItem = [AVPlayerItem playerItemWithURL:backupStreamURL]; [self.playerViewController.player replaceCurrentItemWithPlayerItem:backupStreamItem]; [self.playerViewController.player play]; } #pragma mark - IMAAdsLoaderDelegate - (void)adsLoader:(IMAAdsLoader *)loader adsLoadedWithData:(IMAAdsLoadedData *)adsLoadedData { // Initialize and listen to stream manager's events. self.streamManager = adsLoadedData.streamManager; self.streamManager.delegate = self; [self.streamManager initializeWithAdsRenderingSettings:nil]; NSLog(@"Stream created with: %@.", self.streamManager.streamId); } - (void)adsLoader:(IMAAdsLoader *)loader failedWithErrorData:(IMAAdLoadingErrorData *)adErrorData { // Fall back to playing the backup stream. NSLog(@"Error loading ads: %@", adErrorData.adError.message); [self playBackupStream]; } #pragma mark - IMAStreamManagerDelegate - (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdEvent:(IMAAdEvent *)event {} - (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdError:(IMAAdError *)error {} - (void)streamManager:(IMAStreamManager *)streamManager adDidProgressToTime:(NSTimeInterval)time adDuration:(NSTimeInterval)adDuration adPosition:(NSInteger)adPosition totalAds:(NSInteger)totalAds adBreakDuration:(NSTimeInterval)adBreakDuration {} @end
8. ロギングとエラーイベントを処理する
ストリーム マネージャーのデリゲートで処理できるイベントはいくつかありますが、基本的な実装では、イベント ロギングの実行、広告の再生中のシークアクションの防止、エラーの処理が最も重要な使い方です。
ViewController.m
... #pragma mark - IMAStreamManagerDelegate - (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdEvent:(IMAAdEvent *)event { NSLog(@"StreamManager event (%@).", event.typeString); switch (event.type) { case kIMAAdEvent_STARTED: { // Log extended data. NSString *extendedAdPodInfo = [[NSString alloc] initWithFormat:@"Showing ad %zd/%zd, bumper: %@, title: %@, description: %@, contentType:" @"%@, pod index: %zd, time offset: %lf, max duration: %lf.", event.ad.adPodInfo.adPosition, event.ad.adPodInfo.totalAds, event.ad.adPodInfo.isBumper ? @"YES" : @"NO", event.ad.adTitle, event.ad.adDescription, event.ad.contentType, event.ad.adPodInfo.podIndex, event.ad.adPodInfo.timeOffset, event.ad.adPodInfo.maxDuration]; NSLog(@"%@", extendedAdPodInfo); break; } case kIMAAdEvent_AD_BREAK_STARTED: { // Prevent user seek through when an ad starts and show the ad controls. self.adContainerView.hidden = NO; break; } case kIMAAdEvent_AD_BREAK_ENDED: { // Allow user seek through after an ad ends and hide the ad controls. self.adContainerView.hidden = YES; break; } default: break; } } - (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdError:(IMAAdError *)error { // Fall back to playing the backup stream. NSLog(@"StreamManager error: %@", error.message); [self playBackupStream]; } @end
これで完了です。これで、IMA SDK を使用して広告をリクエストし、表示できます。より高度な SDK 機能については、他のガイドや GitHub のサンプルをご覧ください。
次のステップ
iOS プラットフォームで広告収益を最大化するには、IDFA の使用について「App Transparency とトラッキング」権限をリクエストしてください。