开屏广告

简介

开屏广告主要是 APP 启动时展示的全屏广告视图,开发者只要按照接入标准就能够展示设计好的视图

开屏兜底配置说明

针对应用首次安装后由于首次调用开屏时聚合广告配置尚未获取导致开屏未能按平台预期设置请求,SDK新增了API给开发者以解决此问题,针对不同广告平台,开发者需要传递广告平台的各项参数给SDK的API,SDK将直接发起请求(只会针对设置的那一家广告平台进行请求,SDK聚合广告配置获取成功后,后续将按照平台配置请求广告)。

目前SDK支持的开屏ADN有:CSJ、Mintegral、Ks、GDT、百度、Sigmob。

注意: 该配置需要在Load前设置。

接口说明

/**
 Optional:
在广告位配置拉取失败后,会使用传入的rit和appID兜底,进行广告加载,需要在创建manager时就调用该接口(仅支持穿山甲/Mintegral/Ks/GDT/百度),
 */
- (void)setUserData:(CloooudSplashUserData *_Nonnull)userData error:(NSError ** )error;
- 

开发者兜底信息类CloooudSplashUserData说明

@interface CloooudSplashUserData : NSObject

@property (nonatomic, assign) CloooudAdnType adnType;   // adn类型
@property (nonatomic, copy) NSString * _Nonnull rit;    // adn对应代码位
@property (nonatomic, copy) NSString * _Nonnull appID;  // adn对应appID
@property (nonatomic, copy) NSString * _Nullable appKey;    // adn对应appKey, 没有时可不传

@end

调用示例

//用于在广告位还在失败,采用传入的rit进行广告加载;该配置需要在load前设置
CloooudSplashUserData *userData = [[CloooudSplashUserData alloc] init];
userData.adnName = 'pangle';
userData.appID = @"500546";     // 如果使用穿山甲兜底,请务必传入与聚合SDK初始化时一致的appID
userData.rit = @"800546808";    // 开屏对应的代码位
NSError *error = nil;

// 在广告位配置拉取失败后,会使用传入的rit和appID兜底,进行广告加载,需要在创建manager时就调用该接口(仅支持穿山甲/Mintegral/Ks/GDT/百度)
[sSelf.splashAd setUserData:userData error:&error];
// !!!如果有错误信息说明setUserData调用有误,需按错误提示重新设置
if (error) {
    CloooudD_Log2(@"%@",error);
}

// 广告加载, 前置设置无错误时在加载广告
[sSelf.splashAd loadAdData];

本地缓存配置说明

简介

SDK支持开发者将应用下跨广告位的瀑布流配置导出,在应用发版前导入到客户端中,确保应用首次冷启动时能及时发起广告请求,减少配置拉取失败率,提高首次冷启动的广告展示率。针对开屏而言,与自定义兜底方案相比,收益提升更显著。

注意事项

  1. 应用发版前建议:

操作指引

在媒体平台,找到需要配置的应用ID,点击到应用详情页,下拉导出数据列表,点击“导出配置信息”,参考示例填写SDK版本、包名、版本号、其他ADN版本号后,即可完成配置信息导出。

代码示例

[CloooudAdSDKManager setupSDKWithAppId:@"5000546" config:^CloooudUserConfig *(CloooudUserConfig *c) {

c.advanceSDKConfigPath = [[NSBundle mainBundle] pathForResource:@"config-ios-5000546" ofType:@"json"];

return c;

}];

开屏广告接口说明

/// 开屏广告管理类
@interface CloooudSplashAd : CloooudBaseAd

/// 广告位ID,只读
@property (readonly) NSString *adUnitID;

/// 开屏广告构建方法
/// @param unitID 广告位ID
- (instancetype)initWithAdUnitID:(NSString *)unitID;

/// 代理回调对象
@property (nonatomic, weak) id<CloooudSplashAdDelegate> delegate;

