自动加载广告
1. 自动加载广告功能介绍
开启此功能后,SDK 将在播放广告过程中或广告关闭时,自动完成下一次广告加载,可以有效提升填充效率,及eCPM
| 广告样式 | 依赖ToBid版本号 | 播放中加载(show后) | 广告关闭加载(close后) |
|---|---|---|---|
| 激励视频 | 2.0.0及以上 | ✅ | |
| 插屏广告 | 2.0.0及以上 | ✅ | |
| 原生广告 | 2.14.0及以上 | ✅ | |
| 开屏广告 | 4.4.30及以上 | ✅ |
此功能仅适用于全局调用广告组件的加载模式,如启用此功能后,出现展示率大幅度下降的数据现象,请检查代码中的请求模式是否支持此功能
2. 功能开关路径
在【瀑布流管理】- 选择应用和广告位后,点击页面上的【瀑布流设置】,进入瀑布流设置页面

在瀑布流设置界面,启用【自动加载广告】即可

3. 实现原理
3.1、广告播放中加载

- 自动加载广告会在广告曝光时,自动请求第三方广告平台,并在获得填充后,将广告信息进行缓存。
- SDK 4.0.0及其以上版本新增自动加载广告结果回调接口,如果您关注自动加载结果,可监听自动加载广告的结果回调。
- 当媒体再次发起广告请求时,ToBid SDK将会判断当前是否有缓存广告,以及广告是否有效。如果缓存广告有效,则不再向三方广告平台发起广告请求,立即返回。并发送ready回调通知。节省了广告请求及装载时间。
3.2、广告关闭时加载

