腾讯广告联盟 iOS SDK 接入文档

Version: 4.8.1

法律声明

客户在注册成为腾讯广告联盟用户之后,联盟向客户提供本文档,作为其与联盟广告平台对接的指引文档。腾讯广告联盟拥有修改、调整、增补本文件的权利,并在法律允许范围内对本文档拥有最终解释权。

 

修订历史

版本日期说明
4.8.12018-11-1支持激励视频
4.8.02018-9-6添加Swift Demo,修复 Bug
4.7.92018-8-27修复Bug
4.7.82018-7-21修复Bug
4.7.72018-7-14修复Bug
4.7.62018-7-6修复Bug
4.7.52018-5-25开屏广告新增曝光回调
4.7.42018-4-25视频模板广告新增状态回调
4.7.32018-4-17修复Bug
4.7.22018-03-30修复 Bug
4.7.12017-03-07优化开屏广告效果
4.7.02017-12-10增加原生视频模板、适配 iPhone X、
支持 Auto Layout
4.6.42017-10-25优化广告位内存占用
4.6.32017-10-11增加原生广告三小图接口
4.6.22017-08-29增加原生广告接口
4.6.12017-07-28修改返回的错误码
4.6.02017-07-13增加原生模板广告形态支持,增加HTTPS支持
4.5.62017-03-01修复Bug,增加错误码说明
4.5.52017-01-16优化插屏视频落地页样式
4.5.42016-12-20优化数据上报
4.5.22016-12-02优化数据上报,开屏回调接口,打开广告的
体验优化。
4.5.12016-11-02最低支持iOS7系统,优化数据上报
4.5.02016-10-08开屏跳过按钮支持自定义,广告标识字样修改
4.4.92016-09-26修复Bug.
4.4.82016-09-12优化数据上报,调整原生广告拉取上限
4.4.72016-08-25增加广告标识
4.4.62016-08-18优化广告体验
4.4.52016-08-01优化开屏回调接口
4.4.32016-06-21增加广告有效期的说明
4.42016-05-23优化了广告点击体验
4.3.12016-04-18移除ObjC链接依赖
4.32016-02-20支持半屏开屏功能
4.22016-02-02SDK支持转化统计功能,优化点击行为。
4.12015-11-03SDK支持Bitcode,去除c++链接依赖,
不再对iOS4,5作支持。
4.02015-08-31支持Banner、插屏、原生广告、开屏。

 

概述

本文档旨在帮助您的iOS应用开发者在程序中快速植入腾讯广告联盟平台提供的广告,请按照下述指南进行操作。

术语

APPID:媒体 ID,是您在腾讯广告联盟官网创建媒体时获得的ID,这个ID是我们在广告网络中识别您应用的唯一ID。

PlacementId:广告位 ID,是您在腾讯广告联盟官网为您的应用所创建的某种类型(Banner、开屏、插屏、原生)的广告位置的ID。

注册开户

开发者需在联盟平台上自主注册,在平台审核通过后,开发者就成为了腾讯广告联盟的正式会员。

新建媒体及广告位

开发者在联盟平台上新建媒体及广告位,并记录下媒体ID、广告位ID,待接入SDK时使用。

开发环境

确保您的开发及部署环境符合以下标准:

开发工具:Xcode 9及以上版本

部署目标:iOS 7.0及以上版本

确认SDK版本

确认使用的是官网最新的SDK版本。

 

前期准备

使用联盟广告SDK,您的iOS应用可以借助腾讯完成广告创收。本章介绍了在您的iOS应用集成联盟广告iOS SDK的方法。

自动部署

自动部署可以省去您工程配置的时间。联盟iOS SDK会通过CocoaPods进行发布,推荐您使用自动部署。

  1. 安装CocoaPods

    CocoaPods是一个Swift和Objective-C项目的依赖管理器。它拥有超过49,000个第三方库,超过3,000,000个app都在使用cocoaPods做依赖管理,CocoaPods可以帮助你优雅的扩展你的项目。 如果您未安装过cocoaPods,可以通过以下命令行进行安装。更多详情请访问CocoaPods官网

    注意:安装过程可能会耗时比较长,也有可能收到网络状况导致失败,请多次尝试直到安装成功。

  2. 配置Podfile文件

    在您的工程文件所在文件夹下有一个名为Podfile的文件。如果您第一次使用CocoaPods,可以在通过以下命令初始化一个Podfile文件:

    打开Podfile文件,应该是如下内容(具体内容可能会有一些出入):

    修改Podfile文件,将pod 'GDTMobSDK'添加到Podfile中,如下所示:

  3. 使用CocoaPods进行SDK部署

    通过CocoaPods安装联盟SDK前,确保CocoaPods索引已经更新。可以通过运行以下命令来更新索引:

    运行命令进行安装:

    也可以将上述两条命令合成为如下命令:

    命令执行成功后,会生成.xcworkspace文件,可以打开.xcworkspace来启动工程,如下图所示。

  4. 升级联盟SDK

    升级SDK时,首先要更新repo库,执行命令:

    之后重新执行如下命令进行安装即可升级至最新版SDK

    注意 :只有在Podfile文件中没有指定SDK版本时,运行上述命令才会自动升级到最新版本。不然需要修改Podfile文件,手动指定SDK版本为最新版本。

  5. 指定联盟SDK版本

    指定联盟SDK版本前,请先确保repo库为最新版本,参考上一小节内容进行更新。如果需要指定联盟SDK版本,需要在Podfile文件中,pod那一行指定版本号:

    之后运行命令:

