本文档基于 DemoCustomRewardVideoAdapter
示例代码,详细介绍如何创建自定义激励视频广告适配器,实现第三方广告平台的激励视频广告接入。
RewardVideo/
├── DemoCustomRewardVideoAdapter.h # 激励视频适配器头文件
├── DemoCustomRewardVideoAdapter.m # 激励视频适配器实现文件
├── DemoCustomRewardVideoDelegate.h # 激励视频代理头文件
└── DemoCustomRewardVideoDelegate.m # 激励视频代理实现文件
步骤:
#import <AnyThinkSDK.h>
@property (nonatomic, strong) ATRewardedAdStatusBridge * adStatusBridge;
MSRewardVideoAdDelegate
最终效果如下:
#import <Foundation/Foundation.h>
#import "DemoCustomAdapterCommonHeader.h"
@interface DemoCustomRewardVideoDelegate : NSObject<MSRewardVideoAdDelegate>
@property (nonatomic, strong) ATRewardedAdStatusBridge * adStatusBridge;
@end
步骤:
/**
视频数据下载成功回调,已经下载过的视频会直接回调,在该回调中调用show接口
@param msRewardVideoAd MSRewardVideoAd 实例
*/
- (void)msRewardVideoCached:(MSRewardVideoAd *)msRewardVideoAd { //这是第三方 SDK 的协议方法,广告加载成功时调用
NSDictionary * extraDic = [DemoCustomBaseAdapter getC2SInfo:[msRewardVideoAd ecpm]];//如果需要实现客户端竞价(C2S),则您需要将第三方广告的价格回传给我们 SDK
//通知我们广告加载成功,如果需要实现客户端竞价(C2S),将含有价格的字典传入给我们
[self.adStatusBridge atOnRewardedAdLoadedExtra:extraDic];
}
/**
视频广告各种错误信息回调
回调说明:如收到该回调说明本次请求已失败
@param msRewardVideoAd MSRewardVideoAd 实例
@param error 具体错误信息
*/
- (void)msRewardVideoError:(MSRewardVideoAd *)msRewardVideoAd error:(NSError *)error {//这是第三方 SDK 的协议方法,广告加载失败时调用
//通知我们加载失败
[self.adStatusBridge atOnAdLoadFailed:error adExtra:nil];
}
ATRewardedVideoTrackProtocol
协议与ATBaseTrackProtocol
协议,实现其他广告事件并通知我们,例如:/**
视频广告信息点击回调
@param msRewardVideoAd MSRewardVideoAd 实例
*/
- (void)msRewardVideoClicked:(MSRewardVideoAd *)msRewardVideoAd {
[self.adStatusBridge atOnAdClick:nil];
}
/**
视频广告曝光回调
@param msRewardVideoAd MSRewardVideoAd 实例
*/
- (void)msRewardVideoShow:(MSRewardVideoAd *)msRewardVideoAd {
// 广告展示成功回调
[self.adStatusBridge atOnAdShow:nil];
}
/**
视频播放页关闭回调
@param msRewardVideoAd MSRewardVideoAd 实例
*/
- (void)msRewardVideoClosed:(MSRewardVideoAd *)msRewardVideoAd {
[self.adStatusBridge atOnAdClosed:nil];
}
/**
视频广告开始播放回调
@param msRewardVideoAd MSRewardVideoAd 实例
*/
- (void)msRewardVideoStartPlaying:(MSRewardVideoAd *)msRewardVideoAd {
// 视频开始播放回调
[self.adStatusBridge atOnAdVideoStart:nil];
}
/**
视频广告视频播放完成
@param msRewardVideoAd MSRewardVideoAd 实例
*/
- (void)msRewardVideoFinish:(MSRewardVideoAd *)msRewardVideoAd {
// 视频播放完成回调
[self.adStatusBridge atOnAdVideoEnd:nil];
}
/**
视频广告播放达到激励条件回调
@param msRewardVideoAd MSRewardVideoAd 实例
@param adInfo 激励信息
*/
- (void)msRewardVideoReward:(MSRewardVideoAd *)msRewardVideoAd extInfo:(NSDictionary *)adInfo {
if ([[adInfo valueForKey:@"rewardVerify"] intValue] == 1) {
[self.adStatusBridge atOnRewardedVideoAdRewarded];
}
}
/**
激励视频渲染失败
*/
- (void)msRewardVideoRenderFail:(MSRewardVideoAd *)msRewardVideoAd error:(NSError *)error {
[self.adStatusBridge atOnAdShowFailed:error extra:nil];
}
/**
视频广告播放异常回调,当广告无效时或播放途中出现错误时调用
@param msRewardVideoAd MSRewardVideoAd 实例
@param error 播放错误信息
*/
- (void)msRewardVideoPlayingError:(MSRewardVideoAd *)msRewardVideoAd error:(NSError *)error {
[self.adStatusBridge atOnAdDidFailToPlayVideo:error extra:nil];
}
步骤:
DemoCustomBaseAdapter
,如果不清楚如何实现它,请参考[自定义基础适配器接入文档]章节。#import <AnyThinkSDK.h>
ATBaseRewardedAdapterProtocol
协议步骤:
@interface DemoCustomRewardVideoAdapter()
// 本文档2.1中实现的
@property (nonatomic, strong) DemoCustomRewardVideoDelegate *rewardedVideoDelegate;
// 第三方SDK 的激励视频广告对象
@property (nonatomic, strong) MSRewardVideoAd *rewardAd;
@end
rewardedVideoDelegate
属性#pragma mark - lazy
- (DemoCustomRewardVideoDelegate *)rewardedVideoDelegate{
if (_rewardedVideoDelegate == nil) {
_rewardedVideoDelegate = [[DemoCustomRewardVideoDelegate alloc] init];
_rewardedVideoDelegate.adStatusBridge = self.adStatusBridge;
}
return _rewardedVideoDelegate;
}
#pragma mark - Ad load
- (void)loadADWithArgument:(ATAdMediationArgument *)argument {
//通过argument对象获取必要的加载信息,创建好必要的参数,准备传入给第三方的激励视频加载方法,开始加载广告
self.rewardAd = [[MSRewardVideoAd alloc] init];
//注意设置代理给DemoCustomRewardVideoDelegate
self.rewardAd.delegate = self.rewardedVideoDelegate;
MSRewardAdConfigParams *adParam = [[MSRewardAdConfigParams alloc]init];
adParam.userId = argument.localInfoDic[kATAdLoadingExtraUserIDKey];
adParam.videoMuted = [argument.localInfoDic[@"video_muted"] intValue] == 0 ? NO : YES;
[self.rewardAd loadRewardVideoAdWithPid:argument.serverContentDic[@"slot_id"] adConfigParams:adParam];
}
#pragma mark - Ad show
- (void)showRewardedVideoInViewController:(UIViewController *)viewController {
[self.rewardAd showRewardVideoAdFromRootViewController:viewController];
}
#pragma mark - Ad ready
- (BOOL)adReadyRewardedWithInfo:(NSDictionary *)info {
return self.rewardAd.isAdValid;
}
#pragma mark - C2S Win Loss
- (void)didReceiveBidResult:(ATBidWinLossResult *)result { //接收我们 SDK 给的客户端竞价结果
if (result.bidResultType == ATBidWinLossResultTypeWin) {
[self sendWin:result];
return;
}
[self sendLoss:result];
}
- (void)sendWin:(ATBidWinLossResult *)result { //告诉第三方 SDK 竞价成功
[ATAdLogger logMessage:[NSString stringWithFormat:@"DemoCustomRewardVideoAdapter sendWin"] type:ATLogTypeExternal];
NSMutableDictionary *infoDic = [DemoCustomBaseAdapter getWinInfoResult:result];
[self.rewardAd sendWinNotificationWithInfo:infoDic];
}
- (void)sendLoss:(ATBidWinLossResult *)result { //告诉第三方 SDK 竞价失败
[ATAdLogger logMessage:[NSString stringWithFormat:@"DemoCustomRewardVideoAdapter sendLoss"] type:ATLogTypeExternal];
NSString *priceStr = [self.rewardAd mediaExt][@"ecpm"];
NSMutableDictionary *infoDict = [DemoCustomBaseAdapter getLossInfoResult:result];
[infoDict AT_setDictValue:priceStr key:kMSAdMediaWinPrice];
[self.rewardAd sendLossNotificationWithInfo:infoDict];
}
请前往广告事件回传接口列表。