插全屏广告
简介
插全屏广告是将原有的插屏广告(CloooudInterstitialAd)和全屏视频广告(CloooudFullscreenVideoAd)结合,在同一个广告类型下支持混出的广告类型
注意事项
- Cloooud是通过广告位ID发起广告请求的,切记不要使用混淆
- 在广告接入前需要明确各adn对应Cloooud广告样式情况,以确保正确完成广告接入,避免由于广告类型不匹配导致接入报错等情况的发生
- 由于各广告平台对于包名校验规则不同,需确保在穿山甲媒体平台填写的包名符合各adn平台规范,避免由于包名校验不匹配导致的无广告返回情况的产生
- 当插屏/全屏广告混用时注意在穿山甲媒体平台勾选的广告类型需与第三方广告平台广告类型保持一致
- 广告请求时机,建议在收到config回调后发起广告请求
- 当config回调一直失败时,建议首先明确appid及广告位id是否赋值正确,是否有多余空格,是否是网络不文档导致的超时等,当排查后无法定位问题时,建议通过抓包将config字段下的加密内容提供过来,我们协助定位
- 为了保证播放流畅,建议在收到interstitialProAdDidLoad:之后进行广告展示,广告展示前可通过isReady字段来判断当前广告是否可用
- interstitialProAdDidDownLoadVideo回调代表视频下载成功,由于插屏一般为插屏图片,不涉及视频下载。为了对齐视频广告,也会有该回调。故,为统一处理插全屏可设置在该回调后展示,避免视频广告缓冲带来的卡顿。在Load回调后展示,对视频广告是在线播放;对插屏图片广告无影响
- 当广告无法展示时,建议在展示失败interstitialProAdDidShowFailed:回调内输出对应的error错误码明确展示失败的原因,如果是穿山甲广告触发此回调,可优先检查是否调整了系统时间导致触发此场景
- 如若针对展示失败有重试机制,建议只重试一次即可,避免无限重试引发死循环场景
- 当展示失败/回调监听不执行时,建议检查是否有广告对象被覆盖或者被提前释放的场景导致,每次发次广告请求时,需要重新创建新的广告来调用广告请求方法
- 为了保证获取数据的准确性, 建议在展示成功interstitialProAdDidVisible:后再获取广告相关信息,如对应的广告平台,代码位ID,cpm等
- 视频是否静音由接口mutedIfCan控制,默认为NO,仅对YLH、KS生效
接口说明
// 插全屏广告管理类
@interface CloooudInterstitialProAd : CloooudBaseAd
// 插屏广告构造方法
// @param adUnitID 广告位ID
// @param sizeForInterstitial 针对插屏(非全屏)期望的广告尺寸
- (instancetype _Nonnull )initWithAdUnitID:(NSString *_Nonnull)adUnitID sizeForInterstitial:(CGSize)sizeForInterstitial;
// 广告代理对象
@property (nonatomic, weak) id<CloooudInterstitialProAdDelegate> _Nullable delegate;
// optional 激励模型,用于全屏视频广告服务端激励回调;目前支持的adn:GDT
@property (nonatomic, strong) CloooudRewardedVideoModel * _Nonnull rewardModel;
// 是否静音播放视频,是否真实静音由adapter确定,默认为NO,仅在广告加载前设置有效
@property (nonatomic, assign) BOOL mutedIfCan;
// 是否已经准备广告展示,理论上在广告加载回调后即为YES,但受一些因素的影响(例如广告失效),可能为NO。建议在广告展示前调用该方法进行是否可以展示
@property (nonatomic, assign, readonly) BOOL isReady;
// 广告的扩展信息,可能为nil
- (NSDictionary *_Nullable)extraData;
// 展示广告
// @param viewController 跳转控制器,必传
// @param extraInfos 扩展信息,可选,与adapter及ADN是否实现有关,字段参见CloooudADSDKConst.h中全屏视频、激励视频展示扩展部分
- (BOOL)showAdFromRootViewController:(UIViewController *_Nonnull)viewController extraInfos:(NSDictionary *_Nullable)extraInfos;
// 填充后可调用,获取广告中的extra信息。目前只支持穿山甲,并且只支持获取coupon, live_room, product信息。
- (nullable NSDictionary *)getMediaExtraInfo;
@end
监听回调
// 插全屏广告代理协议
@protocol CloooudInterstitialProAdDelegate <NSObject>
@optional
// 广告加载成功回调
// @param interstitialProAd 广告管理对象
- (void)interstitialProAdDidLoad:(CloooudInterstitialProAd *_Nonnull)interstitialProAd;
// 广告已加载视频素材回调;非视频素材会在load之后立即给出,开发者可统一在该回调后作为离线展示广告的条件
// @param interstitialProAd 广告管理对象
- (void)interstitialProAdDidDownLoadVideo:(CloooudInterstitialProAd *_Nonnull)interstitialProAd;
// 视频素材广告播放完毕;
// @param interstitialProAd 广告管理对象
// @param error 正常播放完毕为nil;异常结束时承载错误信息
- (void)interstitialProAdDidPlayFinish:(CloooudInterstitialProAd * _Nonnull)interstitialProAd didFailWithError:(NSError *_Nullable)error;
// 广告加载失败回调
// @param interstitialProAd 广告管理对象
// @param error 加载错误信息
- (void)interstitialProAd:(CloooudInterstitialProAd *_Nonnull)interstitialProAd didFailWithError:(NSError *_Nullable)error;
// 模板广告渲染失败时回调,非模板广告不会回调该方法
// @param interstitialProAd 广告管理对象
// @param error 错误信息
- (void)interstitialProAdViewRenderFail:(CloooudInterstitialProAd *_Nonnull)interstitialProAd error:(NSError *__nullable)error;
// 广告展示回调
// @param interstitialProAd 广告管理对象
- (void)interstitialProAdDidVisible:(CloooudInterstitialProAd *_Nonnull)interstitialProAd;
// 广告展示失败回调
// @param interstitialProAd 广告管理对象
// @param error 展示失败的原因
- (void)interstitialProAdDidShowFailed:(CloooudInterstitialProAd *_Nonnull)interstitialProAd error:(NSError *_Nonnull)error;
// 广告点击事件回调
// @param interstitialProAd 广告管理对象
- (void)interstitialProAdDidClick:(CloooudInterstitialProAd *_Nonnull)interstitialProAd;
// 广告点击跳过事件回调
// @param interstitialProAd 广告管理对象
- (void)interstitialProAdDidSkip:(CloooudInterstitialProAd *_Nonnull)interstitialProAd;
// 广告关闭事件回调
// @param interstitialProAd 广告管理对象
- (void)interstitialProAdDidClose:(CloooudInterstitialProAd *_Nonnull)interstitialProAd;
// 即将弹出广告详情页回调
// @param interstitialProAd 广告管理对象
- (void)interstitialProAdWillPresentFullScreenModal:(CloooudInterstitialProAd *_Nonnull)interstitialProAd;
// 请求的服务器验证成功包括C2C和S2S方法回调;支持全屏视频,目前支持的adn:GDT, Load前可按需传入rewardModel信息
// @param interstitialProAd 广告管理对象
// @param rewardInfo 奖励发放验证信息
// @param verify 是否验证通过
- (void)interstitialProAdServerRewardDidSucceed:(CloooudInterstitialProAd *_Nonnull)interstitialProAd rewardInfo:(CloooudAdapterRewardAdInfo *_Nullable)rewardInfo verify:(BOOL)verify;
@end
调用示例
// 插全屏广告类
self.interstitialProAd = [[CloooudInterstitialProAd alloc] initWithAdUnitID:adUnitID sizeForInterstitial:CGSizeMake(300, 300 * 3 / 2)];
// 如果需要场景,请设置该属性
self.interstitialProAd.scenarioID = @"xxx";
self.interstitialProAd.delegate = self;
self.interstitialProAd.mutedIfCan = YES; // 静音
// 该逻辑用于判断配置是否拉取成功。如果拉取成功,可直接加载广告,否则需要调用addConfigLoadSuccessObserver:withAction:,传入block并在block中调用加载广告。SDK内部会在配置拉取成功后调用传入的block
//当前配置拉取成功,直接loadAdData
if ([CloooudAdSDKManager configDidLoad]) {
CloooudD_Log(@"%s:---当前配置拉取成功,直接加载广告", __func__);
[self.interstitialProAd loadAdData];
} else {
//当前配置未拉取成功,在成功之后会调用该callback
CloooudD_Log(@"%s:---配置拉取未成功,延后加载广告", __func__);
[CloooudAdSDKManager addConfigLoadSuccessObserver:self withAction:^(id _Nonnull observer) {
CloooudD_Log(@"%s: ----setConfigSuccessCallback", __func__);
[observer.interstitialProAd loadAdData];
}];
}
// 广告展示
if (self.interstitialProAd.isReady) {
// 广告展示, 需在收到load回调之后
[self.interstitialProAd showAdFromRootViewController:self extroInfos:nil];
}
// 广告回调
#pragma mark - <---CloooudInterstitialProAdDelegate--->
// 广告加载成功回调
// @param interstitialProAd 广告管理对象
- (void)interstitialProAdDidLoad:(CloooudInterstitialProAd *_Nonnull)interstitialProAd {
CloooudD_LogCallback(@"%s", __func__);
self.selectedView.showInvalid = YES;
self.selectedView.promptStatus = CloooudDPromptStatusAdLoaded;
// 广告已加载视频素材回调; 非视频素材会在load之后立即给出,开发者可统一在该回调后作为离线展示广告的条件
// @param interstitialProAd 广告管理对象
- (void)interstitialProAdDidDownLoadVideo:(CloooudInterstitialProAd *_Nonnull)interstitialProAd {
self.selectedView.showInvalid = YES;
self.selectedView.promptStatus = CloooudDPromptStatusAdVideoLoadedSuccess;
CloooudD_LogCallback(@"%s", __func__);
}
// 视频素材广告播放完毕;
// @param interstitialProAd 广告管理对象
// @param error 正常播放完毕为nil; 异常结束时承载错误信息
- (void)interstitialProAdDidPlayFinish:(CloooudInterstitialProAd * _Nonnull)interstitialProAd didFailWithError:(NSError *_Nullable)error {
CloooudD_LogCallback(@"%s", __func__);
}
// 广告加载失败回调
// @param interstitialProAd 广告管理对象
// @param error 加载错误信息
- (void)interstitialProAd:(CloooudInterstitialProAd *_Nonnull)interstitialProAd didFailWithError:(NSError *_Nullable)error {
self.selectedView.showInvalid = NO;
self.selectedView.promptStatus = CloooudDPromptStatusAdLoadedFail;
CloooudD_LogCallback(@"%s--%@", __func__, error);
}
// 模板广告渲染失败时回调,非模板广告不会回调该方法
// @param interstitialProAd 广告管理对象
// @param error 错误信息
- (void)interstitialProAdViewRenderFail:(CloooudInterstitialProAd *_Nonnull)interstitialProAd error:(NSError *__nullable)error {
self.selectedView.showInvalid = NO;
self.selectedView.promptStatus = CloooudDPromptStatusAdLoadedFail;
CloooudD_LogCallback(@"%s", __func__);
}
// 广告展示回调
// @param interstitialProAd 广告管理对象
- (void)interstitialProAdDidVisible:(CloooudInterstitialProAd *_Nonnull)interstitialProAd {
CloooudD_Log(@"ecpm:%@", [self.interstitialProAd getPreEcpm]);
CloooudD_Log(@"platformID:%ld", (long)[self.interstitialProAd getAdNetworkPlaformId]);
CloooudD_Log(@"ritID:%@", [self.interstitialProAd getAdNetworkRitId]);
CloooudD_Log(@"waterfallFillFailMessages:%@", [interstitialProAd waterfallFillFailMessages]);
CloooudD_LogCallback(@"%s", __func__);
}
// 广告展示失败回调
// @param interstitialProAd 广告管理对象
// @param error 展示失败的原因
- (void)interstitialProAdDidShowFailed:(CloooudInterstitialProAd *_Nonnull)interstitialProAd error:(NSError *_Nonnull)error {
CloooudD_LogCallback(@"%s", __func__);
CloooudD_Log(@"Ad show fail:%@", error);
}
// 广告点击事件回调
// @param interstitialProAd 广告管理对象
- (void)interstitialProAdDidClick:(CloooudInterstitialProAd *_Nonnull)interstitialProAd {
CloooudD_LogCallback(@"%s", __func__);
}
// 广告点击跳过事件回调
// @param interstitialProAd 广告管理对象
- (void)interstitialProAdDidSkip:(CloooudInterstitialProAd *_Nonnull)interstitialProAd {
CloooudD_LogCallback(@"%s", __func__);
}
// 广告关闭事件回调
// @param interstitialProAd 广告管理对象
- (void)interstitialProAdDidClose:(CloooudInterstitialProAd *_Nonnull)interstitialProAd {
CloooudD_LogCallback(@"%s", __func__);
self.selectedView.showInvalid = NO;
self.selectedView.promptStatus = CloooudDPromptStatusDefault;
self.interstitialProAd.delegate = nil;
self.interstitialProAd = nil;
}
// 即将弹出广告详情页回调
// @param interstitialProAd 广告管理对象
- (void)interstitialProAdWillPresentFullScreenModal:(CloooudInterstitialProAd *_Nonnull)interstitialProAd {
CloooudD_LogCallback(@"%s", __func__);
}
注意事项
interstitialProAdDidDownLoadVideo回调代表视频下载成功,由于插屏一般为插屏图片,不涉及视频下载。为了对齐视频广告,也会有该回调。故,为统一处理插全屏可设置在该回调后展示,避免视频广告缓冲带来的卡顿。在Load回调后展示,对视频广告是在线播放; 对插屏图片广告无影响。
奖励式插全屏广告
支持的ADN:GDT
支持广告类型:插全屏下的全屏广告
用户自定义奖励信息
// 开发者提供给Cloooud和ADN的奖励信息,适用于ADN的服务端验证和Cloooud的S2S验证
@interface CloooudRewardedVideoModel : NSObject
// 可选,三方用户ID。主要用于奖励发放,是服务器到服务器的回调传递参数。在非服务器回调模式下,当视频播放结束时,它也将被透传。是否有效依赖于adapter和adn。
@property (nonatomic, copy) NSString *userId;
// 可选,奖励名称。是否有效依赖于adapter和adn。
@property (nonatomic, copy) NSString *rewardName;
// 可选,奖励金额。是否有效依赖于adapter和adn。
@property (nonatomic, assign) NSInteger rewardAmount;
// 可选,可序列化字符串。是否有效依赖于adapter和adn。
@property (nonatomic, copy) NSString *extra;
@end
奖励回调
// CloooudInterstitialProAdDelegate
// 请求的服务器验证成功包括C2C和S2S方法回调;支持全屏视频,目前支持的adn:GDT, Load前可按需传入rewardModel信息
// @param interstitialProAd 广告管理对象
// @param rewardInfo 奖励发放验证信息
// @param verify 是否验证通过
- (void)interstitialProAdServerRewardDidSucceed:(CloooudInterstitialProAd *)interstitialProAd rewardInfo:(CloooudAdapterRewardAdInfo *_Nullable)rewardInfo verify:(BOOL)verify;
-
调用示例
// 设置全屏激励配置,仅支持gdt; 具体以接口rewardModel为准
CloooudRewardedVideoModel *model = [[CloooudRewardedVideoModel alloc] init];
model.userId = @"123";
model.rewardAmount = 50;
model.rewardName = @"reward";
// 配置个性化信息
NSDictionary *extraDic = @{@"key1": @"value1", @"key2": @"value2", @"key3": @"value3"};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:extraDic options:NSJSONWritingFragmentsAllowed error:nil];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
model.extra = jsonString;
self.interstitialProAd.rewardModel = model;
// 实现回调
// 请求的服务器验证成功包括C2C和S2S方法回调;支持全屏视频,目前支持的adn:GDT, Load前可按需传入rewardModel信息
// @param interstitialProAd 广告管理对象
// @param rewardInfo 奖励发放验证信息
// @param verify 是否验证通过
- (void)interstitialProAdServerRewardDidSucceed:(CloooudInterstitialProAd *)interstitialProAd rewardInfo:(CloooudAdapterRewardAdInfo *_Nullable)rewardInfo verify:(BOOL)verify {
CloooudD_LogCallback(@"%s", __func__);
CloooudD_LogCallback(@"%s----platformID:%ld----rewardName:%@----rewardAmount:%ld----tradeId:%@", __func__,
[self.interstitialProAd,
getAdNetworkPlaformId],
rewardInfo.rewardName,
rewardInfo.rewardAmount,
rewardInfo.tradeId);
}