Android iOS Unity JS API 常见问题

原生模板广告

简介

基本信息

原生模板广告是腾讯广告推出的一种自动化展现的原生广告,图文广告零门槛不需要申请权限就可以使用,视频广告需要申请对应的权限。开通对应的权限后,在新建广告位时支持只出图文广告或只出视频广告,也支持图文和视频广告混出。但为了保证广告位的填充率,当您有接入视频广告需求的时候,建议尽量选择图文和视频广告混出。

权限等级:开放

适用场景:如果我们提供的模板广告样式符合您的需求,建议直接使用该接口
分类:原生广告(模板方式)有七种广告样式可选:

上图下文
(图片尺寸1280×720)
上文下图
(图片尺寸1280×720)
左图右文
(图片尺寸1200×800)
左文右图
(图片尺寸1200×800)
双图双文
(大图尺寸1280×720)
纯图片
(图片尺寸800×1200)
纯图片
(图片尺寸1280×720)

目前,腾讯广告支持自主调整已创建的原生模板广告的模板参数,腾讯开发者平台操作入口:【我的广告位】--- 原生模板广告位:【修改】--- 广告样式:【修改】
自定义模板调参标准如下:

左文右图/
左图右文
上图下文/
上文下图
双图双文 纯图片
图片(广告元素) 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 播放出错

接入代码示例

加载并显示原生模板广告

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;

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