/// 最大等待加载时长,单位秒,,默认3秒。实现由adapter确定
@property (nonatomic, assign) NSTimeInterval tolerateTimeout;

/// 是否需要开启zoomout功能,需要ADN及adapter支持
@property (nonatomic, assign) BOOL needZoomOutIfCan;

/// 【必选】广告事件跳转控制器
@property (nonatomic, weak, nullable) UIViewController *rootViewController;

/// 展示广告
/// @param window 展示window,具体由adapter实现
- (BOOL)showInWindow:(UIWindow *)window;

/// [可选]在广告位配置拉取失败后,会使用传入的rit和appID兜底,进行广告加载,需要在创建manager时就调用该接口
- (void)setUserData:(CloooudSplashUserData *)userData error:(NSError **)error;

/// 自定义底部视图,可以设置一些自定义元素,例如LOGO。如果不设置,广告将按照全屏展示。底部视图最大高度不能超过屏幕高度的25%,否则将按照约定最大高度适配
@property (nonatomic, strong, nullable) UIView *customBottomView;

/// 销毁广告,建议在不需要展示广告时调用,如close时
- (void)destoryAd;

/// optional. Config the behaviour of click splash view.Deafult value is CloooudSplashButtonTypeFullScreen.Now only valid for adn:pangle, baidu.
@property (nonatomic, assign) CloooudSplashButtonType splashButtonType;

/// zoom out 视图,需adn和adapter支持,可能为空
@property (nonatomic, strong, readonly, nullable) CloooudSplashZoomOutView *zoomOutView;

/// The display priority of cardview is higher than that of zoomview. Now only valid for adn:pangle.
@property (nonatomic, assign) BOOL supportCardView; // default is NO

/// When it is support splash card advertisement, it has value. Now only valid for adn:pangle.
@property (nonatomic, strong, readonly, nullable) CloooudSplashCardView *cardView;

@property (nonatomic, assign, readonly) BOOL isReady;

/// 广告的扩展信息,可能为nil
- (NSDictionary *_Nullable)extraData;

/// 填充后可调用,获取广告中的extra信息。目前只支持穿山甲,并且只支持获取coupon, live_room, product信息。
- (nullable NSDictionary *)getMediaExtraInfo;

@end

回调监听

/// 开屏广告回调协议
@protocol CloooudSplashAdDelegate <NSObject>

@optional

/// 广告加载成功回调
/// @param splashAd 广告管理对象
- (void)splashAdDidLoad:(CloooudSplashAd *)splashAd;

/// 广告加载失败回调
/// @param splashAd 广告管理对象
/// @param error 出错信息
- (void)splashAd:(CloooudSplashAd *)splashAd didFailWithError:(NSError *_Nullable)error;

/// 广告即将展示回调
/// @param splashAd 广告管理对象
- (void)splashAdWillVisible:(CloooudSplashAd *)splashAd;

/// 广告展示失败回调
/// @param splashAd 广告管理对象
/// @param error 展示失败原因
- (void)splashAdDidShowFailed:(CloooudSplashAd *_Nonnull)splashAd error:(NSError *)error;

/// 广告点击事件回调
/// @param splashAd 广告管理对象
- (void)splashAdDidClick:(CloooudSplashAd *)splashAd;

/// 广告关闭事件回调
/// @param splashAd 广告管理对象
- (void)splashAdDidClose:(CloooudSplashAd *)splashAd;

/// 广告即将展示广告详情页回调
/// @param splashAd 广告管理对象
- (void)splashAdWillPresentFullScreenModal:(CloooudSplashAd *)splashAd;

/// 关闭广告详情页回调
/// @param splashAd 广告管理对象
- (void)splashAdWillDismissFullScreenModal:(CloooudSplashAd *)splashAd;

/// 广告倒计时结束回调
/// @param splashAd 广告管理对象
- (void)splashAdCountdownToZero:(CloooudSplashAd *)splashAd;