手动部署

本章会指导您手动将联盟iOS SDK进行集成。如果您没有项目,请先创建一个空白项目。

添加依赖库

将解压缩后的lib文件copy到工程文件夹中,然后在项目中选中项目文件,选择Add Files to “your project name”:

在弹出来的窗口中,请将如下文件添加到工程中:

需要引入的依赖库
libGDTMobSDK.a
GDTMobBannerView.h
GDTNativeExpressAd.h
GDTNativeExpressAdView.h
GDTMobInterstitial.h
GDTNativeAd.h
GDTSplashAd.h
GDTRewardVideo.h
GDTSDKDefines.h
需要引入的系统库
库名称SDK备注
AdSupport.framework4.7.2及以后版本 
CoreLocation.framework同上 
QuartzCore.framework同上 
SystemConfiguration.framework同上 
CoreTelephony.framework同上 
libz.tbd同上或者是libz.dylib
Security.framework同上 
StoreKit.framework同上 
libxml2.tbd同上 
AVFoundation.framework同上 
WebKit.framework同上可选

说明

  1. SystemConfiguration.framework、CoreTelephony.framework、Security.framework是为了统计app信息使用
  2. iOS9以后的版本,需要把libz.dylib替换成libz.tbd
  3. 引入系统库的操作过程如下: 在Xcode中选中工程名,在Target->Build Phases->Link Binary With Libraries中点击“+”,在弹出窗口输入库名称,出现后点击“Add”则将库引入到系统中。
其它设置

在Target->Build Settings -> Other Linker Flags中添加-ObjC, 字母o和c大写。

Swift接入准备

  1. 新建桥接头文件(bridge.h,推荐放在工程目录下)。这里我们命名为:GDTMobSample-Swift-Bridging-Header.h。在这个文件中import我们需要的所有头文件,代码如下:
  1. 左侧目录中选中工程名,在 TARGETS->Build Settings-> Swift Compiler - Code Generation -> Objective-C Bridging Header 中输入桥接文件的路径,如下图所示:

接入代码

配置

苹果公司在iOS9中升级了应用网络通信安全策略,默认推荐开发者使用HTTPS协议来进行网络通信,并限制HTTP协议的请求。为了避免出现无法拉取到广告的情况,我们推荐开发者在info.plist文件中增加如下配置来实现广告的网络访问:(信任HTTP请求)

若开发者有使用HTTPS进行应用内网络访问的场景需要,可以调用腾讯广告联盟提供的接口。

Swift

在iOS应用中添加Banner广告

本章内容将指导您在您的iOS应用中插入Banner广告。Banner广告API可以帮助您快速在iOS应用中插入一条banner广告,您无需手动设置广告的title、图片url甚至于关闭按钮,唯一需要提供的就是广告的APPID和PLACEMENTID。

Banner 广告分为文字链、纯图片和图文描述:

文字链纯图片图文描述

推荐banner尺寸

联盟广告推荐您将Banner设置为以下尺寸:

尺寸(宽x高)说明适用设备GDT_AD 常量
300x50标准Banner广告手机GDTMOB_AD_SUGGEST_SIZE_320x50
468x60标准Banner广告平板电脑GDTMOB_AD_SUGGEST_SIZE_468x60
300x50大型Banner广告平板电脑GDTMOB_AD_SUGGEST_SIZE_728x90

说明:

开发者在嵌入Banner时,可以手动设置Banner条的宽度用来满足场景需求,而高度的话不建议更改,否则显示效果会有影响。

 

精准广告定位

打开GPS精准广告定位开关,可以借助获取的地理位置开关,提高广告填充率,增加广告收益。建议打开开关。

Objective-C
Swift

说明

如果GPS精准广告定位功能与本身应用功能相矛盾也存在被苹果审核拒绝的风险。

 

Banner广告生命周期事件回调

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

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

