本指南適用於想為現有 IMA 導入作業新增 Picture in Picture 支援的 IMA 發布商。
必要條件
- 完成入門指南。
為應用程式新增子母畫面支援
自 SDK 3.1.0 版起,IMA 支援 Apple 的 iPad 子母畫面模式。 如要在應用程式中新增 Picture in Picture 支援功能,您需要調整一些設定,並實作一些新的 IMA 類別,如以下所示。
更新設定,允許背景播放
子母畫面模式需要在應用程式中允許播放背景媒體。
將「背景模式」設為「開啟」,適用於「音訊、AirPlay 和子母畫面」,如下所示:
設定
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 物件
為支援 Picture in Picture,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; }
修改廣告請求
還有一個新物件需要建立:IMAAVPlayerVideoDisplay
。這會傳遞至 IMAAdsRequest
建構函式,並允許 SDK 在影片以分割畫面模式播放時,將廣告插入分割畫面視窗:
... - (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; } }
進入子母畫面模式
如果您使用 AVPlayer
而非 AVPlayerViewController
,就必須新增自己的圖片內圖片按鈕。我們在進階範例中實作了一個做法,如下所示:
- (IBAction)onPipButtonClicked:(id)sender {
if ([self.pictureInPictureController isPictureInPictureActive]) {
[self.pictureInPictureController stopPictureInPicture];
} else {
[self.pictureInPictureController startPictureInPicture];
}
}
常見問題
- 影片為子母畫面模式時,如何開始放送廣告?
- 影片處於子母畫面模式時,無法開始播放廣告;廣告只能在標準播放模式下播放。
- 我現有的 Picture in Picture 整合功能需要將
self.pictureInPictureController.delegate
設為我自己的類別。該如何在子母畫面中導入 IMA 廣告,同時仍保有委任? - IMA SDK 也需要接收
AVPictureinPictureControllerDelegate
訊息,才能在分割畫面模式中啟用廣告播放功能。因此,我們將AVPictureinPictureController
的委派設定設為IMAPictureInPicturyProxy
的例項。這個 Proxy 物件會將所有AVPictureinPictureControllerDelegate
訊息轉送至您的應用程式,但也會將呼叫轉送至 IMA,以啟用子母畫面支援功能。請注意,您也必須維護 AVPlayerLayer 的本機句柄。