自定义广告平台Adapter实现
简介
本文档将介绍在iOS端如何实现自定义广告平台Adapter,主要包括初始化、加载广告、展示广告以及各广告类型的响应事件回调处理。文档中代码截取来源于Demo。
支持广告类型
目前支持的广告类型有五种,如下所示:
- 原生广告(Native)
- 开屏广告(Splash)
- Banner广告
- 激励视频广告(RewardedVideo)
- 插屏广告(Interstitial)
核心流程实现
- 定义Adapter类名,包括配置Adapter以及各广告类型对应Adapter,并遵循相关协议;
- 在ToBid开发者平台配置相关信息,详情参见平台部分文档;
- 实现协议方法完成初始化(含隐私合规)、广告加载、展示方法及回调,详见下方说明;
常见问题
- 自定义Adapter需要按照示例中相应方法含义调用,否则会影响收益;
- 及时更新协议版本号为ToBid支持的最新版本,否则可能无法使用;
- 自定义Adapter广告load之前需要确保开发者实现了AWMCustomConfigAdapter协议并初始化network成功,network版本号,Adapter版本号均不能为空;
- 自定义Adapter广告load成功或者失败只能调用一次;
- 所有调用自定义adapter的方法均在主线程,请勿进行耗时操作;
- 自定义Adapter支持广告频次控制、广告间隔控制、AB测试;
- 自定义Adapter不支持show时预加载、Service bidding、多阶底价。支持Client bidding;
- 自定义Adapter广告对象的show、click等回调需要在load广告回调之后;
- ToBid已经处理了Banner的轮播,自定义Banner需要禁用轮播;
- Adapter 需严格准确调用展示失败回调,否则可能引发聚合层请求异常。
初始化配置
协议内容
自定义Adapter必须要有配置类,在配置类中完成Adapter及对应network的信息采集,对应协议为AWMCustomConfigAdapter,接口实现如下所示:
| 方法名 | 说明 |
|---|---|
| - (instancetype)initWithBridge:(id<AWMCustomConfigAdapterBridge>)bridge; | 构造函数,开发者需要通过bridge通知ToBid初始化成功和失败 |
| - (AWMCustomAdapterVersion *)basedOnCustomAdapterVersion; | 该自定义adapter是基于哪个版本实现的,填写编写时的最新值即可,ToBid会根据该值进行兼容处理 |
| - (void)initializeAdapterWithConfiguration:(AWMSdkInitConfig *)initConfig; | adn初始化方法,其中initConfig初始化配置,包括appid、appkey基本信息和用户自定义参数等 |
| - (NSString *)adapterVersion; | Adapter的版本号 (用于ToBid获取Adapter的版本号) |
| - (NSString *)networkSdkVersion; | adn的版本号 (用于ToBid获取adn的版本号) |
| - (void)didRequestAdPrivacyConfigUpdate:(NSDictionary *)config; | 隐私权限更新,用户更新隐私配置时触发,初始化方法调用前一定会触发一次 |
示例代码
@interface XXCustomConfigAdapter ()
@property (nonatomic, weak) id<AWMCustomConfigAdapterBridge> bridge;
@end
@implementation XXCustomConfigAdapter
- (instancetype)initWithBridge:(id<AWMCustomConfigAdapterBridge>)bridge {
self = [super init];
if (self) {
_bridge = bridge;
}
return self;
}
- (AWMCustomAdapterVersion *)basedOnCustomAdapterVersion {
return AWMCustomAdapterVersion1_0;
}
- (NSString *)adapterVersion {
return @"1.0.0";
}
- (NSString *)networkSdkVersion {
return [BUAdSDKManager SDKVersion];
}
- (void)initializeAdapterWithConfiguration:(AWMSdkInitConfig *)initConfig {
}
/// 隐私权限更新,用户更新隐私配置时触发,初始化方法调用前一定会触发一次
- (void)didRequestAdPrivacyConfigUpdate:(NSDictionary *)config {
//调用三方adn隐私设置接口
}
@end开屏广告(Splash)
协议内容
自定义Splash adapter中需要实现的协议为AWMCustomSplashAdapter,接口实现如下所示:
| 方法名 | 说明 |
|---|---|
| - (instancetype)initWithBridge:(id<AWMCustomSplashAdapterBridge>)bridge; | 构造函数,开发者需要通过bridge通知ToBid广告回调的各个状态 |
| - (BOOL)mediatedAdStatus; | 开屏广告的状态,YES: 表示当前可以播放;NO: 表示广告未准备好 |
| - (void)loadAdWithPlacementId:(NSString *)placementId parameter:(AWMParameter *)parameter; | 加载开屏广告 |
| - (void)showSplashAdInWindow:(UIWindow *)window parameter:(AWMParameter *)parameter; | 展示开屏广告 |
| - (void)didReceiveBidResult:(AWMMediaBidResult *)result; | 回调客户端竞价结果,比价成功时回传成功;比价失败、返回超时或价格低于竞价底价时回传失败 |
| - (void)destory; | 在该回调中主要做一些释放逻辑 |
广告加载
在Splash广告的adapter中使用如下方法完成广告加载,其中parameter参数包括了本次广告加载的所有数据,支持的参数详见下方加载参数部分,更完整信息请查看AWMAdLoadingParam.h文件。
@interface XXCSJCustomSplashAdapter ()
@property (nonatomic, weak) id<AWMCustomSplashAdapterBridge> bridge;
@property (nonatomic, strong) BUSplashAd *splashAd;
@end
@implementation XXCSJCustomSplashAdapter
- (instancetype)initWithBridge:(id<AWMCustomSplashAdapterBridge>)bridge {
self = [super init];
if (self) {
_bridge = bridge;
}
return self;
}
- (BOOL)mediatedAdStatus {
return YES;
}
- (void)loadAdWithPlacementId:(NSString *)placementId parameter:(AWMParameter *)parameter {
UIViewController *viewController = [self.bridge viewControllerForPresentingModalView];
UIView *bottomView = [parameter.extra objectForKey:AWMAdLoadingParamSPCustomBottomView];
UIView *supView = viewController.navigationController ? viewController.navigationController.view : viewController.view;
NSValue *sizeValue = [parameter.extra objectForKey:AWMAdLoadingParamSPExpectSize];
CGSize adSize = [sizeValue CGSizeValue];
if (adSize.width * adSize.height == 0) {
CGFloat h = CGRectGetHeight(bottomView.frame);
adSize = CGSizeMake(supView.frame.size.width, supView.frame.size.height - h);
}
NSInteger splashType = [[parameter.customInfo objectForKey:@"splashType"] intValue];
int fetchDelay = [[parameter.extra objectForKey:AWMAdLoadingParamSPTolerateTimeout] intValue];
self.splashAd = [[BUSplashAd alloc] initWithSlotID:parameter.placementId adSize:adSize];
self.splashAd.delegate = self;
self.splashAd.cardDelegate = self;
self.splashAd.zoomOutDelegate = self;
self.splashAd.tolerateTimeout = fetchDelay;
[self.splashAd loadAdData];
}
- (void)destory {
[self.splashAd removeSplashView];
self.splashAd = nil;
}
@end加载参数
| 参数名 | 参数类型 | 参数含义 |
|---|---|---|
| AWMAdLoadingParamLinkID | NSString | 聚合请求ID |
| AWMAdLoadingParamMediationRitID | NSString | 聚合广告位ID |
| AWMAdLoadingParamMediaName | NSString | ADN广告位名称,平台配置名称 |
| AWMAdLoadingParamMediaID | NSString | ADN平台ID,平台生成的唯一ID |
| AWMAdLoadingParamCustomJson | NSString | 自定义Adapter扩展参数 |
| AWMAdLoadingParamSPCustomBottomView | UIView | 自定义底部视图 |
| AWMAdLoadingParamSPExpectSize | NSValue/CGSize | 期望广告尺寸 |
| AWMAdLoadingParamSPCustomBottomViewSize | NSValue/CGSize | 自定义底部视图尺寸 |
| AWMAdLoadingParamSPTolerateTimeout | NSNumber/NSInteger | 开屏超时时间 |
广告展示
在Splash广告的adapter中使用如下方法完成广告展示,更完整信息请查看AWMAdLoadingParam.h文件。
- (void)showSplashAdInWindow:(UIWindow *)window parameter:(AWMParameter *)parameter {
UIView *bottomView = [parameter.extra objectForKey:AWMAdLoadingParamSPCustomBottomView];
UIViewController *viewController = [self.bridge viewControllerForPresentingModalView];
UIView *supView = viewController.navigationController ? viewController.navigationController.view : viewController.view;
CGRect supFrame = supView.bounds;
CGRect adFrame = CGRectMake(0, 0, supFrame.size.width, supFrame.size.height - bottomView.bounds.size.height);
if (bottomView) {
[supView addSubview:bottomView];
bottomView.frame = CGRectMake(0,
supFrame.size.height - CGRectGetHeight(bottomView.frame),
CGRectGetWidth(bottomView.frame),
CGRectGetHeight(bottomView.frame)
);
}
UIView *splashAdView = self.splashAd.splashView;
CGRect adViewRect = CGRectMake(adFrame.origin.x, adFrame.origin.y, adFrame.size.width, adFrame.size.height);
splashAdView.frame = adViewRect;
splashAdView.clipsToBounds = YES;
[supView addSubview:splashAdView];
}回调协议
开发者需通过回调方式将广告加载/展示/交互情况通知到ToBid,以保证流程的完整性。协议内容详见AWMCustomSplashAdapterBridge.h协议。
| 方法名 | 参数说明 | 说明 |
|---|---|---|
| - (void)splashAd:(id<AWMCustomSplashAdapter>)adapter didAdServerResponseWithExt:(NSDictionary *)ext; | adapter: 当前适配器 ext: 补充回传信息 | 当需要接入client bidding时,获取到价格后,第一时间通过调用该方法,将价格会传到ToBid |
| - (void)splashAdDidLoad:(id<AWMCustomSplashAdapter>)adapter; | adapter: 当前适配器 | 在广告加载完成时调用该方法 |
| - (void)splashAd:(id<AWMCustomSplashAdapter>)adapter didLoadFailWithError:(NSError *)error ext:(NSDictionary *)ext; | adapter: 当前适配器 error: 加载失败的错误信息 ext: 补充回传信息 | 在广告加载失败时调用该方法 |
| - (void)splashAdWillVisible:(id<AWMCustomSplashAdapter>)adapter; | adapter: 当前适配器 | 在广告即将展示时调用 |
| - (void)splashAdDidShowFailed:(id<AWMCustomSplashAdapter>)adapter error:(NSError *)error; | adapter: 当前适配器 error: 广告展示失败的错误信息 | 广告展示失败的时候调用该方法 |
| - (void)splashAdDidClick:(id<AWMCustomSplashAdapter>)adapter; | adapter: 当前适配器 | 在广告点击事件触发时调用 |
| - (void)splashAdDidClickSkip:(id<AWMCustomSplashAdapter>)adapter; | adapter: 当前适配器 | 在广告跳过事件触发时调用 |
| - (void)splashAdDidClose:(id<AWMCustomSplashAdapter>)adapter; | adapter: 当前适配器 | 在广告关闭事件触发时调用 |
| - (void)splashAdZoomOutViewDidClick:(id<AWMCustomSplashAdapter>)adapter; | adapter: 当前适配器 | 在zoom out 视图点击事件触发时调用 |
| - (void)splashAdZoomOutViewDidClose:(id<AWMCustomSplashAdapter>)adapter; | adapter: 当前适配器 | 在zoom out 视图关闭事件触发时调用 |
| - (UIViewController *)viewControllerForPresentingModalView; | 无 | 获取广告点击跳转使用的控制器 |
Banner广告
协议内容
自定义Banner adapter中需要实现的协议为AWMCustomBannerAdapter,接口实现如下所示:
| 方法名 | 说明 |
|---|---|
| - (instancetype)initWithBridge:(id<AWMCustomBannerAdapterBridge>)bridge; | 构造函数,开发者需要通过bridge通知ToBid广告回调的各个状态 |
| - (BOOL)mediatedAdStatus; | Banner广告的状态,YES: 表示当前可以播放;NO: 表示广告未准备好 |
| - (void)loadAdWithPlacementId:(NSString *)placementId parameter:(AWMParameter *)parameter; | 加载Banner广告 |
| - (void)didReceiveBidResult:(AWMMediaBidResult *)result; | 回调客户端竞价结果,比价成功时回传成功;比价失败、返回超时或价格低于竞价底价时回传失败 |
| - (void)destory; | 在该回调中主要做一些释放逻辑 |
广告加载
在Baner广告的adapter中使用如下方法完成广告加载,其中parameter参数包括了本次广告加载的所有数据,支持的参数详见下方加载参数部分,更完整信息请查看AWMAdLoadingParam.h文件。
@interface XXCSJCustomBannerAdapter()<BUNativeExpressBannerViewDelegate>
@property (nonatomic, weak) id<AWMCustomBannerAdapterBridge> bridge;
@property (nonatomic, strong) BUNativeExpressBannerView *bannerView;
@end
@implementation XXCSJCustomBannerAdapter
- (instancetype)initWithBridge:(id<AWMCustomBannerAdapterBridge>)bridge {
self = [super init];
if (self) {
_bridge = bridge;
}
return self;
}
- (void)loadAdWithPlacementId:(NSString *)placementId parameter:(AWMParameter *)parameter {
CGSize adSize = CGSizeMake(320, 50);
UIViewController *viewController = [self.bridge viewControllerForPresentingModalView];
self.bannerView = [[BUNativeExpressBannerView alloc] initWithSlotID:parameter.placementId rootViewController:viewController adSize:adSize];
self.bannerView.delegate = self;
self.bannerView.frame = CGRectMake(0, 0, adSize.width, adSize.height);
[self.bannerView loadAdData];
}
- (BOOL)mediatedAdStatus {
return YES;
}
- (void)destory {
[self.bannerView removeFromSuperview];
self.bannerView = nil;
}
@end加载参数
| 参数名 | 参数类型 | 参数含义 |
|---|---|---|
| AWMAdLoadingParamLinkID | NSString | 聚合请求ID |
| AWMAdLoadingParamMediationRitID | NSString | 聚合广告位ID |
| AWMAdLoadingParamMediaName | NSString | ADN广告位名称,平台配置名称 |
| AWMAdLoadingParamMediaID | NSString | ADN平台ID,平台生成的唯一ID |
| AWMAdLoadingParamCustomJson | NSString | 自定义Adapter扩展参数 |
回调协议
开发者需通过回调方式将广告加载/展示/交互情况通知到ToBid,以保证流程的完整性。协议内容详见AWMCustomSplashAdapterBridge.h协议。
| 方法名 | 参数说明 | 说明 |
|---|---|---|
| - (void)bannerAd:(id<AWMCustomBannerAdapter>)adapter didAdServerResponse:(UIView *)bannerView ext:(NSDictionary *)ext | adapter: 当前适配器 ext: 补充回传信息 | 当需要接入client bidding时,获取到价格后,第一时间通过调用该方法,将价格会传到ToBid |
| - (void)bannerAd:(id<AWMCustomBannerAdapter>)adapter didLoad:(UIView *)bannerView; | adapter: 当前适配器 bannerView: Banner广告视图 | 在广告加载完成时调用该方法 |
| - (void)bannerAd:(id<AWMCustomBannerAdapter>)adapter didLoadFailWithError:(NSError *)error ext:(NSDictionary *)ext; | adapter: 当前适配器 error: 加载失败的错误信息 ext: 补充回传信息 | 在广告加载失败时调用该方法 |
| - (void)bannerAdDidBecomeVisible:(id<AWMCustomBannerAdapter>)adapter bannerView:(UIView *)bannerView; | adapter: 当前适配器 bannerView: Banner广告视图 | 在广告即将展示时调用 |
| - (void)bannerAdWillPresentFullScreenModal:(id<AWMCustomBannerAdapter>)adapter bannerView:(UIView *)bannerView; | adapter: 当前适配器 bannerView: Banner广告视图 | 在广告弹出详情页或者展示展示appstore触发时调用该方法 |
| - (void)bannerAdWillDismissFullScreenModal:(id<AWMCustomBannerAdapter>)adapter bannerView:(UIView *)bannerView; | adapter: 当前适配器 bannerView: Banner广告视图 | 在广告关闭详情页或者appstore触发时调用该方法 |
| - (void)bannerAdWillLeaveApplication:(id<AWMCustomBannerAdapter>)adapter bannerAdView:(UIView *)bannerView; | adapter: 当前适配器 bannerView: Banner广告视图 | 在用户由于点击要离开您的应用程序触发时调用该方法 |
| - (void)bannerAdDidClick:(id<AWMCustomBannerAdapter>)adapter bannerView:(UIView *)bannerView; | adapter: 当前适配器 bannerView: Banner广告视图 | 在广告点击事件触发时调用 |
| - (void)bannerAdDidClosed:(id<AWMCustomBannerAdapter>)adapter bannerView:(UIView *)bannerView; | adapter: 当前适配器 bannerView: Banner广告视图 | 在广告关闭事件触发时调用 |
| - (UIViewController *)viewControllerForPresentingModalView; | 无 | 获取广告点击跳转使用的控制器 |
激励视频广告(RewardedVideo)
协议内容
自定义激励视频广告 adapter中需要实现的协议为AWMCustomRewardedVideoAdapter,接口实现如下所示:
| 方法名 | 说明 |
|---|---|
| - (instancetype)initWithBridge:(id<AWMCustomRewardedVideoAdapterBridge>)bridge; | 构造函数,开发者需要通过bridge通知ToBid广告回调的各个状态 |
| - (BOOL)mediatedAdStatus; | 激励视频广告的状态,YES: 表示当前可以播放;NO: 表示广告未准备好 |
| - (void)loadAdWithPlacementId:(NSString *)placementId parameter:(AWMParameter *)parameter; | 加载激励视频广告 |
| - (BOOL)showAdFromRootViewController:(UIViewController *)viewController parameter:(AWMParameter *)parameter; | 展示激励视频广告 |
| - (void)didReceiveBidResult:(AWMMediaBidResult *)result; | 回调客户端竞价结果,比价成功时回传成功;比价失败、返回超时或价格低于竞价底价时回传失败 |
| - (void)destory; | 在该回调中主要做一些释放逻辑 |
广告加载
在激励视频广告的adapter中使用如下方法完成广告加载,其中parameter参数包括了本次广告加载的所有数据,支持的参数详见下方加载参数部分,更完整信息请查看AWMAdLoadingParam.h文件。
@interface XXCSJCustomRewardedVideoAdapter ()
@property (nonatomic, weak) id<AWMCustomRewardedVideoAdapterBridge> bridge;
@property (nonatomic, strong) BUNativeExpressRewardedVideoAd *rewardedVideoAd;
@end
@implementation XXCSJCustomRewardedVideoAdapter
- (instancetype)initWithBridge:(id<AWMCustomRewardedVideoAdapterBridge>)bridge {
self = [super init];
if (self) {
_bridge = bridge;
}
return self;
}
- (BOOL)mediatedAdStatus {
return YES;
}
- (void)loadAdWithPlacementId:(NSString *)placementId parameter:(AWMParameter *)parameter {
BURewardedVideoModel *model = [[BURewardedVideoModel alloc] init];
WindMillAdRequest *request = [self.bridge adRequest];
model.userId = request.userId;
self.rewardedVideoAd = [[BUNativeExpressRewardedVideoAd alloc] initWithSlotID:placementId rewardedVideoModel:model];
self.rewardedVideoAd.delegate = self;
[self.rewardedVideoAd loadAdData];
}
- (void)destory {
self.rewardedVideoAd = nil;
}加载参数
| 参数名 | 参数类型 | 参数含义 |
|---|---|---|
| AWMAdLoadingParamLinkID | NSString | 聚合请求ID |
| AWMAdLoadingParamMediationRitID | NSString | 聚合广告位ID |
| AWMAdLoadingParamMediaName | NSString | ADN广告位名称,平台配置名称 |
| AWMAdLoadingParamMediaID | NSString | ADN平台ID,平台生成的唯一ID |
| AWMAdLoadingParamCustomJson | NSString | 自定义Adapter扩展参数 |
广告展示
在激励视频广告的adapter中使用如下方法完成广告展示,更完整信息请查看AWMAdLoadingParam.h文件。
- (BOOL)showAdFromRootViewController:(UIViewController *)viewController parameter:(AWMParameter *)parameter {
return [self.rewardedVideoAd showAdFromRootViewController:viewController];
}回调协议
开发者需通过回调方式将广告加载/展示/交互情况通知到ToBid,以保证流程的完整性。协议内容详见AWMCustomRewardedVideoAdapterBridge.h协议。
| 方法名 | 参数说明 | 说明 |
|---|---|---|
| - (void)rewardedVideoAd:(id<AWMCustomRewardedVideoAdapter>)adapter didAdServerResponseWithExt:(NSDictionary *)ext; | adapter: 当前适配器 ext: 补充回传信息 | 当需要接入client bidding时,获取到价格后,第一时间通过调用该方法,将价格会传到ToBid |
| - (void)rewardedVideoAdDidLoad:(id<AWMCustomRewardedVideoAdapter>)adapter; | adapter: 当前适配器 | 在广告加载完成时调用该方法 |
| - (void)rewardedVideoAd:(id<AWMCustomRewardedVideoAdapter>)adapter didLoadFailWithError:(NSError *)error ext:(NSDictionary *)ext; | adapter: 当前适配器 error: 加载失败的错误信息 ext: 补充回传信息 | 在广告加载失败时调用该方法 |
| - (void)rewardedVideoAdDidVisible:(id<AWMCustomRewardedVideoAdapter>)adapter; | adapter: 当前适配器 | 在广告即将展示时调用 |
| - (void)rewardedVideoAdDidShowFailed:(id<AWMCustomRewardedVideoAdapter>)adapter error:(NSError *)error; | adapter: 当前适配器 error: 广告展示失败的错误信息 | 广告展示失败的时候调用该方法 |
| - (void)rewardedVideoAdDidClick:(id<AWMCustomRewardedVideoAdapter>)adapter; | adapter: 当前适配器 | 在广告点击事件触发时调用 |
| - (void)rewardedVideoAdDidClickSkip:(id<AWMCustomRewardedVideoAdapter>)adapter; | adapter: 当前适配器 | 在广告跳过事件触发时调用 |
| - (void)rewardedVideoAdDidClose:(id<AWMCustomRewardedVideoAdapter>)adapter; | adapter: 当前适配器 | 在广告关闭事件触发时调用 |
| - (void)rewardedVideoAd:(id<AWMCustomRewardedVideoAdapter>)adapter didPlayFinishWithError:(NSError *)error; | adapter: 当前适配器 error: 广告视频播放的错误信息 | 在视频播放结束或者播放错误事件触发是调用 |
| - (void)rewardedVideoAd:(id<AWMCustomRewardedVideoAdapter>)adapter didRewardSuccessWithInfo:(WindMillRewardInfo *)info; | adapter: 当前适配器 info: 激励信息 | 在激励视频广告触发激励事件时调用该方法 |
插屏广告(Interstitial)
协议内容
自定义全屏视频广告 adapter中需要实现的协议为AWMCustomInterstitialAdapter,接口实现如下所示:
| 方法名 | 说明 |
|---|---|
| - (instancetype)initWithBridge:(id<AWMCustomInterstitialAdapterBridge>)bridge; | 构造函数,开发者需要通过bridge通知ToBid广告回调的各个状态 |
| - (BOOL)mediatedAdStatus; | 插屏广告的状态,YES: 表示当前可以播放;NO: 表示广告未准备好 |
| - (void)loadAdWithPlacementId:(NSString *)placementId parameter:(AWMParameter *)parameter; | 加载插屏广告 |
| - (BOOL)showAdFromRootViewController:(UIViewController *)viewController parameter:(AWMParameter *)parameter; | 展示插屏广告 |
| - (void)didReceiveBidResult:(AWMMediaBidResult *)result; | 回调客户端竞价结果,比价成功时回传成功;比价失败、返回超时或价格低于竞价底价时回传失败 |
| - (void)destory; | 在该回调中主要做一些释放逻辑 |
广告加载
在插屏广告的adapter中使用如下方法完成广告加载,其中parameter参数包括了本次广告加载的所有数据,支持的参数详见下方加载参数部分,更完整信息请查看AWMAdLoadingParam.h文件。
@interface XXCSJCustomInterstitialAdapter : NSObject\<AWMCustomInterstitialAdapter\>
@property (nonatomic, weak) id<AWMCustomInterstitialAdapterBridge> bridge;
@property (nonatomic, strong) BUFullscreenVideoAd *ad;
@end
@implementation XXCSJCustomInterstitialAdapter
- (instancetype)initWithBridge:(id<AWMCustomInterstitialAdapterBridge>)bridge {
self = [super init];
if (self) {
_bridge = bridge;
}
return self;
}
- (BOOL)mediatedAdStatus {
return YES;
}
- (void)loadAdWithPlacementId:(NSString *)placementId parameter:(AWMParameter *)parameter {
self.ad = [[BUFullscreenVideoAd alloc] initWithSlotID:placementId];
self.ad = self;
[self.ad loadAdData];
}
- (void)destory {
self.ad = nil;
}加载参数
| 参数名 | 参数类型 | 参数含义 |
|---|---|---|
| AWMAdLoadingParamLinkID | NSString | 聚合请求ID |
| AWMAdLoadingParamMediationRitID | NSString | 聚合广告位ID |
| AWMAdLoadingParamMediaName | NSString | ADN广告位名称,平台配置名称 |
| AWMAdLoadingParamMediaID | NSString | ADN平台ID,平台生成的唯一ID |
| AWMAdLoadingParamCustomJson | NSString | 自定义Adapter扩展参数 |
广告展示
在插屏广告的adapter中使用如下方法完成广告展示,更完整信息请查看AWMAdLoadingParam.h文件。
- (BOOL)showAdFromRootViewController:(UIViewController *)viewController parameter:(AWMParameter *)parameter {
[self.ad showAdFromRootViewController:viewController];
return YES;
}回调协议
开发者需通过回调方式将广告加载/展示/交互情况通知到ToBid,以保证流程的完整性。协议内容详见AWMCustomInterstitialAdapterBridge.h协议。
| 方法名 | 参数说明 | 说明 |
|---|---|---|
| - (void)interstitialAd:(id<AWMCustomInterstitialAdapter>)adapter didAdServerResponseWithExt:(NSDictionary *)ext; | adapter: 当前适配器 ext: 补充回传信息 | 当需要接入client bidding时,获取到价格后,第一时间通过调用该方法,将价格会传到ToBid |
| - (void)interstitialAdDidLoad:(id<AWMCustomInterstitialAdapter>)adapter; | adapter: 当前适配器 | 在广告加载完成时调用该方法 |
| - (void)interstitialAd:(id<AWMCustomInterstitialAdapter>)adapter didLoadFailWithError:(NSError *)error ext:(NSDictionary *)ext; | adapter: 当前适配器 error: 加载失败的错误信息 ext: 补充回传信息 | 在广告加载失败时调用该方法 |
| - (void)interstitialAdDidVisible:(id<AWMCustomInterstitialAdapter>)adapter; | adapter: 当前适配器 | 在广告即将展示时调用 |
| - (void)interstitialAdDidShowFailed:(id<AWMCustomInterstitialAdapter>)adapter error:(NSError *)error; | adapter: 当前适配器 error: 广告展示失败的错误信息 | 广告展示失败的时候调用该方法 |
| - (void)interstitialAdDidClick:(id<AWMCustomInterstitialAdapter>)adapter; | adapter: 当前适配器 | 在广告点击事件触发时调用 |
| - (void)interstitialAdDidClickSkip:(id<AWMCustomInterstitialAdapter>)adapter; | adapter: 当前适配器 | 在广告跳过事件触发时调用 |
| - (void)interstitialAdDidClose:(id<AWMCustomInterstitialAdapter>)adapter; | adapter: 当前适配器 | 在广告关闭事件触发时调用 |
| - (void)interstitialAd:(id<AWMCustomInterstitialAdapter>)adapter didPlayFinishWithError:(NSError *)error; | adapter: 当前适配器 error: 广告视频播放的错误信息 | 在视频播放结束或者播放错误事件触发是调用 |
原生广告(Native)
协议内容
自定义Native adapter中需要实现的协议为AWMCustomNativeAdapter,接口实现如下所示:
| 方法名 | 说明 |
|---|---|
| - (instancetype)initWithBridge:(id<AWMCustomNativeAdapterBridge>)bridge; | 构造函数,开发者需要通过bridge通知ToBid广告回调的各个状态 |
| - (void)loadAdWithPlacementId:(NSString *)placementId adSize:(CGSize)size parameter:(AWMParameter *)parameter; | 加载广告 |
| - (void)didReceiveBidResult:(AWMMediaBidResult *)result; | 回调客户端竞价结果,比价成功时回传成功;比价失败、返回超时或价格低于竞价底价时回传失败 |
| - (void)destory; | 在该回调中主要做一些释放逻辑 |
广告对象AWMMediatedNativeAd
收到第三方广告加载成功时,需要将将第三方返回的广告转换为ToBid识别的AWMMediatedNativeAd对象,AWMMediatedNativeAd接口如下:
@interface AWMMediatedNativeAd : NSObject
// 广告物料,包含有最全的广告数据 [optional](仅自渲染需要赋值,模版渲染时可设置为nil)
@property (nonatomic, strong) id<AWMMediatedNativeAdData> data;
// 广告视图创建对象,对常用广告展示元素进行创建 [required]
@property (nonatomic, strong) id<AWMMediatedNativeAdViewCreator> viewCreator;
// 广告视图对象,一般指原生广告的根视图 [optional](部分adn的自渲染可能为空)
@property (nonatomic, strong) UIView *view;
// adn获取到的原始广告数据 [required] (adn广告回调的原始数据,通过该数据建立对应关系)
@property (nonatomic, strong) id originMediatedNativeAd;
@end注意事项:
- data: 详细内容参考AWMMediatedNativeAdData.h文件;
- viewCreator: 详细内容参考AWMMediatedNativeAdViewCreator.h文件;
- originMediatedNativeAd:这个为必要参数,聚合通过这个参数来识别具体为哪个信息流广告,一般需要设置为adn广告回调中返回的数据,通常对应自渲染广告来说设置为adn返回的返回对象,对应模版渲染的广告来时,通常设置为模版View;
- view: 针对模版渲染,统一设置为模版View; 针对自渲染,一般为adn提供的信息流的根视图View,某些渠道可能为nil;
自渲染元素
在接入原生自渲染时,AWMMediatedNativeAd对象中data属性为必要属性,其中data需要遵循AWMMediatedNativeAdData协议,协议内容如下:
@protocol AWMMediatedNativeAdData <NSObject>
/// 广告标题
@property (nonatomic, copy) NSString *title;
/// 广告详情描述
@property (nonatomic, copy) NSString *desc;
/// app类型广告的广告商app图标,
@property (nonatomic, copy) NSString *iconUrl;
/// 按钮文案,例如'下载/安装'
@property (nonatomic, copy) NSString *callToAction;
/// app评分,区间为0-5
@property (nonatomic, assign) double rating;
/// 图片/视频模式
@property (nonatomic, assign) AWMMediatedNativeAdMode adMode;
@end加载广告
在原生广告的adapter中使用如下方法完成广告加载,其中parameter参数包括了本次广告加载的所有数据,支持的参数详见下方加载参数部分,更完整信息请查看AWMAdLoadingParam.h文件。
@interface XXCSJCustomNativeAdapter ()
@property (nonatomic, weak) id<AWMCustomNativeAdapterBridge> bridge;
@property (nonatomic, strong) BUNativeAdsManager *nativeAdsManager;
@end
@implementation XXCSJCustomNativeAdapter
- (instancetype)initWithBridge:(id<AWMCustomNativeAdapterBridge>)bridge {
self = [super init];
if (self) {
_bridge = bridge;
}
return self;
}
- (void)loadAdWithPlacementId:(NSString *)placementId adSize:(CGSize)size parameter:(AWMParameter *)parameter {
BUAdSlot *adSlot = [[BUAdSlot alloc] init];
adSlot.ID = placementId;
adSlot.AdType = BUAdSlotAdTypeFeed;
adSlot.supportRenderControl = YES;
BUProposalSize propSize = BUProposalSize_Feed690_388;
NSString *imgType = [parameter.customInfo objectForKey:@"imgType"];
if ([imgType isEqualToString:@"1"]) {
propSize = BUProposalSize_Feed228_150;
}
BUSize *imgSize = [BUSize sizeBy:propSize];
adSlot.imgSize = imgSize;
adSlot.position = BUAdSlotPositionFeed;
//高度为0是自适应
adSlot.adSize = size;
self.nativeAdsManager = [[BUNativeAdsManager alloc] initWithSlot:adSlot];
self.nativeAdsManager.delegate = self;
if (parameter.isHeaderBidding) {
[self.nativeAdsManager loadAdDataWithCount:1];
}else {
NSUInteger count = [[parameter.extra objectForKey:AWMAdLoadingParamNALoadAdCount] integerValue];
[self.nativeAdsManager loadAdDataWithCount:count];
}
}
/// 穿山甲广告加载成功回调
- (void)nativeAdsManagerSuccessToLoad:(BUNativeAdsManager *)adsManager nativeAds:(NSArray<BUNativeAd *> *)nativeAdDataArray {
NSMutableArray *adArray = [[NSMutableArray alloc] init];
for (BUNativeAd *nativeAd in nativeAdDataArray) {
nativeAd.delegate = self;
AWMMediatedNativeAd *mNativeAd = [[AWMMediatedNativeAd alloc] init];
mNativeAd.data = [[XXCSJNativeAdData alloc] initWithAd:nativeAd];
mNativeAd.originMediatedNativeAd = nativeAd;
BUNativeAdRelatedView *adView = [[BUNativeAdRelatedView alloc] init];
mNativeAd.viewCreator = [[XXCSJNativeAdViewCreator alloc] initWithNativeAd:nativeAd adView:adView];
[adArray addObject:mNativeAd];
}
[self.bridge nativeAd:self.adapter didLoadWithNativeAds:adArray];
}
- (void)nativeAdsManager:(BUNativeAdsManager *)adsManager didFailWithError:(NSError *)error {
[self.bridge nativeAd:self.adapter didLoadFailWithError:error];
}
@end具体代码可以参考Demo中原生广告模块:Adapter/CSJ/native/XXCSJCustomNativeAdapter.m文件
回调协议
开发者需通过回调方式将广告加载/展示/交互情况通知到ToBid,以保证流程的完整性。协议内容详见AWMCustomSplashAdapterBridge.h协议。
@protocol AWMCustomNativeAdapterBridge <AWMCustomAdapterBridge>
@optional
#pragma mark - Load
/// 在广告数据成功返回时调用该方法,直接调用即可,无需做响应判断
/// @param adapter 当前适配器
/// @param ext 回传信息
/// @warning 如何开启了客户端bidding,则ext中需要回传price和货币类型
- (void)nativeAd:(id<AWMCustomNativeAdapter>_Nonnull)adapter
didAdServerResponseWithExt:(NSDictionary *_Nonnull)ext;
/// 在广告加载完成时调用该方法,直接调用即可,无需做响应判断
/// @param adapter 当前适配器
/// @param ads 广告数据组
- (void)nativeAd:(id<AWMCustomNativeAdapter>_Nonnull)adapter
didLoadWithNativeAds:(NSArray<AWMMediatedNativeAd *> *_Nonnull)ads;
/// 在广告加载失败时调用该方法,直接调用即可,无需做响应判断
/// @param adapter 当前适配器
/// @param error 错误信息
- (void)nativeAd:(id<AWMCustomNativeAdapter>_Nonnull)adapter
didLoadFailWithError:(NSError *_Nonnull)error;
#pragma mark - View
/// 广告展示时调用该方法,直接调用即可,无需做响应判断
/// @param adapter 当前适配器
/// @param nativeAd 广告数据,native广告请传递原始数据(即AWMMediatedNativeAd.originMediatedNativeAd),express广告请传递上报ToBid的UIView
- (void)nativeAd:(id<AWMCustomNativeAdapter>_Nonnull)adapter
didVisibleWithMediatedNativeAd:(id _Nonnull)nativeAd;
/// 广告点击事件时调用该方法,直接调用即可,无需做响应判断
/// @param adapter 当前适配器
/// @param nativeAd 广告数据,native广告请传递原始数据(即AWMMediatedNativeAd.originMediatedNativeAd),express广告请传递上报ToBid的UIView
- (void)nativeAd:(id<AWMCustomNativeAdapter>_Nonnull)adapter
didClickWithMediatedNativeAd:(id _Nonnull)nativeAd;
/// 在广告即将展示详情页时调用,直接调用即可,无需做响应判断
/// @param adapter 当前适配器
/// @param nativeAd 广告数据,native广告请传递原始数据(即AWMMediatedNativeAd.originMediatedNativeAd),express广告请传递上报ToBid的UIView
- (void)nativeAd:(id<AWMCustomNativeAdapter>_Nonnull)adapter
willPresentFullScreenModalWithMediatedNativeAd:(id _Nonnull)nativeAd;
/// 在广告落地页关闭时调用,直接调用即可,无需做响应判断
/// @param adapter 当前适配器
/// @param nativeAd 广告数据,native广告请传递原始数据(即AWMMediatedNativeAd.originMediatedNativeAd),express广告请传递上报ToBid的UIView
- (void)nativeAd:(id<AWMCustomNativeAdapter>_Nonnull)adapter
didDismissFullScreenModalWithMediatedNativeAd:(id _Nonnull)nativeAd;
/// 在模板广告关闭的时候调用,直接调用即可,无需做响应判断
/// @param adapter 当前适配器
/// @param nativeAd 广告数据,native广告请传递原始数据(即AWMMediatedNativeAd.originMediatedNativeAd),express广告请传递上报ToBid的UIView
/// @param filterWords 用户手动关闭时的关闭原因描述
- (void)nativeAd:(id<AWMCustomNativeAdapter>_Nonnull)adapter
didClose:(id _Nonnull)nativeAd
closeReasons:(NSArray<NSString *> *_Nullable)filterWords;
#pragma mark - Express ad
/// 仅限模板广告,在渲染成功或者模板广告的尺寸更新时调用,直接调用即可,无需做响应判断
/// @param adapter 当前适配器
/// @param expressView 模板广告
- (void)nativeAd:(id<AWMCustomNativeAdapter>_Nonnull)adapter
renderSuccessWithExpressView:(UIView *_Nonnull)expressView;
/// 仅限模板广告,在渲染失败调用,直接调用即可,无需做响应判断
/// @param adapter 当前适配器
/// @param expressView 模板广告
- (void)nativeAd:(id<AWMCustomNativeAdapter>_Nonnull)adapter
renderFailWithExpressView:(UIView *_Nonnull)expressView
andError:(NSError *_Nonnull)error;
#pragma mark - Video
/// 视频广告中视频播放状态变更的时候调用,直接调用即可,无需做响应判断
/// @param adapter 当前适配器
/// @param state 播放状态
/// @param nativeAd 广告数据,native广告请传递原始数据(即AWMMediatedNativeAd.originMediatedNativeAd),express广告请传递上报ToBid的UIView
- (void)nativeAd:(id<AWMCustomNativeAdapter>_Nonnull)adapter
videoStateDidChangedWithState:(WindMillMediaPlayerStatus)state
andNativeAd:(id _Nonnull)nativeAd;
@end综合比价支持
介绍
使自定义ADN的广告加载提供实时价格反馈渠道,参与到ToBid的竞价逻辑中。在一定程度上实现开发者收益最大化。
参数下发
所有广告类型中,AWMParameter参数中isHeaderBidding参数,该参数声明开发者在ToBid平台配置的ADN广告竞价类型:
isHeaderBidding为NO:表示普通广告位; isHeaderBidding为YES:表示客户端竞价广告位;
价格回调
参与比价的价格应通过对应广告类型回调协议中的ext设置AWMMediaAdLoadingExtECPM回调字段回传到ToBid参与比价,该值为NSString类型,单位为分。
注意:
- 如ADN广告为非竞价类型,则AWMMediaAdLoadingExtECPM回传价格无效;
- 如ADN广告为竞价类型,但AWMMediaAdLoadingExtECPM值类型或内容错误,则无法参与比价。
- 如ADN广告为竞价类型,此时默认货币类型为CNY,如需美元,请在会传价格的同时,通过AWMMediaAdLoadingExtCurrency会传货币单位;目前支持CNY、USD。
比价结果通知
各广告Adapter协议中新增协议接口- (void)didReceiveBidResult:(AWMMediaBidResult *)result通知adapter开发者比价结果。
参数为AWMMediaBidResult类对象,该类中包含有竞价的结果信息,详情如下:
| 字段 | 类型 | 说明 |
|---|---|---|
| win | BOOL | 是否在本次竞价中获胜 |
| winnerPrice | NSInteger | 获胜者价格 |
| ext | NSDictionary | 其他补充信息 |
更多信息请参考各广告Adapter协议部分。
示例参考
摘自Demo中XXCSJCustomSplashAdapter类实现,如下:
@interface XXCSJCustomSplashAdapter ()
@property (nonatomic, weak) id<AWMCustomSplashAdapterBridge> bridge;
@property (nonatomic, strong) BUSplashAd *splashAd;
@end
@implementation XXCSJCustomSplashAdapter
- (void)didReceiveBidResult:(AWMMediaBidResult *)result {
if (result.win) {
[self.splashAd win:@(result.winnerPrice)];
}else {
[self.splashAd loss:nil lossReason:@"102" winBidder:nil];
}
}
#pragma mark - BUSplashAdDelegate
- (void)splashAdLoadSuccess:(BUSplashAd *)splashAd {
NSString *price = [[splashAd.mediaExt objectForKey:@"price"] stringValue];
[self.bridge splashAd:self didAdServerResponseWithExt:@{
AWMMediaAdLoadingExtECPM: price
}];
}
- (void)splashAdRenderSuccess:(BUSplashAd *)splashAd {
[self.bridge splashAdDidLoad:self];
}
- (void)splashAdLoadFail:(BUSplashAd *)splashAd error:(BUAdError *)error {
WindmillLogDebug(@"CSJ", @"%@", NSStringFromSelector(_cmd));
[self.bridge splashAd:self didLoadFailWithError:error ext:nil];
}
@end