Objective-C
Swift
回调函数列表
回调函数名回调函数含义
bannerViewMemoryWarning当bannerView收到内存警告时回调
bannerViewDidReceived请求广告条数据失败后调用
bannerViewFailToReceived请求广告条数据失败后调用
bannerViewWillLeaveApplication应用进入后台时调用
bannerViewWillClosebanner条被用户关闭时调用
bannerViewWillExposurebanner条曝光回调
bannerViewClickedbanner条点击回调
bannerViewWillPresentFullScreenModalbanner广告点击以后即将弹出全屏广告页
bannerViewDidPresentFullScreenModalbanner广告点击以后弹出全屏广告页完毕
bannerViewWillDismissFullScreenModal全屏广告页即将被关闭
bannerViewDidDismissFullScreenModal全屏广告页已经被关闭

加载并显示Banner广告

  1. 在您的View Controller文件中,引入对应头文件,定义好Banner对象以及定义清本类支持GDTMobBannerViewDelegate协议,如下例所示:
Objective-C
Swift
  1. 在viewDidLoad方法内,需要添加如下代码来对定义好的bannerView进行初始化。
Objective-C
Swift
  1. 将YOUR_APP_ID和YOUR_PLACEMENT_ID替换成你自己的APPID和PLACEMENTID。
  2. 在需要显示bannerView的逻辑内,需要先判断当前上下文是否已经存在一个bannerView的实体,如果存在,应当先将其remove掉,然后再进行创建bannerView的逻辑。
Objective-C
Swift

说明:

  1. 在释放bannerView之前,建议在先将bannerView对象的delegate和currentViewController属性置为空,然后再释放bannerView。

  2. 开启GPS定位可以获取地理位置信息,提高广告填充率,增加收益,但是如果与本身应用功能相矛盾也存在被苹果审核拒绝的风险。

  3. 在以下情况下使用Banner广告请将interval刷新频率设为0,即不自动刷新。

    • 使用广告聚合平台控制刷新频率时。
    • 使用代码定时新建GDTMobBannerView来控制刷新频率时。

 

在不展示Banner广告时执行调试

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

Objective-C
Swift

 

在iOS应用中添加插屏广告

插屏广告是一种可以在应用中叠加显示的全屏广告,视觉效果震撼,它们通常用在正常的应用过渡点展示。请按照本章内容来展示此类广告。

小规格图文(弹窗)小规格纯图片(弹窗)大规格纯图片(竖屏)

插屏广告生命周期事件回调

您可以实现全部或部分GDTMobInterstitialDelegate,以跟踪点击成功或者插屏广告请求失败等广告生命周期事件。

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

Objective-C
Swift

回调函数列表

回调函数名回调函数含义
interstitialSuccessToLoadAd插屏广告预加载成功回调
interstitialFailToLoadAd插屏广告预加载失败回调
interstitialWillPresentScreen插屏广告将要展示回调
interstitialDidPresentScreen插屏广告视图展示成功回调
interstitialDidDismissScreen插屏广告展示结束回调
interstitialApplicationWillEnterBackground应用进入后台时回调
interstitialWillExposure插屏广告曝光回调
interstitialClicked插屏广告点击回调
interstitialAdWillPresentFullScreenModal点击插屏广告以后即将弹出全屏广告页
interstitialAdDidPresentFullScreenModal点击插屏广告以后弹出全屏广告页
interstitialAdWillDismissFullScreenModal全屏广告页将要关闭
interstitialAdDidDismissFullScreenModal全屏广告页被关闭

 

GPS精准广告定位

打开GPS精准广告定位开关,可以借助获取的地理位置开关,提高广告填充率,增加广告收益。建议打开开关。

Objective-C
self.interstitial.isGpsOn = YES;
Swift
interstitial.isGpsOn = true

说明

如果GPS精准广告定位功能与本身应用功能相矛盾也存在被苹果审核拒绝的风险。

 

加载并显示插屏广告

  1. 在您的View Controller文件中,引入对应头文件,定义好Interstitial对象以及定义清本类支持GDTMobInterstitialDelegate协议,如下例所示:
Objective-C
 #import "GDTMobInterstitial.h"
 @interface InterstitialViewController() <GDTMobInterstitialDelegate>
 @property (nonatomic, strong) GDTMobInterstitial *interstitial;
Swift
 class InterstitialViewController: UIViewController,GDTMobInterstitialDelegate {
    private var interstitial: GDTMobInterstitial?
    ...
  }
  1. 在需要加载插屏广告的逻辑处,初始化interstitial变量,并做相应展示。