/// 模板开屏广告播放完成回调
/// @param splashAd 广告管理对象
/// @param error 播放出现的错误信息
- (void)splashAd:(CloooudSplashAd *)splashAd didPlayFinishWithError:(NSError *)error;

@end

自定义底部View

开发者可自定义开屏底部View,用于logo展示等个性化设置。自定义底部View的最大高度不得超过屏幕高度的25%,设置值超过则取25%有效值。

核心属性设置为

// 自定义底部视图,可以设置一些自定义元素,例如LOGO。如果不设置,广告将按照全屏展示。底部视图最大高度不能超过屏幕高度的25%,否则将按照约定最大高度适配

@property (nonatomic, strong, nullable) UIView *customBottomView;

如有需要,开发者需要在Load之前进行设置。

开屏点睛功能

该功能对应穿山甲的开屏点睛和GDT的V+视频功能,需要对应SDK版本支持方可使用。且该功能需要在对应第三方adn的广告平台进行配置。

开屏点睛广告在开屏广告呈现过程中,用户点击跳过或曝光结束后,可由开发者作相关配置继续在APP右下角继续展示一定时间。SDK提供收缩后的开屏View供开发者做个性化操作。

主要接口

// 开屏点睛处理时机
typedef NS_ENUM (NSInteger, CloooudAddOccasionType) {
    CloooudAddOccasionTypeWhenLoad = 0,       // 需要在load回调里处理开屏点睛视图CloooudSplashZoomOutView,eg:gdt
    CloooudAddOccasionTypeWhenClose,          // 需要在close回调里处理开屏点睛视图CloooudSplashZoomOutView,eg:pangle
};


/// 跳转控制器
@property (nonatomic, weak, nullable) UIViewController *rootViewController;

/// 代理对象
@property (nonatomic, weak, nullable) id<CloooudZoomOutSplashAdDelegate> delegate;

/// 建议展示尺寸
@property (nonatomic, assign, readonly) CGSize suggestedSize;

/// zoom out view 是否有自己的动画实现
@property (nonatomic, assign, readonly) BOOL hasAnimation;

/// 开屏点睛处理时机
@property (nonatomic, assign) CloooudAddOccasionType addOccasionType;

开屏点睛View代理

@protocol CloooudZoomOutSplashAdDelegate <NSObject>
@optional
/// This method is called when splash ad is clicked.
/// @param splashZoomOutView zoom out view


/// 开屏广告zoomoutview点击事件回调
/// @param splashZoomOutView zoom out view
- (void)splashZoomOutViewAdDidClick:(UIView *_Nonnull)splashZoomOutView;

/// 开屏广告zoomoutview关闭事件回调
/// @param splashZoomOutView zoom out view
- (void)splashZoomOutViewAdDidClose:(UIView *_Nonnull)splashZoomOutView;

/// 开屏广告zoomoutview已经打开全屏页面事件回调
/// @param splashZoomOutView zoom out view
- (void)splashZoomOutViewAdDidPresentFullScreenModal:(UIView *_Nonnull)splashZoomOutView;

/// 开屏广告zoomoutview已经关闭全屏页面事件回调
/// @param splashZoomOutView zoom out view
- (void)splashZoomOutViewAdDidDismissFullScreenModal:(UIView *_Nonnull)splashZoomOutView;

@end

当需要使用开屏点睛时需要在开屏类创建时对如下属性做YES设置

// 是否需要开启zoomout功能,需要ADN及adapter支持
@property (nonatomic, assign) BOOL needZoomOutIfCan;

当命中开屏点睛时,收缩的View会在返回的splashAd的zoomOutView属性赋值

// zoom out 视图,需adn和adapter支持,可能为空
@property (nonatomic, strong, readonly) CloooudSplashZoomOutView * _Nullable zoomOutView;

当zoomOutView不为nil时表示命中开屏点睛,开发者需要在Load回调中来判断是否命中了开屏点睛。然后根据addOccasionType属性来决定处理的时机

