iOS 用メディア広告(IMA)SDK
このガイドは、既存の IMA 実装にピクチャー イン ピクチャーのサポートを追加したい IMA パブリッシャー様を対象としています。
前提条件
- スタートガイド の手順を完了していること
アプリにピクチャー イン ピクチャーのサポートを追加する
SDK バージョン 3.1.0 以降、IMA は iPad 向けの Apple のピクチャー イン ピクチャー モードをサポートしています。 アプリにピクチャー イン ピクチャーのサポートを追加するには、以下のとおり、いくつかの設定を調整し、新しい IMA クラスをいくつか実装する必要があります。
バックグラウンド再生を許可するように設定を更新する
ピクチャー イン ピクチャー モードでは、アプリでバックグラウンドでのメディア再生を許可する必要があります。
以下のとおり、[Audio, AirPlay and Picture in Picture] の [Background Modes] を [ON] に設定します。

AVAudioSessionプロパティを設定してバックグラウンド再生をサポートし、IMASettingsでバックグラウンド再生を有効にします。... – (void)viewDidLoad { [super viewDidLoad]; self.playButton.layer.zPosition = MAXFLOAT; [[AVAudioSession sharedInstance] setActive:YES error:nil]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [self setupAdsLoader]; [self setUpContentPlayer]; } – (void)setupAdsLoader { IMASettings *settings = [[IMASettings alloc] init]; settings.enableBackgroundPlayback = YES; self.adsLoader = [[IMAAdsLoader alloc] initWithSettings:settings]; self.adsLoader.delegate = self; }
ピクチャー イン ピクチャー用の新しい iOS オブジェクトと IMA オブジェクトを作成する
ピクチャー イン ピクチャーをサポートするために、Apple は AVPictureInPictureController クラスと AVPictureinPictureControllerDelegate クラスを追加しました。IMA は IMAPictureInPictureProxy を追加しました。これらのクラスをプロジェクトに組み込むには、次のステートメントをコードに追加します。
... @interface VideoViewController () <AVPictureInPictureControllerDelegate, IMAAdsLoaderDelegate, IMAAdsManagerDelegate, UIAlertViewDelegate> ... // PiP objects. @property(nonatomic, strong) IMAPictureInPictureProxy *pictureInPictureProxy; @property(nonatomic, strong) AVPictureInPictureController *pictureInPictureController; ... @end - (void)setUpContentPlayer { ... self.pictureInPictureProxy = [[IMAPictureInPictureProxy alloc] initWithAVPictureInPictureControllerDelegate:self]; self.pictureInPictureController = [[AVPictureInPictureController alloc] initWithPlayerLayer:self.contentPlayerLayer]; self.pictureInPictureController.delegate = self.pictureInPictureProxy; }
広告リクエストを変更する
もう 1 つ作成する新しいオブジェクトがあります。それは IMAAVPlayerVideoDisplay です。これは IMAAdsRequest コンストラクタに渡され、動画がピクチャー イン ピクチャー モードで再生されているときに、SDK が PiP ウィンドウに広告を挿入できるようにします。
... - (void)requestAdsWithTag:(NSString *)adTagUrl { [self logMessage:@"Requesting ads"]; // Create an ad request with our ad tag, display container, and optional user context. IMAAdsRequest *request = [[IMAAdsRequest alloc] initWithAdTagUrl:adTagUrl adDisplayContainer:[self createAdDisplayContainer] avPlayerVideoDisplay:[[IMAAVPlayerVideoDisplay alloc] initWithAVPlayer:self.contentPlayer] pictureInPictureProxy:self.pictureInPictureProxy userContext:nil]; [self.adsLoader requestAdsWithRequest:request]; }
広告を開始する
IMA SDK の広告はピクチャー イン ピクチャー モードでは開始できません 。そのため、動画が標準再生モードの場合にのみ [adsManager start] を呼び出すようにする必要があります。
... - (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdEvent:(IMAAdEvent *)event { [self logMessage:@"AdsManager event (%s).", AdEventNames[event.type]]; // When the SDK notified you that ads have been loaded, play them. switch (event.type) { case kIMAAdEvent_LOADED: if (![self.pictureInPictureController isPictureInPictureActive]) { [adsManager start]; } break; ... default: break; } }
ピクチャー イン ピクチャー モードに切り替える
`AVPlayerViewController` なしで `AVPlayer` を使用している場合は、独自のピクチャー イン ピクチャー ボタンを
追加する必要があります。高度なサンプルでは、次のように実装しています。
- (IBAction)onPipButtonClicked:(id)sender {
if ([self.pictureInPictureController isPictureInPictureActive]) {
[self.pictureInPictureController stopPictureInPicture];
} else {
[self.pictureInPictureController startPictureInPicture];
}
}
よくある質問
- 動画がピクチャー イン ピクチャー モードの場合に広告を開始するにはどうすればよいですか?
- 動画がピクチャー イン ピクチャー モードの場合、広告を開始することはできません。広告を開始できるのは標準再生モードのみです。
- 既存のピクチャー イン ピクチャー統合では、
self.pictureInPictureController.delegateを独自のクラスに設定する必要があります。ピクチャー イン ピクチャーで IMA 広告を実装し、デリゲートのままにするにはどうすればよいですか? - IMA SDK は、ピクチャー イン ピクチャー モードで広告再生を有効にするために、
AVPictureinPictureControllerDelegateメッセージも受信する必要があります。そのため、AVPictureinPictureControllerのデリゲートをIMAPictureInPicturyProxyのインスタンスに設定することをおすすめします。このプロキシ オブジェクトは、すべてのAVPictureinPictureControllerDelegateメッセージをアプリに転送しますが、ピクチャー イン ピクチャーのサポートを有効にするために IMA への呼び出しも転送します。AVPlayerLayer へのローカル ハンドルも維持する必要があります。