Objective-C
 - (IBAction)loadAd:(id)sender {
     if(self.interstitial) {
         self.interstitial.delegate = nil;
     }
     self.interstitial = [[GDTMobInterstitial alloc] initWithAppId:YOUR_APP_ID placementId:YOUR_PLACEMENT_ID];
     self.interstitial.delegate = self;
     //预加载广告
     [self.interstitial loadAd];
 }
 
 - (IBAction)showAd:(id)sender
 {
     [self.interstitial presentFromRootViewController:self];
 }
Swift
@IBAction func loadAd(_ sender: Any) {
    if (interstitial != nil) {
        interstitial?.delegate = nil
        interstitial = nil
    }
    interstitial = GDTMobInterstitial.init(appId: YOUR_APP_ID, placementId: YOUR_PLACEMENT_ID)
    interstitial?.delegate = self
    
    interstitial?.loadAd()
}

@IBAction func showAd(_ sender: Any) {
    interstitial?.present(fromRootViewController: self)
}
  1. 将YOUR_APP_ID和YOUR_PLACEMENT_ID替换成你自己的APPID和PLACEMENTID。

注意

 

在不展示插屏广告时执行调试

在您的ViewController里实现如下回调,处理插屏广告加载失败的问题:

Objective-C
- (void)interstitialFailToLoadAd:(GDTMobInterstitial *)interstitial error:(NSError *)error
{
    NSLog(@"interstitial fail to load, Error : %@",error);
}
Swift
func interstitialFail(toLoadAd interstitial: GDTMobInterstitial!, error: Error!) {
    print(#function,error)
}

 

在iOS应用中添加开屏广告

开屏广告会在您的应用开启时加载,拥有固定展示时间(一般为5秒),展示完毕后自动关闭并进入您的应用主界面。请按照本章内容来展示此类广告。

半屏全屏

开屏广告生命周期事件回调

您可以实现全部或部分GDTSplashAdDelegate,以跟踪点击成功或者插屏广告请求失败等广告生命周期事件。

@protocol GDTSplashAdDelegate <NSObject>
@optional
- (void)splashAdSuccessPresentScreen;
- (void)splashAdFailToPresent:error;
- (void)splashAdApplicationWillEnterBackground;
- (void)splashAdExposured;
- (void)splashAdClicked;
- (void)splashAdWillClosed;
- (void)splashAdClosed;
- (void)splashAdWillPresentFullScreenModal;
- (void)splashAdDidPresentFullScreenModal;
- (void)splashAdWillDismissFullScreenModal;
- (void)splashAdDidDismissFullScreenModal;
- (void)splashAdLifeTime;
@end

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

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

回调函数列表

回调函数名回调函数含义
splashAdSuccessPresentScreen开屏广告成功展示
splashAdFailToPresent开屏广告展示失败
splashAdApplicationWillEnterBackground应用进入后台时回调
splashAdExposured开屏广告曝光回调
splashAdClicked开屏广告点击回调
splashAdWillClosed开屏广告将要关闭回调
splashAdClosed开屏广告关闭回调
splashAdWillPresentFullScreenModal开屏广告点击以后即将弹出全屏广告页
splashAdDidPresentFullScreenModal开屏广告点击以后弹出全屏广告页
splashAdWillDismissFullScreenModal点击以后全屏广告页将要关闭
splashAdDidDismissFullScreenModal点击以后全屏广告页已经关闭
splashAdLifeTime开屏广告剩余时间回调

 

开屏广告拉取超时时间

您可以设置拉取广告的超时时间,默认为3秒。通常情况,开发者调用loadAd后会展示backgroundColor,如果在该时间内广告拉取成功,则显示开屏广告;否则放弃本次广告展示。

Objective-C
self.splashAd.fetchDelay = 5;
Swift
splashAd.fetchDelay = 5

加载并显示开屏广告

  1. 在AppDelegate头文件中导入头文件并声明实例
Objective-C
 #import "GDTSplashAd.h"
 @interface GDTAppDelegate : UIResponder <UIApplicationDelegate,GDTSplashAdDelegate>
 @property (strong, nonatomic) GDTSplashAd *splash;
 @property (retain, nonatomic) UIView *bottomView;
 @end
Swift
class SplashViewController: UIViewController,GDTSplashAdDelegate {
    private var splashAd: GDTSplashAd!
    private var bottomView: UIView!
    ...
  }
  1. 在AppDelegate的实现文件中初始化并加载广告数据,开屏广告目前支持全屏开屏和半屏开屏广告两种形式,其中半屏开屏广告支持开发者自定义设置开屏底部的界面,用以展示应用Logo等。
Objective-C
  GDTSplashAd *splash = [[GDTSplashAd alloc] initWithAppkey: YOUR_APP_ID placementId:YOUR_PLACEMENT_ID];
  splash.delegate = self; //设置代理
  //根据iPhone设备不同设置不同背景图
  if ([[UIScreen mainScreen] bounds].size.height >= 568.0f) {
   splash.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"LaunchImage-568h"]];
  } else {
   splash.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"LaunchImage"]];
  }
  splash.fetchDelay = 3; //开发者可以设置开屏拉取时间,超时则放弃展示
  //[可选]拉取并展示全屏开屏广告
  //[splashAd loadAdAndShowInWindow:self.window];
  //设置开屏底部自定义LogoView,展示半屏开屏广告
  _bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width, 100)];
  UIImageView *logo = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SplashBottomLogo"]];
  [_bottomView addSubview:logo];
  logo.center = _bottomView.center;
  _bottomView.backgroundColor = [UIColor whiteColor];