- 自动加载广告会在广告关闭时,自动请求第三方广告平台,并在获得填充后,将广告信息进行缓存。
- 广告关闭自动加载当前仅支持开屏广告,SDK 4.4.30及其以上版本支持
- 自动加载广告支持结果回调,如果您关注自动加载结果,可监听自动加载广告的结果回调。
- 当媒体再次发起广告请求时,ToBid SDK将会判断当前是否有缓存广告,以及广告是否有效。如果缓存广告有效,则不再向三方广告平台发起广告请求,立即返回。并发送ready回调通知。节省了广告请求及装载时间。
4. 注意事项
- 自动加载机制的作用域是广告实例对象,开发者需持有已创建的广告实例对象,自动加载机制才能有效工作。每次调用前都新建广告实例对象,自动加载机制将不能正确工作。
- SDK 4.0.0及其以上版本新增自动加载广告结果回调接口,如果您关注自动加载结果,可监听自动加载广告的结果回调
- SDK 3.3.0以下版本,激励视频和插屏广告,自动加载的广告也会触发ready回调,复用主动加载广告的ready接口,开发者需要注意处理。重点关注不要在自动加载的ready回调事件播放广告,避免和当前正在播放的广告冲突。
- 不建议开发者自己的预加载逻辑和ToBid的自动加载同时开启,可能会造成逻辑冲突或者广告浪费
- 开屏场景如有频繁切换前后台,例如打开应用后切换至后台,后又回到应用进入开屏场景时,可开启自动加载,缩短等待时间,提高用户广告体验;如无频繁的热启开屏场景,开启后可能会造成广告浪费,例如部分应用开屏一天仅一次展示场景,开启自动加载就会造成广告浪费
5. 代码示例
针对实时加载的代码处理建议: 如果之前是在ready回调里去调用了show,那么需要自设一个新的变量,在广告展示、广告关闭 2个回调里分别赋值,在调用show的时候判断这个变量,处于关闭状态时再去调用show
5.1 iOS
激励视频
- WindMillRewardVideoAd每个广告位ID创建一个实例对象,多个实例对象之间的预加载逻辑互不干扰
objective-c
WindMillAdRequest *request = [WindMillAdRequest request];
request.userId = @"user_id";
request.placementId = @"4432322913755475";
//rewardVideoAd全局对象,不能每次都重新new实例对象,否则预加载功能不生效
if (self.rewardVideoAd == nil) {
self.rewardVideoAd = [[WindMillRewardVideoAd alloc] initWithRequest:request];
}
self.rewardVideoAd.delegate = self;
[self.rewardVideoAd loadAdData];原生广告
- 当广告开始播放时,ToBid SDK会自动执行下一条广告加载逻辑
- SDK 4.0.0及其以上版本,原生广告自动加载成功后会通过独立的接口通知开发者。(见下方6.1)
- SDK 4.0.0以下版本,自动加载广告的结果不会给开发者加载成功/加载失败的回调,开发者需要再次调用loadAdData接口,若自动加载的广告有填充,则该次加载会立即回调开发者广告加载成功回调。
- WindMillNativeAdsManager每个广告位ID创建一个实例对象,多个实例对象之间的预加载逻辑互不干扰。
objective-c
WindMillAdRequest *request = [WindMillAdRequest request];
request.placementId = @"4432322913755475";
request.userId = @"user_id"
//nativeAdManager全局对象,每个广告位ID创建一个实例
if (self.nativeAdManager == nil) {
self.nativeAdManager = [[WindMillNativeAdsManager alloc] initWithRequest:request];
}
self.nativeAdManager.delegate = self;
self.nativeAdManager.adSize = CGSizeMake(320, 0);
[self.nativeAdManager loadAdDataWithCount:1];插屏广告
- WindMillIntersititialAd每个广告位ID创建一个实例对象,多个实例对象之间的预加载逻辑互不干扰
objective-c
WindMillAdRequest *request = [WindMillAdRequest request];
request.userId = @"user_id";
request.placementId = @"4432322913755475";
//intersititialAd全局对象,不能每次都重新new实例对象,否则预加载功能不生效
if (self.intersititialAd == nil) {
self.intersititialAd = [[WindMillIntersititialAd alloc] initWithRequest:request];
}
self.intersititialAd = self;
[self.intersititialAd loadAdData];开屏
- WindMillSplashAd每个广告位ID创建一个实例对象,多个实例对象之间的预加载逻辑互不干扰
objective-c
WindMillAdRequest *request = [WindMillAdRequest request];
request.placementId = @"聚合广告位id";
request.userId = @"user_id";
CGFloat bottomHeight = 100;
CGSize adSize = CGSizeMake(self.navigationController.view.bounds.size.width, self.navigationController.view.bounds.size.height-bottomHeight);
NSDictionary *extra = @{kWindMillSplashExtraAdSize: NSStringFromCGSize(adSize)};
self.splashAd = [[WindMillSplashAd alloc] initWithRequest:request extra:extra];
self.splashAd.delegate = self;
self.splashAd.rootViewController = self;
[self.splashAd setLoadCustomGroup:@{@"load_key":@"load_value"}];
UIView *bottomView; //自定义底部View
if (bottomView) {
[self.splashAd loadAdAndShowWithBottomView:bottomView];
}else {
[self.splashAd loadAdAndShow];
}5.2 Android
激励视频
java
private WMRewardAd mRewardAd;//全局对象
/**
* 加载广告
*/
private void loadAd() {
if (mRewardAd == null) {
mRewardAd = new WMRewardAd(this, new WMRewardAdRequest(placementId, userID, options));
}
mRewardAd.setRewardedAdListener(new WMRewardAdListener() {
......
}
mRewardAd.loadAd();
}
/**
* 展示广告
*/
private void showAd(){
if(mRewardAd.isReady()){
mRewardAd.show(activity,options);
}else{
loadAd();
}
}原生广告
- SDK 4.0.0及其以上版本,原生广告自动加载成功后会通过独立的接口通知开发者。(见下方6.2)
- SDK 4.0.0以下版本,原生广告自动加载成功后不会通知媒体,会在媒体下次loadAd时立马返回预加载成功的广告。(需要是同一个WMNativeAd对象)
java
private WMNativeAd nativeAd;//全局对象
private WMNativeAdRequest request;
/**
* 加载广告
*/
private void loadAd() {
if(nativeAd == null){
request = new WMNativeAdRequest(PLACEMENT_ID, USER_ID, AD_COUNT, OPTIONS);
nativeAd = new WMNativeAd(this, request);
}
nativeAd.loadAd(new WMNativeAd.NativeAdLoadListener() {
@Override
public void onError(WindMillError error, String placementId) {
}
@Override
public void onFeedAdLoad(String placementId) {
}
}
}插屏广告
java
private WMInterstitialAd mInterstitialAd;;//全局对象
/**
* 加载广告
*/
private void loadAd() {
if (mInterstitialAd == null) {
mInterstitialAd = new WMInterstitialAd(this, new WMInterstitialAdRequest(placementId, userID, options));
}
mInterstitialAd.setInterstitialAdListener(new WMInterstitialAdListener() {
......
}
mInterstitialAd.loadAd();
}
/**
* 展示广告
*/
private void showAd(){
if(mInterstitialAd.isReady()){
mInterstitialAd.show(activity,options);
}else{
loadAd();
}
}6. 自动加载回调 (SDK 4.0.0及其以上版本)
6.1 iOS
- 激励视频
objective-c
/// 广告播放中加载成功回调
/// - Parameter rewardVideoAdDidAutoLoad: WindMillRewardVideoAd 实例对象
- (void)rewardVideoAdDidAutoLoad:(WindMillRewardVideoAd *)rewardVideoAd {
}
/// 广告播放中加载失败回调
/// - Parameters:
/// - rewardVideoAd: WindMillRewardVideoAd 实例对象
/// - error: 具体错误信息
- (void)rewardVideoAd:(WindMillRewardVideoAd *)rewardVideoAd didAutoLoadFailWithError:(NSError *)error {
}- 插屏
objective-c
/// 广告播放中加载成功回调
/// - Parameter intersititialAd: WindMillIntersititialAd 实例对象
- (void)intersititialAdDidAutoLoad:(WindMillIntersititialAd *)intersititialAd;
/// 广告播放中加载失败回调
/// - Parameters:
/// - intersititialAd: WindMillIntersititialAd 实例对象
/// - error: 具体错误信息
- (void)intersititialAd:(WindMillIntersititialAd *)intersititialAd didAutoLoadFailWithError:(NSError *)error;- 原生
objective-c
/// 广告播放中加载成功回调
/// - Parameter adsManager: WindMillNativeAdsManager 实例对象
- (void)nativeAdsManagerSuccessAutoToLoad:(WindMillNativeAdsManager *)adsManager;
/// 广告播放中加载出错
/// - Parameters:
/// - adsManager: WindMillNativeAdsManager 实例对象
/// - error: 具体错误信息
- (void)nativeAdsManager:(WindMillNativeAdsManager *)adsManager didAutoFailWithError:(NSError *)error;- 开屏
objective-c
/// 广告播放中加载成功回调
/// - Parameter splashAd: WindMillSplashAd 实例对象
- (void)onSplashAdAdDidAutoLoad:(WindMillSplashAd *)splashAd;
/// 广告播放中加载失败回调
/// - Parameters:
/// - splashAd: WindMillSplashAd 实例对象
/// - error: 具体错误信息
- (void)onSplashAd:(WindMillSplashAd *)splashAd didAutoLoadFailWithError:(NSError *_Nullable)error;6.2 Android
- 激励视频
java
/**
* 后台开启自动加载功能才会收到此回调
* 不实现该回调监听不影响自动加载功能
*/
rewardAd.setAutoLoadListener(new AutoAdLoadListener() {
@Override
public void onAutoAdLoadSuccess(String placementId) {
Log.i("Sigmob", "----RewardUI--onAutoAdLoadSuccess " + placementId);
}
@Override
public void onAutoAdLoadFail(WindMillError error, String placementId) {
Log.i("Sigmob", "---RewardUI--onAutoAdLoadFail " + placementId);
}
});- 插屏
java
/**
* 后台开启自动加载功能才会收到此回调
* 不实现该回调监听不影响自动加载功能
*/
interstitialAd.setAutoLoadListener(new AutoAdLoadListener() {
@Override
public void onAutoAdLoadSuccess(String placementId) { // 不要在回调中进行展示,上个广告没关闭再展示会报错
Log.d("Sigmob", "----Interstitial-onAutoAdLoadSuccess- " + placementId);
}
@Override
public void onAutoAdLoadFail(WindMillError error, String placementId) {
Log.d("Sigmob", "----Interstitial-onAutoAdLoadFail- " + placementId);
}
});- 原生
java
/**
* 后台开启自动加载功能才会收到此回调
* 不实现该回调监听不影响自动加载功能
*/
nativeAd.setAutoLoadListener(new AutoAdLoadListener() {
@Override
public void onAutoAdLoadSuccess(String placementId) {
Log.i("Sigmob", "----NativeAdUI--onAutoAdLoadSuccess " + placementId);
}
@Override
public void onAutoAdLoadFail(WindMillError error, String placementId) {
Log.i("Sigmob", "---NativeAdUI--onAutoAdLoadFail " + placementId);
}
});