// 开屏点睛处理时机
typedef NS_ENUM (NSInteger, CloooudAddOccasionType) {
    CloooudAddOccasionTypeWhenLoad = 0,   // 需要在load回调里处理开屏点睛视图CloooudSplashZoomOutView,eg:gdt
    CloooudAddOccasionTypeWhenClose,      // 需要在close回调里处理开屏点睛视图CloooudSplashZoomOutView,eg:pangle
};

处理开屏点睛

CloooudAddOccasionTypeWhenLoad

- (void)splashAdDidLoad:(CloooudSplashAd *_Nonnull)splashAd {
    self.selectedView.showInvalid = YES;
    self.selectedView.promptStatus = CloooudDPromptStatusAdLoaded;

    CloooudD_LogCallback(@"%s", __func__);

    // 命中开屏点睛
    if (self.splashAd.zoomOutView) {
        // 需要在load回调处理开屏点睛
        if(self.splashAd.zoomOutView.addOccasionType == CloooudAddOccasionTypeWhenLoad) {
            // 处理收缩的开屏点睛View
            [self _showZoomOutView];
        } else {
            // 请在其他时机处理,eg:close回调
        }
    }
}

CloooudAddOccasionTypeWhenClose

- (void)splashAdDidClose:(CloooudSplashAd *_Nonnull)splashAd {
    CloooudD_LogCallback(@"%s", __func__);

    self.selectedView.showInvalid = NO;
    self.selectedView.promptStatus = CloooudDPromptStatusDefault;

    // 命中开屏点睛
    if (self.splashAd.zoomOutView) {
        // 需要在load回调处理开屏点睛
        if(self.splashAd.zoomOutView.addOccasionType == CloooudAddOccasionTypeWhenClose) {
            // 处理收缩的开屏点睛View
            [self _showZoomOutView];
        } else {
            // 请在其他时机处理,eg:close回调
        }
    } else {
        // 非开屏zoomout在此销毁
        [self.splashAd destoryAd];
    }
}

开屏点睛View的处理方式

  1. 开屏点睛View的大小设置:根据suggestedSize,可直接使用建议大小,也可根据suggestedSize宽高比自定义大小
  2. 开屏与点睛View的转场动画:根据hasAnimation判断adn是否自带转场动画,不带的情况下开发者在自行实现,否则可能与原动画冲突或者效果不佳
  3. 其他自定义操作:点睛View本质是给出了一个View,开发者也可按需要增加其他操作。eg:增加拖拽功能,聚合SDK Demo也在UIView+CloooudZoomoutViewDraggable简单实现了一个拖拽功能以供参考。

    示例代码

- (void)_showZoomOutView {
    // Required 设置delegate
    self.splashAd.zoomOutView.delegate = self;
    // Required设置zoomOutView的根vc,不设置默认和splashAd的一致;!!!若要更改该设置,必须在splashAdshow之后进行赋值
    self.splashAd.zoomOutView.rootViewController = self;
    // Required 将zoomout view添加到视图
    [self.view addSubview:self.splashAd.zoomOutView];
​
    // Required size值时为SDK给定的建议值或比例(且最小不得小于suggestedSize)
    CGSize zoomoutSize = CGSizeMake(200, 420);
    if (self.splashAd.zoomOutView.suggestedSize.width > 0 &&
        self.splashAd.zoomOutView.suggestedSize.height > 0) {
        // 可使用sdk建议的大小
        zoomoutSize = self.splashAd.zoomOutView.suggestedSize;
        // 也可按size比例自定义大小
//        zoomoutSize.height = zoomoutSize.width * self.splashAd.zoomOutView.suggestedSize.height / self.splashAd.zoomOutView.suggestedSize.width;
    }
    // 开发者可根据实际需要布局zoomOutView大小位置; 同时开发者亦可增加更多多样化的设置来丰富zoomOutView功能,eg:动画展示,支持手动拖拽等
    // view拖拽支持, 开发者亦可自行实现该功能
    [self.splashAd.zoomOutView supportDrag];
​
    // 若adn的开屏点睛没有自带动画,开发者可按实际情况自行实现动画
    if (!self.splashAd.zoomOutView.hasAnimation) {
        // 简单动画示例,开发者亦可自行实现更好的动画效果
        [UIView transitionWithView:self.splashAd.zoomOutView duration:0.25 options:UIViewAnimationOptionCurveEaseOut animations:^{
    //         origin位置按需设置
            CGRect rect = CGRectMake(414-zoomoutSize.width-60, 818-zoomoutSize.height-60, zoomoutSize.width, zoomoutSize.height);
            self.splashAd.zoomOutView.frame = rect;
        } completion:nil];
    } else {
        // origin位置按需设置
        CGRect rect = CGRectMake(414-zoomoutSize.width-60, 818-zoomoutSize.height-60, zoomoutSize.width, zoomoutSize.height);
        self.splashAd.zoomOutView.frame = rect;
    }
}