Swift
  splashAd = GDTSplashAd.init(appId: YOUR_APP_ID, placementId: YOUR_PLACEMENT_ID)
  splashAd.delegate = self
  splashAd.fetchDelay = 3
  var splashImage = UIImage.init(named: "SplashNormal")
  if Util.isIphoneX() {
      splashImage = UIImage.init(named: "SplashX")
  } else if Util.isSmallIphone() {
      splashImage = UIImage.init(named: "SplashSmall")
  }
  splashAd.backgroundImage = splashImage
  bottomView = UIView.init(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.height * 0.25)))
  bottomView.backgroundColor = .white
  let logo = UIImageView.init(image: UIImage.init(named: "SplashLogo"))
  logo.frame = CGRect(origin: CGPoint.zero, size: CGSize(width: 311, height: 47))
  logo.center = bottomView.center
  bottomView.addSubview(logo)
  let window = UIApplication.shared.keyWindow
  splashAd.loadAndShow(in: window, withBottomView: bottomView, skip: nil)
  1. 将YOUR_APP_ID和YOUR_PLACEMENT_ID替换成你自己的APPID和PLACEMENTID。

说明

目前腾讯广告联盟开屏广告只针对iPhone设备在垂直方向上展示。

 

在不展示开屏广告时执行调试

在您的ViewController里实现如下回调,处理开屏广告加载失败的问题:

Objective-C
- (void)splashAdFailToPresent:(GDTSplashAd *)splashAd 
withError:(NSError *)error
{
    NSLog(@"%s%@",__FUNCTION__,error);
}
Swift
func splashAdFail(toPresent splashAd: GDTSplashAd!, withError error: Error!) {
    print(#function,error)
}

说明:开屏广告只支持竖屏使用。

在iOS应用中添加原生模板广告

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

原生广告(模板方式)有七种广告样式可选:

上图下文
(图片尺寸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 使用原生模板广告的接口,则会导致无广告返回。

原生模板广告生命周期事件回调

您可以实现全部或部分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!
    ...
  }
  1. 在试图控制器的ViewDidLoad中的实现文件中初始化并加载广告数据。如果您的广告是视频和图文混出类型,则您可以在这里定义视频播放器的属性:
Objective-C
- (void)viewDidLoad
{
   [super viewDidLoad];
   // 支持视频广告的 PlacementId 会混出视频与图片广告
   self.nativeExpressAd = [[GDTNativeExpressAd alloc] initWithAppId:@"YOUR_APP_ID" placementId:@"YOUR_PLACEMENT_ID" adSize:CGSizeMake(self.widthSlider.value, self.heightSlider.value)];
   self.nativeExpressAd.delegate = self;
   // 配置视频播放属性
   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(appId: YOUR_APP_ID, 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))
}
  1. 将YOUR_APP_ID和YOUR_PLACEMENT_ID替换成你自己的APPID和PLACEMENTID。
  2. 实现获取广告成功的回调,在回调里做数据处理,并且为原生模板广告的展现做准备。这里以展示在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)
}

在iOS应用中添加原生广告

使用原生广告的API,您可以为您的应用打造定制式体验。在使用原生广告的API时,您会收到一组相关属性(图标、图片、广告标题、广告描述等)。 一条典型的广告包含如下字段,如有需要您可以创建以下字段相关视图:

  1. 广告App图标                                           
  2. 广告媒体图(URL)
  3. 广告标题
  4. 广告描述

除此之外,开发者还可以拿到应用类广告的星级、应用类广告的价格、以及三小图广告的图片集合。

具体字段在GDTNativeAdData,其含义如下表所示:

描述
GDTNativeAdDataKeyTitle广告标题
GDTNativeAdDataKeyDesc广告描述
GDTNativeAdDataKeyIconUrl广告图标URL
GDTNativeAdDataKeyImgUrl广告详情图URL
GDTNativeAdDataKeyAppRating应用类广告的星级数据
GDTNativeAdDataKeyAppPrice应用类广告的价格数据
GDTNativeAdDataKeyImgList三小图广告的图片集合

