Android iOS Unity JS API Media API 常见问题

信息流/详情页插入/视频贴片广告

简介

基本信息

信息流广告/沉浸式视频流广告/详情页插入广告/视频贴片广告,都可使用优量汇提供的接入文档进行广告接入

权限等级:开放

适用场景:优量汇为您提供了多种的广告模板样式,在新建广告位时支持只出图文广告或只出视频广告,也支持图文和视频广告混出。为保证广告位填充率,建议尽量选择图文和视频广告混出。如样式满足您的诉求,您可直接使用展示

注意事项:如您正在使用模板2.0接口,请尽快按该文档更新接入方式,模板2.0接口将很快废弃,请尽快更新至4.12.80版本及以上。

分类:广告具体布局,可参考下方图片:

上图下文 上文下图 双图双文 三小图双文
左图右文 左文右图 横版纯图片 竖版纯图片
单图单文(文字浮层) 上文下图(文字浮层) 上图下文(文字浮层)

自定义模板调参标准如下:

左文右图/
左图右文
上图下文/
上文下图
双图双文 纯图片
图片(广告元素) 300>图片宽度>30
300>图片高度>30
横图:宽高比在40%-79%之间(高/宽) 横图:宽高比在40%-79%之间(高/宽) 横图:宽高比在40%-79%之间(高/宽)
标题(广告元素) 颜色、大小(>0)
上下左右边距(>0)
颜色、大小(>0)
上下左右边距(>0)
颜色、大小(>0)
上下左右边距(>0)
描述(广告元素) 颜色、大小(>0)
上下左右边距(>0)
颜色、大小(>0)
上下左右边距(>0)
颜色、大小(>0)
上下左右边距(>0)
关闭按钮(互动) 有无 有无 有无
背景 颜色(按照 RGB 标准) 颜色(按照 RGB 标准) 颜色(按照 RGB 标准) 颜色(按照 RGB 标准)
按钮(互动) 背景颜色、边框颜色、字体颜色、字体大小(>0)

注意:以下接入代码示例只适用于上述广告位。误用其他广告位 ID 使用该接口,则会导致无广告返回。

主要API

生命周期事件回调

您可以实现全部或部分GDTNativeExpressAdDelegate,以跟踪点击成功或者平台模板广告请求失败等广告生命周期事件。

@protocol GDTNativeExpressAdDelegete <NSObject>
@optional
- (void)nativeExpressAdSuccessToLoad:views;
- (void)nativeExpressAdFailToLoad: error;
- (void)nativeExpressAdViewRenderSuccess;
- (void)nativeExpressAdViewRenderFail;
- (void)nativeExpressAdViewExposure;
- (void)nativeExpressAdViewClicked;
- (void)nativeExpressAdViewClosed;
- (void)nativeExpressAdViewWillPresentScreen;
- (void)nativeExpressAdViewDidPresentScreen;
- (void)nativeExpressAdViewWillDissmissScreen;
- (void)nativeExpressAdViewDidDissmissScreen;
- (void)nativeExpressAdViewApplicationWillEnterBackground;
- (void)nativeExpressAdView:playerStatusChanged;
- (void)nativeExpressAdViewWillPresentVideoVC;
- (void)nativeExpressAdViewDidPresentVideoVC;
- (void)nativeExpressAdViewWillDismissVideoVC;
- (void)nativeExpressAdViewDidDismissVideoVC;
@end

在实现上述事件回调之前,请务必先设置delegate:

Objective-C
self.nativeExpressAd.delegate = self;
Swift
nativeExpressAd.delegate = self

回调函数列表

回调函数名 回调函数含义
nativeExpressAdSuccessToLoad:views 拉取平台模板广告成功
nativeExpressAdFailToLoad:error 拉取平台模板广告失败
nativeExpressAdViewRenderSuccess 平台模板广告渲染成功
nativeExpressAdViewRenderFail 平台模板广告渲染失败
nativeExpressAdViewExposure 平台模板广告曝光回调
nativeExpressAdViewClicked 平台模板广告点击回调
nativeExpressAdViewClosed 平台模板广告被关闭
nativeExpressAdViewWillPresentScreen 点击平台模板广告,即将弹出全屏广告页
nativeExpressAdViewDidPresentScreen 点击平台模板广告,弹出全屏广告页
nativeExpressAdViewWillDissmissScreen 全屏广告页将要关闭
nativeExpressAdViewDidDissmissScreen 全屏广告页已经关闭
nativeExpressAdViewApplicationWillEnterBackground 当点击应用下载或者广告调用系统程序打开时调用
nativeExpressAdView:playerStatusChanged 平台模板视频广告 player 播放状态更新回调
nativeExpressAdViewWillPresentVideoVC 平台视频模板详情页将要展示
nativeExpressAdViewDidPresentVideoVC 平台视频模板详情页已经展示
nativeExpressAdViewWillDismissVideoVC 平台视频模板详情页将要消失
nativeExpressAdViewDidDismissVideoVC 平台视频模板详情页已经消失