开屏卡片功能

该功能对应穿山甲的开屏卡片功能,需要对应SDK版本支持方可使用。

开屏卡片广告在开屏广告自动播放完成后,新增的卡片广告联动形式。

主要接口

@interface CloooudSplashCardView : UIView

@property (nonatomic, weak, nullable) id<CloooudSplashCardViewDelegate> delegate;

- (void)showSplashCardInRootVC:(UIViewController *)rootVC;

@end

开屏卡片View代理

@protocol CloooudSplashCardViewDelegate <NSObject>
@optional

/// 开屏广告Cardview点击事件回调
/// @param splashCardView card view
- (void)splashCardViewAdDidClick:(CloooudSplashCardView *_Nonnull)splashCardView;

/// 开屏广告Cardview关闭事件回调
/// @param splashCardView card view
- (void)splashCardViewAdDidClose:(CloooudSplashCardView *_Nonnull)splashCardView;

/// 开屏广告Cardview已经打开全屏页面事件回调
/// @param splashCardView card view
- (void)splashCardViewAdDidPresentFullScreenModal:(CloooudSplashCardView *_Nonnull)splashCardView;

/// 开屏广告Cardview已经关闭全屏页面事件回调
/// @param splashCardView card view
- (void)splashCardViewAdDidDismissFullScreenModal:(CloooudSplashCardView *_Nonnull)splashCardView;

@end

当需要使用开屏卡片时需要在开屏类创建时对如下属性做YES设置


// cardview的显示优先级高于zoomview。现在只对CSJ有效。
@property (nonatomic, assign) BOOL supportCardView; // 默认是 NO

当命中开屏卡片时,出现的view会在返回的splashAd的cardView属性赋值

//开屏卡片view时,有值,只支持CSJ
@property (nonatomic, strong, readonly, nullable) CloooudSplashCardView *cardView;

当cardView不为nil时表示命中开屏卡片,开发者需要在splashAdCountdownToZero回调中来判断是否命中了开屏卡片。然后处理开屏卡片

- (void)splashAdCountdownToZero:(CloooudSplashAd *_Nonnull)splashAd {
    if (splashAd.cardView) {
        splashAd.cardView.delegate = self;
        [splashAd.cardView showSplashCardInRootVC:self];
    }
}

调用示例

// 广告类创建
self.splashAd = [[CloooudSplashAd alloc]initWithAdUnitID:slotId];
// 如果需要场景,请设置该属性
self.splashAd.scenarioID = @"xxx";
self.splashAd.rootViewController =self;    //required
self.splashAd.delegate = sSelf;
self.splashAd.tolerateTimeout = 3.f;
//用于在未曾拉取到广告配置时,采用传入的rit进行告加载;该配置需要在load前设置(所谓兜底)
CloooudSplashUserData *userData =[[CloooudSplashUserData alloc] init];

