Skip to content

自动加载广告

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);
    }
});