其中,视频播放过程中,会有如下几种状态

枚举变量 枚举含义
GDTMediaPlayerStatusInitial 初始状态
GDTMediaPlayerStatusLoading 加载中
GDTMediaPlayerStatusStarted 开始播放
GDTMediaPlayerStatusPaused 用户行为导致暂停
GDTMediaPlayerStatusStoped 播放停止
GDTMediaPlayerStatusError 播放出错

接入代码示例

加载并显示平台模板广告

请勿使用平台模板2.0广告位调用平台模板的接口,否则不会返回广告!!!

1.在您的试图控制器中导入头文件,声明您会实现GDTNativeExpressAdDelegate协议:

Objective-C
 #import "GDTNativeExpressAd.h"
 #import "GDTNativeExpressAdView.h"
 @interface NativeExpressAdViewController : UIViewController <GDTNativeExpressAdDelegete>
 @property (nonatomic, strong) NSArray *expressAdViews;
 @property (nonatomic, strong) GDTNativeExpressAd *nativeExpressAd;
Swift
UIViewController,UITableViewDelegate,UITableViewDataSource,GDTNativeExpressAdDelegete {
    private var expressAdViews:Array<GDTNativeExpressAdView>!
    private var nativeExpressAd:GDTNativeExpressAd!
    ...
  }

2.在试图控制器的ViewDidLoad中的实现文件中初始化并加载广告数据。如果您的广告是视频和图文混出类型,则您可以在这里定义视频播放器的属性:

Objective-C
- (void)viewDidLoad
{
   [super viewDidLoad];
   // 支持视频广告的 PlacementId 会混出视频与图片广告
   self.nativeExpressAd = [[GDTNativeExpressAd alloc] initWithPlacementId:@"YOUR_PLACEMENT_ID" adSize:CGSizeMake(self.widthSlider.value, self.heightSlider.value)];
   self.nativeExpressAd.delegate = self;
   // 配置视频播放属性
   self.nativeExpressAd.maxVideoDuration = (NSInteger)self.maxVideoDurationSlider.value;  // 如果需要设置视频最大时长,可以通过这个参数来进行设置
   self.nativeExpressAd.videoAutoPlayOnWWAN = self.videoAutoPlaySwitch.on;
   self.nativeExpressAd.videoMuted = self.videoMutedSwitch.on;
   [self.nativeExpressAd loadAd:(int)self.adCountSlider.value];
}
Swift
override func viewDidLoad() {
    super.viewDidLoad()
    nativeExpressAd = GDTNativeExpressAd.init(placementId: YOUR_PLACEMENT_ID, adSize: CGSize(width: Int(widthSlider.value), height: Int(heightSlider.value)))
    nativeExpressAd.delegate = self
    nativeExpressAd.videoAutoPlayOnWWAN = videoAutoPlaySwitch.isOn
    nativeExpressAd.videoMuted = videoMutedSwitch.isOn
    nativeExpressAd.load(Int(adCountSlider.value))
}

3.将YOUR_PLACEMENT_ID替换成你自己的PLACEMENTID。

4.实现获取广告成功的回调,在回调里做数据处理,并且为平台模板广告的展现做准备。这里以展示在TableView中为例。

Objective-C
- (void)nativeExpressAdSuccessToLoad:(GDTNativeExpressAd 
*)nativeExpressAd views:(NSArray<__kindof
GDTNativeExpressAdView *> *)views
{
   self.expressAdViews = [NSArray arrayWithArray:views];
   if (self.expressAdViews.count) {
       [self.expressAdViews enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
           GDTNativeExpressAdView *expressView = (GDTNativeExpressAdView *)obj;
           expressView.controller = self;
           [expressView render];
       }];
   }
   // 广告位 render 后刷新 tableView
   [self.tableView reloadData];
}
Swift
func nativeExpressAdSuccess(toLoad nativeExpressAd: GDTNativeExpressAd!, views: [GDTNativeExpressAdView]!) {
    expressAdViews = Array.init(views)
    if expressAdViews.count > 0 {
        for obj in expressAdViews {
            let expressView:GDTNativeExpressAdView = obj
            expressView.controller = self
            expressView.render()
        }
    }
    tableView.reloadData()
}
  1. 在您要展示的视图中对获得的平台模板广告进行展示。这里以展示在TableView中为例。这里推荐开发者使用SDK给出的推荐尺寸。完整参考代码如下:
Objective-C
 - (CGFloat)tableView:(UITableView *)tableView
  heightForRowAtIndexPath:(NSIndexPath *)indexPath
 {
     if (indexPath.row % 2 == 0) {
         // cell 高度取 adView render 后的值,这里的值是SDK算出来的
         UIView *view = [self.expressAdViews objectAtIndex:indexPath.row / 2];
         return view.bounds.size.height;
     } else {
         return 44;
     }
 }
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = nil;
    if (indexPath.row % 2 == 0) {
        cell = [self.tableView dequeueReusableCellWithIdentifier:@"nativeexpresscell" forIndexPath:indexPath];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        UIView *subView = (UIView *)[cell.contentView viewWithTag:1000];
        if ([subView superview]) {
            [subView removeFromSuperview];
        }
        UIView *view = [self.expressAdViews objectAtIndex:indexPath.row / 2];
        view.tag = 1000;
        [cell.contentView addSubview:view];
    } else {
        cell = [self.tableView dequeueReusableCellWithIdentifier:@"splitnativeexpresscell" forIndexPath:indexPath];
        cell.backgroundColor = [UIColor grayColor];
    }
    return cell;
}
Swift
  func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
      if indexPath.row % 2 == 0 {
          let view: UIView = expressAdViews[indexPath.row/2]
          return view.bounds.size.height
      }
      return 44
  }
  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      var cell:UITableViewCell!
      if indexPath.row % 2 == 0 {
          cell = tableView.dequeueReusableCell(withIdentifier: "nativeexpresscell", for: indexPath)
          cell.selectionStyle = .none
          let subView: UIView? = cell!.contentView.viewWithTag(1000)
          if (subView?.superview != nil) {
              subView?.removeFromSuperview()
          }
          let view: UIView = expressAdViews[indexPath.row / 2]
          view.tag = 1000
          cell.contentView.addSubview(view)
      } else {
          cell = tableView.dequeueReusableCell(withIdentifier: "splitnativeexpresscell", for: indexPath)
          cell.backgroundColor = .gray
      }
      return cell
  }

在不展示平台模板广告时执行调试

在您的ViewController里实现如下回调,处理平台模板广告加载失败的问题:

Objective-C
- (void)nativeExpressAdRenderFail:(GDTNativeExpressAdView 
*)nativeExpressAdView
{
    NSLog(@"Express Ad Render Fail");
}
- (void)nativeExpressAdFailToLoad:(GDTNativeExpressAd *)nativeExpressAd error:(NSError *)error
{
    NSLog(@"Express Ad Load Fail : %@",error);
}
Swift
func nativeExpressAdFail(toLoad nativeExpressAd: GDTNativeExpressAd!, error: Error!) {
    print("Express Ad Load Fail : \(error)")
}
func nativeExpressAdViewRenderFail(_ nativeExpressAdView: GDTNativeExpressAdView!) {
    print(#function)
}

多阶底价能力

接入多阶底价能力分2步:

step1:

找优量汇运营同学开通广告位的多阶底价权限并提供底价配置信息;

step2:

通过GDTNativeExpressAdView类的eCPMLevel属性查看当前广告对应的底价层级。

/**
 返回广告的eCPM等级

 @return 成功返回一个包含数字的string,比如@"2"表示底价等级为2,@""或nil表示无权限或后台异常
 */
@property (nonatomic, readonly) NSString *eCPMLevel;

实时竞价能力

接入实时竞价能力分2步:

step1:

找优量汇运营同学开通广告位的实时竞价权限;

step2:

当广告拉取成功后,通过GDTNativeExpressAdView类的eCPM属性获取本条广告实时的eCPM价格,单位是分。

/**
 返回广告的eCPM,单位:分

 @return 成功返回一个大于等于0的值,-1表示无权限或后台出现异常
 */
- (NSInteger)eCPM;

说明

当无权限调用该接口时,SDK会返回错误码-1。

Copyright © 1998 - 2020 Tencent Inc. All Rights Reserved.
腾讯公司 版权所有 | 加入优量汇