userData.adnName = 'pangle';
userData.appID = @"5000546";     // 如果用穿山甲兜底,请务必传入与SDK初始化时一致appID
userData.appKey = @"";
userData.rit = @"4000000041";    // 开屏应的代码位
NSError *error = nil;

// 在广告位配置拉取失败后,会使用传入的ritappID兜底,进行广告加载,需要在创建manager时就用该接口(仅支持穿山甲/MTG/Ks/GDT/度)
[self.splashAd setUserData:userDataerror:&error];
// !!!如果有错误信息说明setUserData调用误,需按错误提示重新设置
if (error) {
    CloooudD_Log(@"%@", error);
}
// 广告位normal_splash_ID2用作自定义底部vie的例子
if ([slotIdisEqualToString:normal_splash_ID2]) {
    // 设置自定义底部View,如无必要,请勿设置; 高度设置超范围将按照最大值设置
    if (!_bottomView) {
        _bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kCloooudDMINScreenSide, 400)];
        _bottomView.backgroundColor = [UIColor redColor];
    }
    //  self.splashAd.customBottomView = _bottomView;
}

// 是否需要开屏点睛功能,如果需要请设置YES
self.splashAd.needZoomOutIfCan = YES;

// 开屏点击区域类型,仅对支持该设置的adn效!!!  eg:穿山甲
self.splashAd.splashButtonType =CloooudSplashButtonTypeFullScreen;

// 广告加载, 前置设置无错误时在加载广告
[self.splashAd loadAdData];

回调处理

#pragma mark <---CloooudSplashAdDelegate--->
/// 广告加载成功回调
- (void)splashAdDidLoad:(CloooudSplashAd *_Nonnull)splashAd {
    self.selectedView.showInvalid = YES;
    self.selectedView.promptStatus = CloooudDPromptStatusAdLoaded;

    CloooudD_LogCallback(@"%s", __func__);
}

/// 广告加载失败回调
/// @param splashAd 广告管理对象
/// @param error 出错信息
- (void)splashAd:(CloooudSplashAd *_Nonnull)splashAd didFailWithError:(NSError *_Nullable)error {
    self.selectedView.showInvalid = NO;
    self.selectedView.promptStatus = CloooudDPromptStatusAdLoadedFail;

    CloooudD_LogCallback(@"%s:%@", __func__, error);
}

/// 广告即将展示回调
/// @param splashAd 广告管理对象
- (void)splashAdWillVisible:(CloooudSplashAd *_Nonnull)splashAd {
    CloooudD_LogCallback(@"%s", __func__);

    CloooudD_Log(@"ecpm:%@", [self.splashAd getPreEcpm]);
    CloooudD_Log(@"platformID:%ld", (long)[self.splashAd getAdNetworkPlaformId]);
    CloooudD_Log(@"ritID:%@", [self.splashAd getAdNetworkRitId]);
    CloooudD_Log(@"waterfallFillFailMessages:%@", [splashAd waterfallFillFailMessages]);
}

/// 广告展示失败回调
/// @param splashAd 广告管理对象
/// @param error 展示失败原因
- (void)splashAdDidShowFailed:(CloooudSplashAd *)splashAd error:(NSError *)error {
    CloooudD_LogCallback(@"%s", __func__);
}

/// 广告点击事件回调
/// @param splashAd 广告管理对象
- (void)splashAdDidClick:(CloooudSplashAd *_Nonnull)splashAd {
    CloooudD_LogCallback(@"%s", __func__);
}

/// 广告关闭事件回调
/// @param splashAd 广告管理对象
- (void)splashAdDidClose:(CloooudSplashAd *_Nonnull)splashAd {
    CloooudD_LogCallback(@"%s", __func__);

    self.selectedView.showInvalid = NO;
    self.selectedView.promptStatus = CloooudDPromptStatusDefault;

    // 开屏zoomout
    if (self.splashAd.zoomOutView) {
        // 处理收缩的开屏点睛View
        [self _showZoomOutView];
    } else {
        // 非开屏zoomout在此销毁
        [self.splashAd destoryAd];
    }
}