原生广告生命周期事件回调

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

@protocol GDTNativeAdDelegate <NSObject>
- (void)nativeAdSuccessToLoad:(NSArray *)nativeAdDataArray;
- (void)nativeAdFailToLoad:(NSError *)error;
@optional
- (void)nativeAdWillPresentScreen;
- (void)nativeAdApplicationWillEnterBackground;
- (void)nativeAdClosed;
@end

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

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

回调函数列表

回调函数名回调函数含义
nativeAdSuccessToLoad原生广告加载广告数据成功回调
nativeAdFailToLoad原生广告加载广告数据失败回调
nativeAdWillPresentScreen原生广告点击之后回调
nativeAdApplicationWillEnterBackground原生广告点击之后应用进入后台时回调
nativeAdClosed原生广告点击以后浏览器被关闭时回调

加载并显示原生广告

  1. 在控制器头文件中加入SDK头文件,声明nativeAD变量和nativeAD对应的data对象GDTNativeAdData
Objective-C
 #import "GDTNativeAd.h"
 @interface NativeViewController ()<GDTNativeAdDelegate>
 @property (nonatomic, strong) GDTNativeAd *nativeAd;
 @property (nonatomic, strong) NSArray *adArray;
 @property (nonatomic, strong) GDTNativeAdData *currentAdData;
Swift
  class NativeViewController: UIViewController,GDTNativeAdDelegate {
  var nativeAd:GDTNativeAd!
  var adArray:Array<GDTNativeAdData>!
  var currentAdData:GDTNativeAdData!
  var adView:UIView!
  var attached:Bool = false
  ...
}
  1. 在ViewController的实现文件中初始化并加载广告数据:
Objective-C
 - (void)viewDidLoad
 {
     [super viewDidLoad];
     self.nativeAd = [[GDTNativeAd alloc] initWithAppId:@"YOUR_APP_ID" placementId:@"YOUR_PLACEMENT_ID"];
     self.nativeAd.controller = self;
     self.nativeAd.delegate = self;
     [self.nativeAd loadAd:1];
 }
Swift
override func viewDidLoad() {
    super.viewDidLoad()
    self.nativeAd = GDTNativeAd.init(appId: YOUR_APP_ID, placementId: YOUR_PLACEMENT_ID)
    self.nativeAd.controller = self
    self.nativeAd.delegate = self
    self.nativeAd.load(1)
}
  1. 将YOUR_APP_ID和YOUR_PLACEMENT_ID替换成你自己的APPID和PLACEMENTID。
  2. 需要在广告内容准备就绪的时候展示广告。您需要在拿到数据的回调方法,即nativeAdSuccessToLoad里处理数据并做广告展示:
