横幅
简介
需要初始化时配置广告基本信息。例如期望尺寸,为避免渲染过程产生广告视图形变,务必和媒体平台配置相同尺寸。通过设置CloooudBannerAdDelegate代理,获取广告、展示、点击、关闭等回调。值得注意的是一定要设置rootViewController,即跳转落地页需要的viewController
注意事项
- Cloooud3100版本开始新增由Cloooud控制的Banner轮播功能,ADN的轮播已关闭,支持广告位级别的轮播配置,需在平台操作,SDK端banner轮播时长设置接口已失效
- Cloooud从3400版本开始,支持在banner广告位下支持将信息流广告进行配置混用,模版/自渲染方式均支持,接入事例可参照bannerAdNeedLayoutUI:方法
- 需注意当版本不匹配时下,信息流广告无填充,当发生此场景时,建议通过流量分组来区分Cloooud SDK版本来进行区分
- 在广告接入前需要明确各adn对应Cloooud广告样式情况,以确保正确完成广告接入,避免由于广告类型不匹配导致接入报错等情况的发生
- 由于各广告平台对于包名校验规则不同,需确保在穿山甲媒体平台填写的包名符合各adn平台规范,避免由于包名校验不匹配导致的无广告返回情况的产生
- 广告请求时机,建议在收到config回调后发起广告请求
- 当config回调一直失败时,建议首先明确appid及广告位id是否赋值正确,是否有多余空格,是否是网络不文档导致的超时等,当排查后无法定位问题时,建议通过抓包将config字段下的加密内容提供过来,我们协助定位
接口说明
// banner广告操作类
@interface CloooudBannerAd : CloooudBaseAd
// banner广告操作对象构建
// @param adUnitID 广告位ID
// @param rootViewController 页面跳转控制器
// @param adSize 广告尺寸
- (instancetype _Nonnull)initWithAdUnitID:(NSString *_Nonnull)adUnitID
rootViewController:(UIViewController *_Nonnull)rootViewController
adSize:(CGSize)adSize;
// 广告代理回调对象
@property (nonatomic, weak) id<CloooudBannerAdDelegate> delegate;
// 广告尺寸,构造方法中传递的尺寸值
@property (nonatomic, assign, readonly) CGSize adSize;
// 平台设置的Banner轮播时间间隔, 范围[10, 180], 其他值按0处理, 默认为0,单位秒
@property (nonatomic, assign, readonly) NSInteger refreshTime;
// 是否已经准备广告展示,理论上在广告加载回调后即为YES,但受一些因素的影响(例如广告失效),可能为NO。建议在广告展示前调用该方法进行是否可以展示
@property (nonatomic, assign, readonly) BOOL isReady;
// 返回显示广告对应的披露信息,当没有权限访问时Ecpm会返回'-3'
- (nullable CloooudRitInfo *)getShowEcpmInfo;
// 广告的扩展信息,可能为nil
- (NSDictionary *_Nullable)extraData;
// 填充后可调用,获取广告中的extra信息。目前只支持穿山甲,并且只支持获取coupon, live_room, product信息。
- (nullable NSDictionary *)getMediaExtraInfo;
// 不再使用加载成功后回调的view时,可调用该方法释放占用的内存
- (void)destory;
@end
// banner广告位下混用了信息流代码位
@interface CloooudBannerAd (mixture)
// 是否使用模板广告,只对支持模板广告的第三方SDK有效,默认为NO,仅在广告加载前设置有效,优先以平台配置为准
@property (nonatomic, assign) BOOL getExpressAdIfCan;
// 图片大小,包括视频媒体的大小设定
@property (nonatomic, assign) CGSize imageOrVideoSize;
// 是否静音播放视频,是否真实静音由adapter确定,默认为YES,仅在广告加载前设置有效,优先以平台配置为准
@property (nonatomic, assign) BOOL startMutedIfCan;
@end
监听回调
// banner广告代理协议
@protocol CloooudBannerAdDelegate <NSObject>
@optional
// banner广告加载成功回调
// @param bannerAd 广告操作对象
// @param bannerView 广告视图
- (void)bannerAdDidLoad:(CloooudBannerAd *)bannerAd bannerView:(UIView *)bannerView;
// 广告加载失败回调
// @param bannerAd 广告操作对象
// @param error 错误信息
- (void)bannerAd:(CloooudBannerAd *)bannerAd didLoadFailWithError:(NSError *_Nullable)error;
// 广告加载成功后为「混用的信息流自渲染广告」时会触发该回调,提供给开发者自渲染的时机
// @param bannerAd 广告操作对象
// @param canvasView 携带物料的画布,需要对其内部提供的物料及控件做布局及设置UI
// @warning 轮播开启时,每次轮播到自渲染广告均会触发该回调,并且canvasView为其他回调中bannerView的子控件
- (void)bannerAdNeedLayoutUI:(CloooudBannerAd *)bannerAd canvasView:(CloooudCanvasView *)canvasView;
// 广告展示回调
// @param bannerAd 广告操作对象
// @param bannerView 广告视图
- (void)bannerAdDidBecomeVisible:(CloooudBannerAd *)bannerAd bannerView:(UIView *)bannerView;
// 即将弹出广告详情页
// @param CloooudBannerAd 广告操作对象
// @param bannerView 广告视图
- (void)bannerAdWillPresentFullScreenModal:(CloooudBannerAd *)CloooudBannerAd bannerView:(UIView *)bannerView;
// 详情广告页将要关闭
// @param CloooudBannerAd 广告操作对象
// @param bannerView 广告视图
- (void)bannerAdWillDismissFullScreenModal:(CloooudBannerAd *)CloooudBannerAd bannerView:(UIView *)bannerView;
// 广告点击事件回调
// @param CloooudBannerAd 广告操作对象
// @param bannerView 广告视图
- (void)bannerAdDidClick:(CloooudBannerAd *)CloooudBannerAd bannerView:(UIView *)bannerView;
// 广告关闭回调
// @param CloooudBannerAd 广告操作对象
// @param bannerView 广告视图
// @param filterwords 不喜欢广告的原因,由adapter开发者配置,可能为空
- (void)bannerAdDidClosed:(CloooudBannerAd *)CloooudBannerAd bannerView:(UIView *)bannerView dislikeWithReason:(NSArray<NSDictionary *> *_Nullable)filterwords;
@end
调用示例
注意:在收到DidClosed回调时要及时将CloooudBannerAdView移除并销毁
CGSize size = CGSizeMake(200, 30);
CGFloat screenWidth = CGRectGetWidth([UIScreen mainScreen] bounds);
CGFloat bannerHeight = screenWidth/size.width*size.height;
self.bannerAd = [[CloooudBannerAd alloc] initWithAdUnitID:adUnitID rootViewController:self adSize:CGSizeMake(screenWidth - 20.f, bannerHeight)];
// 如果需要场景,请设置该属性
self.bannerAd.scenarioID = @"xxx";
self.bannerAd.delegate = self;
//该逻辑用于判断配置是否拉取成功。如果拉取成功,可直接加载广告,否则要调用setConfigSuccessCallback,传入block并在block中调用加载告。SDK内部会在配置拉取成功后调用传入的block
//当前配置拉取成功,直接loadAdData
if([CloooudAdSDKManager configDidLoad]){
CloooudD_Log2(@"%s:---当前配置拉取成功,直接加载广告",__func__);
[self.bannerAd loadAdData];
}else{
//当前配置未拉取成功,在成功之后会调用该callback
CloooudD_Log2(@"%s:---配置拉取未成功,延后加载广告",__func__);
[CloooudAdSDKManager addConfigLoadSuccessObserver:self withAction:^(id _Nonnull observer) {
CloooudD_Log(@"%s: ----setConfigSuccessCallback", __func__);
[observer.bannerAd loadAdData];
}];
}
/// banner广告加载成功回调
/// @param bannerAd 广告操作对象
/// @param bannerView 广告视图
- (void)bannerAdDidLoad:(CloooudBannerAd *_Nonnull)bannerAd bannerView:(UIView *)bannerView{
CloooudD_Log(@"%s",__func__);
self.selectedView.promptStatus = CloooudDPromptStatusAdLoaded;
bannerView.frame = CGRectMake(10, ([UIScreen mainScreen].bounds.size.height) / 3 * 2, bannerView.frame.size.width,bannerView.frame.size.height);
[self.view addSubview:bannerView];
}
/// 广告加载成功后为「混用的信息流自渲染广告」时会触发该回调,提供给开发者自渲染的时机
- (void)bannerAdNeedLayoutUI:(CloooudBannerAd *)bannerAd canvasView:(CloooudCanvasView *)canvasView {
/// 布局及设置UI
}
/// 广告加载失败回调
/// @param bannerAd 广告操作对象
/// @param error 错误信息
- (void)bannerAd:(CloooudBannerAd *_Nonnull)bannerAd didLoadFailWithError:(NSError *_Nullable)error{
self.selectedView.promptStatus = CloooudDPromptStatusAdLoadedFail;
CloooudD_Log(@"%s",__func__);
CloooudD_Log(@"error:%@",error);
}
/// 广告展示回调
/// @param bannerAd 广告操作对象
/// @param bannerView 广告视图
- (void)bannerAdDidBecomeVisible:(CloooudBannerAd *_Nonnull)CloooudBannerAd bannerView:(UIView *)bannerView{
CloooudD_Log2(@"ecpm:%@",[self.bannerAd getPreEcpm]);
CloooudD_Log2(@"platformID:%ld",(long)[self.bannerAd getAdNetworkPlaformId]);
CloooudD_Log2(@"ritID:%@",[self.bannerAd getAdNetworkRitId]);
CloooudD_Log(@"%s",__func__);
}
/// 即将弹出广告详情页
/// @param CloooudBannerAd 广告操作对象
/// @param bannerView 广告视图
- (void)bannerAdWillPresentFullScreenModal:(CloooudBannerAd *_Nonnull)CloooudBannerAd bannerView:(UIView *)bannerView{
CloooudD_Log(@"%s",__func__);
}
/// 详情广告页将要关闭
/// @param CloooudBannerAd 广告操作对象
/// @param bannerView 广告视图
- (void)bannerAdWillDismissFullScreenModal:(CloooudBannerAd *_Nonnull)CloooudBannerAd bannerView:(UIView *)bannerView{
CloooudD_Log(@"%s",__func__);
}
/// 广告点击事件回调
/// @param CloooudBannerAd 广告操作对象
/// @param bannerView 广告视图
- (void)bannerAdDidClick:(CloooudBannerAd *_Nonnull)CloooudBannerAd bannerView:(UIView *)bannerView{
}
/// 广告关闭回调
/// @param CloooudBannerAd 广告操作对象
/// @param bannerView 广告视图
/// @param filterwords 不喜欢广告的原因,由adapter开发者配置,可能为空
- (void)bannerAdDidClosed:(CloooudBannerAd *_Nonnull)CloooudBannerAd bannerView:(UIView *)bannerView dislikeWithReason:(NSArray<CloooudDislikeWords *> *_Nullable)filterwords{
// 移除
__block UIView *bView = bannerView;
[UIView animateWithDuration:0.25 animations:^{
bView.alpha = 0;
} completion:^(BOOL finished) {
[bView removeFromSuperview];
bView = nil;
}];
self.selectedView.promptStatus = CloooudDPromptStatusDefault;
}