/// 广告即将展示广告详情页回调
/// @param splashAd 广告管理对象
- (void)splashAdWillPresentFullScreenModal:(CloooudSplashAd *_Nonnull)splashAd {
    CloooudD_LogCallback(@"%s", __func__);
}

/// 关闭广告详情页回调
/// @param splashAd 广告管理对象
- (void)splashAdWillDismissFullScreenModal:(CloooudSplashAd *)splashAd {
    CloooudD_LogCallback(@"%s", __func__);
}

/// 广告倒计时结束回调
/// @param splashAd 广告管理对象
- (void)splashAdCountdownToZero:(CloooudSplashAd *_Nonnull)splashAd {
    CloooudD_LogCallback(@"%s", __func__);
}

- (void)_showZoomOutView {
    // Required 设置delegate
    self.splashAd.zoomOutView.delegate = self;
    // 设置zoomOutView的根vc,不设置默认和splashAd的一致;!!!若要更改该设置,必须在splashAdshow之后进行赋值
    self.splashAd.zoomOutView.rootViewController = self;
    // Required 将zoomout view添加到视图
    [self.view addSubview:self.splashAd.zoomOutView];
    self.splashAd.zoomOutView.center = self.view.center;
    // 当suggestedSize有值时为SDK给定的建议值或比例
    CGSize zoomoutSize = CGSizeMake(72, 108);
    if (self.splashAd.zoomOutView.suggestedSize.width > 0 &&
        self.splashAd.zoomOutView.suggestedSize.height > 0) {
        // 可使用sdk建议的大小
        // zoomoutSize = self.splashAd.zoomOutView.suggestedSize;
        // 也可按比例设置
        zoomoutSize.height = self.splashAd.zoomOutView.suggestedSize.height*zoomoutSize.width/self.splashAd.zoomOutView.suggestedSize.width;
    }

    // 开发者可根据实际需要布局zoomOutView大小位置; 同时开发者亦可增加更多多样化的设置来丰富zoomOutView功能,eg:动画展示,支持手动拖拽等
    // view拖拽支持, 开发者亦可自行实现该功能
    [self.splashAd.zoomOutView supportDrag];
    // 简单动画展示示例,开发者亦可自行实现更好看的动画
    [UIView transitionWithView:self.splashAd.zoomOutView duration:0.25 options:UIViewAnimationOptionCurveEaseOut animations:^{
        // origin位置按需设置
        self.splashAd.zoomOutView.frame = CGRectMake(300, 680, zoomoutSize.width, zoomoutSize.height);
    } completion:nil];
}

#pragma mark <---CloooudZoomOutSplashAdDelegate--->
/// 开屏广告zoomoutview点击事件回调
/// @param splashZoomOutView zoom out view
- (void)splashZoomOutViewAdDidClick:(UIView *_Nonnull)splashZoomOutView {
    CloooudD_LogCallback(@"%s", __func__);
}

/// 开屏广告zoomoutview关闭事件回调
/// @param splashZoomOutView zoom out view
- (void)splashZoomOutViewAdDidClose:(UIView *_Nonnull)splashZoomOutView {
    CloooudD_LogCallback(@"%s", __func__);
    // 开屏zoomout在此销毁
    [self.splashAd destoryAd];
}

/// 开屏广告zoomoutview已经关闭全屏页面事件回调
/// @param splashZoomOutView zoom out view
- (void)splashZoomOutViewAdDidDismissFullScreenModal:(UIView *_Nonnull)splashZoomOutView {
    CloooudD_LogCallback(@"%s", __func__);
}

注意: SDK展示失败回调(splashAdDidShowFailed: error:),主要针对以下几种情况: 无可用广告,错误码:40052 三方adn返回的展示失败,错误码:具体由三方而定 详细调用事例参见Demo.