Skip to content

自定义广告平台Adapter实现

简介

本文档将介绍在iOS端如何实现自定义广告平台Adapter,主要包括初始化、加载广告、展示广告以及各广告类型的响应事件回调处理。文档中代码截取来源于Demo

支持广告类型

目前支持的广告类型有五种,如下所示:

  • 原生广告(Native)
  • 开屏广告(Splash)
  • Banner广告
  • 激励视频广告(RewardedVideo)
  • 插屏广告(Interstitial)

核心流程实现

  1. 定义Adapter类名,包括配置Adapter以及各广告类型对应Adapter,并遵循相关协议;
  2. 在ToBid开发者平台配置相关信息,详情参见平台部分文档;
  3. 实现协议方法完成初始化(含隐私合规)、广告加载、展示方法及回调,详见下方说明;

常见问题

  1. 自定义Adapter需要按照示例中相应方法含义调用,否则会影响收益;
  2. 及时更新协议版本号为ToBid支持的最新版本,否则可能无法使用;
  3. 自定义Adapter广告load之前需要确保开发者实现了AWMCustomConfigAdapter协议并初始化network成功,network版本号,Adapter版本号均不能为空;
  4. 自定义Adapter广告load成功或者失败只能调用一次;
  5. 所有调用自定义adapter的方法均在主线程,请勿进行耗时操作;
  6. 自定义Adapter支持广告频次控制、广告间隔控制、AB测试;
  7. 自定义Adapter不支持show时预加载、Service bidding、多阶底价。支持Client bidding;
  8. 自定义Adapter广告对象的show、click等回调需要在load广告回调之后;
  9. ToBid已经处理了Banner的轮播,自定义Banner需要禁用轮播;
  10. 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;隐私权限更新,用户更新隐私配置时触发,初始化方法调用前一定会触发一次

示例代码

Objective-C
@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文件。

Objective-C
@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

加载参数

参数名参数类型参数含义
AWMAdLoadingParamLinkIDNSString聚合请求ID
AWMAdLoadingParamMediationRitIDNSString聚合广告位ID
AWMAdLoadingParamMediaNameNSStringADN广告位名称,平台配置名称
AWMAdLoadingParamMediaIDNSStringADN平台ID,平台生成的唯一ID
AWMAdLoadingParamCustomJsonNSString自定义Adapter扩展参数
AWMAdLoadingParamSPCustomBottomViewUIView自定义底部视图
AWMAdLoadingParamSPExpectSizeNSValue/CGSize期望广告尺寸
AWMAdLoadingParamSPCustomBottomViewSizeNSValue/CGSize自定义底部视图尺寸
AWMAdLoadingParamSPTolerateTimeoutNSNumber/NSInteger开屏超时时间

广告展示

在Splash广告的adapter中使用如下方法完成广告展示,更完整信息请查看AWMAdLoadingParam.h文件。

Objective-C
- (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文件。

Objective-C
@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

加载参数

参数名参数类型参数含义
AWMAdLoadingParamLinkIDNSString聚合请求ID
AWMAdLoadingParamMediationRitIDNSString聚合广告位ID
AWMAdLoadingParamMediaNameNSStringADN广告位名称,平台配置名称
AWMAdLoadingParamMediaIDNSStringADN平台ID,平台生成的唯一ID
AWMAdLoadingParamCustomJsonNSString自定义Adapter扩展参数

回调协议

开发者需通过回调方式将广告加载/展示/交互情况通知到ToBid,以保证流程的完整性。协议内容详见AWMCustomSplashAdapterBridge.h协议。

方法名参数说明说明
- (void)bannerAd:(id<AWMCustomBannerAdapter>)adapter didAdServerResponse:(UIView *)bannerView ext:(NSDictionary *)extadapter: 当前适配器 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文件。

Objective-C
@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;
}

加载参数

参数名参数类型参数含义
AWMAdLoadingParamLinkIDNSString聚合请求ID
AWMAdLoadingParamMediationRitIDNSString聚合广告位ID
AWMAdLoadingParamMediaNameNSStringADN广告位名称,平台配置名称
AWMAdLoadingParamMediaIDNSStringADN平台ID,平台生成的唯一ID
AWMAdLoadingParamCustomJsonNSString自定义Adapter扩展参数

广告展示

在激励视频广告的adapter中使用如下方法完成广告展示,更完整信息请查看AWMAdLoadingParam.h文件。

Objective-C
- (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文件。

Objective-C
@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;
}

加载参数

参数名参数类型参数含义
AWMAdLoadingParamLinkIDNSString聚合请求ID
AWMAdLoadingParamMediationRitIDNSString聚合广告位ID
AWMAdLoadingParamMediaNameNSStringADN广告位名称,平台配置名称
AWMAdLoadingParamMediaIDNSStringADN平台ID,平台生成的唯一ID
AWMAdLoadingParamCustomJsonNSString自定义Adapter扩展参数

广告展示

在插屏广告的adapter中使用如下方法完成广告展示,更完整信息请查看AWMAdLoadingParam.h文件。

Objective-C
- (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接口如下:

objective-c
@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协议,协议内容如下:

objective-c
@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文件。

objective-c
@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协议。

objective-c
@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类型,单位为分。

注意:

  1. 如ADN广告为非竞价类型,则AWMMediaAdLoadingExtECPM回传价格无效;
  2. 如ADN广告为竞价类型,但AWMMediaAdLoadingExtECPM值类型或内容错误,则无法参与比价。
  3. 如ADN广告为竞价类型,此时默认货币类型为CNY,如需美元,请在会传价格的同时,通过AWMMediaAdLoadingExtCurrency会传货币单位;目前支持CNY、USD。

比价结果通知

各广告Adapter协议中新增协议接口- (void)didReceiveBidResult:(AWMMediaBidResult *)result通知adapter开发者比价结果。

参数为AWMMediaBidResult类对象,该类中包含有竞价的结果信息,详情如下:

字段类型说明
winBOOL是否在本次竞价中获胜
winnerPriceNSInteger获胜者价格
extNSDictionary其他补充信息

更多信息请参考各广告Adapter协议部分。

示例参考

摘自Demo中XXCSJCustomSplashAdapter类实现,如下:

objective-c
@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