本指南适用于希望将“画中画”功能的 IMA 发布商 为现有 IMA 实现提供图片支持。
前提条件
- 完成入门指南 指南。
为应用添加画中画支持
从 SDK 3.1.0 版开始,IMA 支持适用于 iPad 的 Apple“画中画”模式。 如需为您的应用添加对画中画功能的支持,您需要调整一些 设置并实现一些新的 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 对象
为了支持画中画功能,Apple 添加了 AVPictureInPictureController
和 AVPictureinPictureControllerDelegate
类。我们添加了
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; } }
进入画中画模式
如果您使用的是不带 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 的本地句柄。