1. 介绍
Taku iOS SDK v6.3.35版本开始支持视频流广告。视频流广告会在应用内容视频播放器顶部的单独视频播放器中播放。由您控制内容视频播放,而 SDK 负责处理广告播放。广告会在应用内容视频播放器之上的单独视频播放器中播放。具体渲染样式如下:
2. API说明
2.1 广告加载
ATAdManager: 激励视频广告的管理类
方法 | 说明 |
- (void)loadADWithPlacementID:(NSString *)placementID extra:(NSDictionary *)extra controlDataParam:(NSDictionary * _Nullable)param playhead:(id _Nullable)playhead delegate:(id<ATMediaVideoDelegate>)delegate mediaVideoContainerView:(UIView *)containerView viewController:(UIViewController *)viewController |
placementID:广告位 controlDataParam:控制广告参数,具体可看代码例子 playhead:如果是IMA的话,就是IMAAVPlayerContentPlayhead对象 delegate:回调对象 mediaVideoContainerView:广告播放容器 viewController:跳转ViewController |
示例代码展示:
#import <AnyThinkMediaVideo/ATMediaVideoDelegate.h>
#import <AnyThinkMediaVideo/ATAdManager+ATMediaVideo.h>
// 加载激励视频广告
- (void)loadAd {
NSMutableDictionary *extra = @{}.mutableCopy;
//内部浏览器打开
extra[kATAdMediaVideoExtraKeyInternalBrowser] = @YES;
//隐藏倒计时
extra[kATAdMediaVideoExtraKeyHideCountDown] = @NO;
//加载视频广告超时时间
extra[kATAdMediaVideoExtraKeyLoadVideoTimeout] = @8;
//广告要不要自动播放,对VMAP才有效
extra[kATAdMediaVideoExtraKeyAutoPlayAdBreaks] = @NO;
//关闭当前播放信息
extra[kATAdMediaVideoExtraKeyDisableNowPlayingInfo] = @YES;
self.videoView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 300)];
self.contentPlayhead = [[IMAAVPlayerContentPlayhead alloc] initWithAVPlayer:self.contentPlayer];
[[ATAdManager sharedManager] loadADWithPlacementID:@"your rv placementId" extra:extra controlDataParam:@{@"your key":@"your url"} playhead:self.contentPlayhead delegate:self mediaVideoContainerView:self.videoView viewController:self];
}
2.2 展示广告
方法 | 说明 |
- (ATMediaVideoOffer*)mediaVideoObjectWithPlacementID:(NSString*)placementID showConfig:(ATShowConfig * _Nullable)showConfig; |
如果需要offer对象,可以从该方法获取 |
ATMediaVideoOffer: MediaVideo视频流广告的展示操作类,通过上述方法获取。
方法 | 说明 |
- (void)showWithPlacementID:(NSString *)placementID; |
展示广告 |
- (id)customNetworkObj; |
获取平台广告对象 |
- (void)start; |
开始播放广告 |
- (void)pause; |
暂停广告 |
- (void)resume; |
恢复广告 |
- (void)destory; |
销毁广告 |
- (void)contentComplete; |
内容播放结束 |
示例代码展示:
- (void)showMediaVideoAd {
[_offer destory];
_offer = nil;
ATShowConfig *showConfig = ATShowConfig.new;
showConfig.showCustomExt = @"testShowCustomExt";
self.offer = [[ATAdManager sharedManager] mediaVideoObjectWithPlacementID:self.currentPlacementIDInfoModel.placementIDString showConfig:showConfig];
[self.offer showWithPlacementID:self.currentPlacementIDInfoModel.placementIDString];
}
2.4 代理协议回调
ATAdLoadingDelegate代理方法
方法 | 说明 |
---|---|
didFinishLoadingADWithPlacementID: | 对应广告位广告加载成功回调 placementId:广告位Id |
didFailToLoadADWithPlacementID: error: | 对应广告位广告加载失败回调 placementId:广告位Id error:广告加载失败信息 |
didStartLoadingADSourceWithPlacementID: extra: | 对应广告位中某一个广告源开始加载广告的回调 placementId:广告位Id extra:广告附加参数 |
didFinishLoadingADSourceWithPlacementID: extra: | 对应广告位中某一个广告源加载广告成功的回调 placementId:广告位Id extra:广告附加参数 |
didFailToLoadADSourceWithPlacementID: extra: error: | 对应广告位中某一个广告源加载广告失败的回调 placementId:广告位Id extra:广告附加参数 error:广告加载失败信息 |
didStartBiddingADSourceWithPlacementID: extra: | 对应广告位中某一个广告源竞价广告开始竞价的回调 placementId:广告位Id extra:广告附加参数 |
didFinishBiddingADSourceWithPlacementID: extra: | 对应广告位中某一个广告源竞价广告竞价成功的回调 placementId:广告位Id extra:广告附加参数 |
didFailBiddingADSourceWithPlacementID: extra: error: | 对应广告位中某一个广告源竞价广告竞价失败的回调 placementId:广告位Id extra:广告附加参数 error:竞价广告失败信息 |
ATMediaVideoDelegate代理方法
回调函数 | 回调函数意义 |
- (void)mediaVideoDidStartPlayingForPlacementID:(NSString *)placementID extra:(NSDictionary *)extra; |
ad play starts 广告开始播放 |
- (void)mediaVideoDidEndPlayingForPlacementID:(NSString *)placementID extra:(NSDictionary *)extra; |
广告播放结束 |
- (void)mediaVideoDidFailToPlayForPlacementID:(NSString *)placementID error:(NSError *)error extra:(NSDictionary *)extra; |
广告播放失败 |
- (void)mediaVideoDidClickForPlacementID:(NSString *)placementID extra:(NSDictionary *)extra; |
广告被点击 |
- (void)mediaVideoAdPauseForPlacementID:(NSString *)placementID extra:(NSDictionary *)extra; |
广告被暂停 |
- (void)mediaVideoAdResumeForPlacementID:(NSString *)placementID extra:(NSDictionary *)extra; |
广告被回复 |
- (void)mediaVideoAdSkipedForPlacementID:(NSString *)placementID extra:(NSDictionary *)extra; |
广告被跳过 |
- (void)mediaVideoAdForPlacementID:(NSString *)placementID extra:(NSDictionary *)extra event:(id)event; |
广告回调事件 |
- (void)mediaVideoAdTappedForPlacementID:(NSString *)placementID extra:(NSDictionary *)extra; |
广告视频区域被点击 |
- (void)mediaVideoAdDidProgressForPlacementID:(NSString *)placementID extra:(NSDictionary *)extra mediaTime:(NSTimeInterval)mediaTime totalTime:(NSTimeInterval)totalTime; |
广告播放进度 |
- (void)mediaVideoAdDidStartBufferingForPlacementID:(NSString *)placementID extra:(NSDictionary *)extra; |
广告开始缓存 |
- (void)mediaVideoAdDidBufferToMediaTimeForPlacementID:(NSString *)placementID extra:(NSDictionary *)extra mediaTime:(NSTimeInterval)mediaTime;
|
广告已缓存 |
- (void)mediaVideoAdPlaybackReadyForPlacementID:(NSString *)placementID extra:(NSDictionary *)extra; |
广告已准备好 |
- (void)mediaVideoAdRequestContentPauseForPlacementID:(NSString *)placementID extra:(NSDictionary *)extra; |
请求内容暂停 |
- (void)mediaVideoAdRequestContentResumeForPlacementID:(NSString *)placementID extra:(NSDictionary *)extra; |
请求内容恢复 |
- (void)mediaVideoAdBreakReadyForPlacementID:(NSString *)placementID extra:(NSDictionary *)extra; |
返回 IMA kIMAAdEvent_AD_BREAK_READY event |
2.4 其他API说明
- 视频流广告可以通过回调信息获取该广告缓存请求时传入的自定义extra内容。
- getMediaVideoAd获取的广告缓存(MediaVideoAd)是与请求时传入的ATVideoAdPlayer对象绑定
3. 示例代码
具体可参考Demo中的ATMediaVideoViewController.m
- (IMAAVPlayerContentPlayhead *)setUpContentPlayer {
// Load AVPlayer with path to our content.
NSURL *contentURL = [NSURL URLWithString:kTestAppContentUrl_MP4];
self.contentPlayer = [AVPlayer playerWithURL:contentURL];
// Create a player layer for the player.
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.contentPlayer];
// Size, position, and display the AVPlayer.
playerLayer.frame = self.videoView.layer.bounds;
[self.videoView.layer addSublayer:playerLayer];
// Set up our content playhead and contentComplete callback.
IMAAVPlayerContentPlayhead *contentPlayhead = [[IMAAVPlayerContentPlayhead alloc] initWithAVPlayer:self.contentPlayer];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(contentDidFinishPlaying:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:self.contentPlayer.currentItem];
return contentPlayhead;
}
- (void)loadAd {
[[ATAPI sharedInstance] setCustomData:self.currentPlacementIDInfoRuleModel.groupRuleDic forPlacementID:self.currentPlacementIDInfoModel.placementIDString];
if (!self.videoView.superview) {
[self.view addSubview:self.videoView];
self.contentPlayhead = [self setUpContentPlayer];
}
[self.contentPlayer seekToTime:kCMTimeZero completionHandler:^(BOOL finished) {
}];
NSMutableDictionary *extra = @{}.mutableCopy;
//内部浏览器打开
extra[kATAdMediaVideoExtraKeyInternalBrowserViewController] = self;
//隐藏倒计时
extra[kATAdMediaVideoExtraKeyHideCountDown] = @NO;
//加载视频广告超时时间
extra[kATAdMediaVideoExtraKeyLoadVideoTimeout] = @8;
//广告要不要自动播放,对VMAP才有效
extra[kATAdMediaVideoExtraKeyAutoPlayAdBreaks] = @NO;
//关闭当前播放信息
extra[kATAdMediaVideoExtraKeyDisableNowPlayingInfo] = @YES;
[[ATAdManager sharedManager] loadADWithPlacementID:self.currentPlacementIDInfoModel.placementIDString extra:extra controlDataParam:@{@"description_url":@"description_url"} delegate:self mediaVideoContainerView:self.videoView viewController:self];
}
- (void)showAd {
if (![[ATAdManager sharedManager] adReadyForPlacementID:self.currentPlacementIDInfoModel.placementIDString]) {
return;
}
ATShowConfig *showConfig = [[ATShowConfig alloc] initWithScene:nil showCustomExt:@"testShowCustomExt"];
self.offer = [[ATAdManager sharedManager] mediaVideoObjectWithPlacementID:self.currentPlacementIDInfoModel.placementIDString showConfig:showConfig delegate:self];
[[ATAdManager sharedManager] entryMediaVideoScenarioWithPlacementID:self.currentPlacementIDInfoModel.placementIDString scene:@"11"];
id customNetworkObj = [self.offer customNetworkObj];
id adsManager = [self.offer adsManager];
[self.contentPlayer seekToTime:kCMTimeZero completionHandler:^(BOOL finished) {
}];
UIView *myTransparentTapOverlay = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 250)];
myTransparentTapOverlay.backgroundColor = [UIColor yellowColor];
UIButton *myPauseButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 10)];
// Substitute "myTransparentTapOverlay" and "myPauseButton" with the elements
// you want to register as video controls overlays.
// Make sure to register before ad playback starts.
IMAFriendlyObstruction *overlayObstruction =
[[IMAFriendlyObstruction alloc] initWithView:myTransparentTapOverlay
purpose:IMAFriendlyObstructionPurposeNotVisible
detailedReason:@"This overlay is transparent"];
IMAFriendlyObstruction *pauseButtonObstruction =
[[IMAFriendlyObstruction alloc] initWithView:myPauseButton
purpose:IMAFriendlyObstructionPurposeMediaControls
detailedReason:@"This is the video player pause button"];
[self.offer registerFriendlyObstruction:overlayObstruction];
[self.offer registerFriendlyObstruction:pauseButtonObstruction];
[self.offer unregisterAllFriendlyObstructions];
if (self.offer.type == ATMediaVideoOfferTypeVMAP) {
[self.offer contentPlayhead:self.contentPlayhead];
} else if (self.offer.type == ATMediaVideoOfferTypeVAST) {
[self.offer start];
}
}
注意事项
- 请自行管理好load时传入的参数mediaVideoContainerView的展示和销毁逻辑,避免出现错乱。
- 请自行管理好ATMediaVideoOffer对象的销毁逻辑,避免出现错乱。
- VMAP广告需要等待触发IMA Event AD_BREAK_READY后才能调用ATMediaVideoOffer start展示广告