Objective-C
-(void)nativeAdSuccessToLoad:(NSArray *)nativeAdDataArray
{
   /*广告数据拉取成功,存储并展示*/
   self.adArray = nativeAdDataArray;
   dispatch_async(dispatch_get_main_queue(), ^{
       ...
   });
}
Swift
func nativeAdSuccess(toLoad nativeAdDataArray: [Any]!) {
    print(#function)
    self.adArray = nativeAdDataArray as! Array<GDTNativeAdData>
    DispatchQueue.main.async {
      ...
    }
}

在不展示原生广告时执行调试

在您的ViewController里实现如下回调,处理原生广告加载失败的问题:

Objective-C
- (void)nativeAdFailToLoad:(NSError *)error
{
    NSLog(@"%@",error);
    /*广告数据拉取失败*/
dispatch_async(dispatch_get_main_queue(), ^{
     ...
});
}
Swift
func nativeAdFail(toLoad error: Error!) {
    print(error)
    DispatchQueue.main.async {
    ...
    }
}

说明

  1. 建议在释放原生广告 GDTNativeAd 对象之前将 GDTNativeAd 对象的 delegate 属性设置为nil.
  2. 当用户点击广告弹出内置目标页时,请勿释放 GDTNativeAd 实例。
  3. 广告从拉取到曝光超过45分钟,将作为无效曝光。
  4. 广告从拉取到点击超过90分钟,将作为无效点击,不会进行计费。
  5. 广告数据渲染完毕,即将展示时需调用 AttachAd 方法,否则将不会产生曝光记录,也无法进行计费。

在iOS应用中添加激励视频广告

激励视频广告是一种常见于游戏内的广告样式。用户通过开发者提供的入口,全屏观看完整视频,获得相应的奖励。目前的视频包括横版及竖版2种样式,您可以根据需要创建对应的广告位。样式图如下: (目前激励视频需要开通相应的权限,才可以创建激励视频样式的广告位):

竖屏广告横屏广告

激励视频广告生命周期事件回调

您可以实现全部或部分GDTRewardedVideoAdDelegate,以跟踪点击成功或者激励视频广告请求失败等广告生命周期事件。

@protocol GDTRewardedVideoAdDelegate <NSObject>
@optional
- (void)gdt_rewardVideoAdDidLoad:(GDTRewardVideoAd *)rewardedVideoAd;
- (void)gdt_rewardVideoAdVideoDidLoad:(GDTRewardVideoAd *)rewardedVideoAd;
- (void)gdt_rewardVideoAdWillVisible:(GDTRewardVideoAd *)rewardedVideoAd;
- (void)gdt_rewardVideoAdDidExposed:(GDTRewardVideoAd *)rewardedVideoAd;
- (void)gdt_rewardVideoAdDidClose:(GDTRewardVideoAd *)rewardedVideoAd;
- (void)gdt_rewardVideoAdDidClicked:(GDTRewardVideoAd *)rewardedVideoAd;
- (void)gdt_rewardVideoAd:(GDTRewardVideoAd *)rewardedVideoAd didFailWithError:(NSError *)error;
- (void)gdt_rewardVideoAdDidRewardEffective:(GDTRewardVideoAd *)rewardedVideoAd;
- (void)gdt_rewardVideoAdDidPlayFinish:(GDTRewardVideoAd *)rewardedVideoAd;
@end

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

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

回调函数列表

回调函数名回调函数含义
gdt_rewardVideoAdDidLoad激励视频广告加载广告数据成功回调
gdt_rewardVideoAdVideoDidLoad激励视频数据下载成功回调,已经下载过的视频会直接回调
gdt_rewardVideoAdWillVisible激励视频播放页即将展示回调
gdt_rewardVideoAdDidExposed激励视频广告曝光回调
gdt_rewardVideoAdDidClose激励视频广告播放页关闭回调
gdt_rewardVideoAdDidClicked激励视频广告信息点击回调
gdt_rewardVideoAd:didFailWithError激励视频广告各种错误信息回调
gdt_rewardVideoAdDidRewardEffective激励视频广告播放达到激励条件回调,以此回调作为奖励依据
gdt_rewardVideoAdDidPlayFinish激励视频广告播放完成回调

加载并显示激励广告

  1. 在控制器头文件中加入SDK头文件,声明rewardVideoAd属性
Objective-C
 #import "GDTRewardVideo.h"
 @interface RewardVideoViewController ()<GDTRewardedVideoAdDelegate>
 @property (nonatomic, strong) GDTRewardVideo *rewardVideoAd;
Swift
  class RewardVideoViewController: UIViewController,GDTRewardedVideoAdDelegate {
  var rewardVideoAd:GDTRewardVideo!
  ...
}
  1. 在ViewController的实现文件中初始化并加载广告数据:
Objective-C
 - (void)viewDidLoad
 {
     [super viewDidLoad];
     self.rewardVideoAd = [[GDTRewardVideo alloc] initWithAppId:@"YOUR_APP_ID" placementId:@"YOUR_PLACEMENT_ID"];
     self.rewardVideoAd.delegate = self;
     [self.rewardVideoAd loadAd];
 }
Swift
override func viewDidLoad() {
    super.viewDidLoad()
    self.rewardVideoAd = GDTRewardVideo.init(appId: YOUR_APP_ID, placementId: YOUR_PLACEMENT_ID)
    self.rewardVideoAd.delegate = self
    self.rewardVideoAd.load()
}
  1. 将YOUR_APP_ID和YOUR_PLACEMENT_ID替换成你自己的APPID和PLACEMENTID。
  2. 需要在广告内容准备就绪的时候展示广告。推荐您在收到激励视频数据下载成功回调之后,再在合适的时机做激励视频的展示:
Objective-C
- (void)gdt_rewardVideoAdVideoDidLoad:(GDTRewardVideoAd *)rewardedVideoAd
{
    NSLog(@"视频文件加载成功");
}
// 确认激励视频广告有效性之后,在合适的时机展示广告
- (IBAction)playVideo:(UIButton *)sender {
    if (self.rewardVideoAd.expiredTimestamp <= [[NSDate date] timeIntervalSince1970]) {
        self.statusLabel.text = @"广告已过期,请重新拉取";
        return;
    }
    if (!self.rewardVideoAd.isAdValid) {
        self.statusLabel.text = @"广告失效,请重新拉取";
        return;
    }
    [self.rewardVideoAd showAdFromRootViewController:self];
}
Swift
func gdt_rewardVideoAdVideoDidLoad(_ rewardedVideoAd: GDTRewardVideoAd!) {
    print(@"视频文件加载成功")
}
// 确认激励视频广告有效性之后,在合适的时机展示广告
@IBAction func clickPlay(_ sender: Any) {
  if (self.rewardVideoAd.expiredTimestamp <= Int(Date.init().timeIntervalSince1970)) {
    self.statusLabel.text = "广告已过期,请重新拉取"
    return
  }
  if (!self.rewardVideoAd.isAdValid) {
    self.statusLabel.text = "广告失效,请重新拉取"
    return
  }
  self.rewardVideoAd.show(fromRootViewController: self)
}

在不展示激励视频广告时执行调试

在您的ViewController里实现如下回调,处理激励视频广告加载失败的问题:

Objective-C
- (void)gdt_rewardVideoAd:(GDTRewardVideoAd *)rewardedVideoAd didFailWithError:(NSError *)error
{
    if (error.code == 4014) {
        NSLog(@"请拉取到广告后再调用展示接口");
        self.statusLabel.text = @"请拉取到广告后再调用展示接口";
    } else if (error.code == 4016) {
        NSLog(@"应用方向与广告位支持方向不一致");
        self.statusLabel.text = @"应用方向与广告位支持方向不一致";
    } else if (error.code == 5012) {
        NSLog(@"广告已过期");
        self.statusLabel.text = @"广告已过期";
    } else if (error.code == 4015) {
        NSLog(@"广告已经播放过,请重新拉取");
        self.statusLabel.text = @"广告已经播放过,请重新拉取";
    } else if (error.code == 5002) {
        NSLog(@"视频下载失败");
        self.statusLabel.text = @"视频下载失败";
    } else if (error.code == 5003) {
        NSLog(@"视频播放失败");
        self.statusLabel.text = @"视频播放失败";
    } else if (error.code == 5004) {
        NSLog(@"没有合适的广告");
        self.statusLabel.text = @"没有合适的广告";
    }
    NSLog(@"ERROR: %@", error);
}
Swift
func gdt_rewardVideoAd(_ rewardedVideoAd: GDTRewardVideoAd!, didFailWithError error: Error!) {
    let code = (error as NSError).code
    if (code == 4014) {
        print("请拉取到广告后再调用展示接口")
        self.statusLabel.text = "请拉取到广告后再调用展示接口"
    } else if (code == 5012) {
        print("广告已过期")
        self.statusLabel.text = "广告已过期"
    } else if (code == 4015) {
        print("广告已经播放过,请重新拉取")
        self.statusLabel.text = "广告已经播放过,请重新拉取"
    } else if (code == 5002) {
        print("视频下载失败")
        self.statusLabel.text = "视频下载失败"
    } else if (code == 5003) {
        print("视频播放失败")
        self.statusLabel.text = "视频播放失败"
    } else if (code == 5004) {
        print("没有合适的广告");
        self.statusLabel.text = "没有合适的广告"
    }
    print("\(error)")
}

说明

  1. 建议在释放激励视频广告 GDTRewardVideoAd 对象之前将 GDTRewardVideoAd 对象的 delegate 属性设置为nil.
  2. 当用户点击广告弹出内置目标页时,请勿释放 GDTRewardVideoAd 实例。
  3. 广告从拉取成功会提供 expiredTimestamp 属性表示广告的超时时间,展示广告之前请做广告的有效性检查,广告如果失效请提前重新拉取,否则将作无法展示广告。

问题排查

如果根据正常的注册流程仍然无法在嵌入腾讯广告联盟SDK的app中看到广告,可以在各个广告形式的delegate失败回调方法中输出错误信息。 腾讯广告联盟在打印广告关键信息时会带上[GDTMob::GDTMob]的标记,其他带有GDTMob标记的log与广告信息无关。

errorCode描述
3001网络错误
4001初始化错误, 包括广告位为空、AppKey为空、ViewController
为空
4003广告位错误
4006广告未曝光
4007设备不支持
4008设备方向不支 持
4009开屏跳过按钮定义非法
4010开屏bottomView设置非法
4011请求广告超时
4013系统不支持,原生视频模板广告只支持 iOS 9 及以上系统
4014广告数据返回前尝试展示广告, 例如激励视频拉到广告后才可以调用展示接口
4015广告已经曝光过,不允许二次展示,请重新拉取
4016应用横竖方向与广告位支持方向不匹配
5001后台数据错误
5002视频素材下载错误
5003视频素材播放错误
5004没匹配的广告,禁止重试,否则影响流量变现效果
5005广告请求量或者消耗等超过日限额,请第二天再请求广告
5006包名校验非法
5009广告请求量或者消耗等超过小时限额,请一小时后再请求广告
5010广告样式校验失败,请检查广告位与接口使用是否一致
5012广告过期,请重新拉取
6000未知错误,联系腾讯广告联盟商务同事协助排查