横幅

简介

需要初始化时配置广告基本信息。例如期望尺寸,为避免渲染过程产生广告视图形变,务必和媒体平台配置相同尺寸。通过设置CloooudBannerAdDelegate代理,获取广告、展示、点击、关闭等回调。值得注意的是一定要设置rootViewController,即跳转落地页需要的viewController

注意事项

  1. Cloooud3100版本开始新增由Cloooud控制的Banner轮播功能,ADN的轮播已关闭,支持广告位级别的轮播配置,需在平台操作,SDK端banner轮播时长设置接口已失效
  2. Cloooud从3400版本开始,支持在banner广告位下支持将信息流广告进行配置混用,模版/自渲染方式均支持,接入事例可参照bannerAdNeedLayoutUI:方法
  1. 在广告接入前需要明确各adn对应Cloooud广告样式情况,以确保正确完成广告接入,避免由于广告类型不匹配导致接入报错等情况的发生
  2. 由于各广告平台对于包名校验规则不同,需确保在穿山甲媒体平台填写的包名符合各adn平台规范,避免由于包名校验不匹配导致的无广告返回情况的产生
  3. 广告请求时机,建议在收到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;
}