このガイドは、既存の IMA 実装にピクチャー イン ピクチャーのサポートを追加する IMA パブリッシャーを対象としています。
前提条件
- スタートガイドの手順を完了していること。
アプリにピクチャー イン ピクチャーのサポートを追加する
SDK バージョン 3.1.0 以降、IMA は iPad 向けの Apple のピクチャー イン ピクチャー モードをサポートしています。アプリにピクチャー イン ピクチャーのサポートを追加するには、いくつかの設定を調整し、以下に示すようにいくつかの新しい IMA クラスを実装する必要があります。
バックグラウンド再生を許可するように設定を更新する
ピクチャー イン ピクチャー モードを使用するには、アプリでバックグラウンド メディアの再生を許可する必要があります。
以下のように、[Background Modes] を [ON] に設定します([Audio, AirPlay and Picture in Picture] の場合)。
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 オブジェクトを作成する
ピクチャー イン ピクチャーをサポートするため、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
メッセージをアプリに転送しますが、Picture-in-Picture のサポートを有効にするために IMA への呼び出しも転送します。また、AVPlayerLayer へのローカル ハンドルも維持する必要があります。