标准原生
一、集成建议
- (1)原生广告是可以由开发者控制大小,尽可能融入到app的内容中去,从而提升广告的点击和转化。
 - (2)原生广告分自渲染和模板渲染:
 
| 类型 | 说明 | 
|---|---|
| 自渲染 | 三方广告平台返回广告素材由开发者来拼接成的类型。三方后台的类型选择需要和TP后台一致,否则会请求失败。 | 
| 模板渲染 | 三方广告平台返回渲染好的view,开发者直接添加到一个容器就可以展示出来。 | 
注意事项
- 接入Facebook原生广告必须有以下元素。缺少这些元素可能会导致 FaceBook不计入展示。更多了解,请看Audience Network 原生广告介绍。

 
二、TradPlusAdNative API说明
1. 加载、展示广告
- 参数说明
 
| 参数 | 说明 | 
|---|---|
| adUnitID | adUnitID为TradPlus后台创 建的广告位ID,SDK将根据广告位ID拉取配置并请求广告 | 
| sceneId | sceneId为广告场景ID是可选参数,默认为nil,开发者需和- (void)showAdWithSceneId:(nullable NSString *)sceneId;配套使用如需使用广告场景请参考: 广告场景说明  | 
| renderingViewClass | 指定原生渲染模版,开发者通过RenderingViewClass可实现自定义布局,未设置时SDK会使用默认模版进行渲染 | 
| TradPlusNativeRenderer | 指定原生的renderer,未设置时SDK会使用默认模版进行渲染 | 
| subview | 渲染后会添加到此view上 | 
| finishDownload | 下载完资源成后通知load完成(可选) | 
- 方法说明
 
| 方法 | 说明 | 
|---|---|
| - (void)setAdUnitID:(NSString *)adUnitID; | 设置广告位ID | 
| - (void)loadAd; | 请求该广告位原生广告 | 
| - (BOOL)isReady; | 检测该广告位是否有可用广告true为有可用广告flase为无可用广告 | 
| - (void)entryAdScenario:(nullable NSString *)sceneId; | 进入广告场景 广告场景是用来统计进入广告场景的次数和进入场景后展示广告的次数,所以请在准确的位置调用。  | 
| - (void)showADWithRenderingViewClass:(Class)renderingViewClass subview:(UIView *)subView sceneId:(nullable NSString *)sceneId; | 展示该广告位原生广告 开发者通过RenderingViewClass可实现自定义布局,广告素材通过此布局拼接广告样式。可参照 Demo 中的 TPNativeTemplate  | 
| - (void)showADWithNativeRenderer:(TradPlusNativeRenderer *)renderer subview:(UIView *)subView sceneId:(nullable NSString *)sceneId; | 展示该广告位原生广告 通过自定义renderer方式  | 
| - (void)setTemplateRenderSize:(CGSize)size; | 设置 原生模版类广告的加载尺寸(可选) | 
2. 监听回调
- 参数说明
 
| 参数 | 说明 | 
|---|---|
| adInfo | 广告位ID、三方广告平台、ecpm等信息,具体请参考回调信息说明 | 
| error | 返回的是TP封装的错误信息:详见: 错误码说明 | 
TradPlusADNativeDelegate回调接口及说明
| 方法 | 说明 | 
|---|---|
| - (void)tpNativeAdLoaded:(NSDictionary *)adInfo; | 原生广告加载完成 v9.6.0+ 优化回调方式,一次 loadAd对应一次tpNativeAdLoaded回调,不调用不回调。 | 
| - (void)tpNativeAdLoadFailWithError:(NSError *)error; | 原生广告加载失败,返回的是TP封装的错误信息。详见: 错误码说明  tpNativeAdOneLayerLoad:didFailWithError:返回三方源的错误信息 | 
| - (void)tpNativeAdImpression:(NSDictionary *)adInfo; | 原生广告展示成功,三方认可的有效展示 | 
| - (void)tpNativeAdShow:(NSDictionary *)adInfo didFailWithError:(NSError *)error; | 原生广告展现失败 | 
| - (void)tpNativeAdClicked:(NSDictionary *)adInfo; | 原生广告被点击 | 
TradPlusADNativeDelegate回调接口及说明(可选)
| 方法 | 说明 | 
|---|---|
| - (UIViewController *)viewControllerForPresentingModalView; | 为三方提供rootviewController 用于点击广告后的操作 | 
| - (void)tpNativeAdStartLoad:(NSDictionary *)adInfo; | v7.6.0+新增 开始加载流程 | 
| - (void)tpNativeAdLoadStart:(NSDictionary *)adInfo; | v7.6.0+已废弃 请使用 tpNativeAdOneLayerStartLoad: | 
| - (void)tpNativeAdOneLayerStartLoad:(NSDictionary *)adInfo; | 当每个广告源开始加载时会都会回调一次。 v7.6.0+新增 替代原回调接口:tpNativeAdLoadStart:(NSDictionary *)adInfo;  | 
| - (void)tpNativeAdIsLoading:(NSDictionary *)adInfo; | v8.7.0+新增 调用load之后如果收到此回调,说明广告位仍处于加载状态,无法触发新的一轮广告加载。 | 
| - (void)tpNativeAdClose:(NSDictionary *)adInfo; | 原生广告被关闭 | 
| - (void)tpNativeAdBidStart:(NSDictionary *)adInfo; | bidding开始 | 
| - (void)tpNativeAdBidEnd:(NSDictionary *)adInfo success:(BOOL)success; | v7.6.0+已废弃 请使用 tpNativeAdBidEnd:error: | 
| - (void)tpNativeAdBidEnd:(NSDictionary *)adInfo error:(NSError *)error; | bidding结束 error = nil 表示成功 | 
| - (void)tpNativeAdOneLayerLoaded:(NSDictionary *)adInfo; | 当每个 广告源加载成功后会都会回调一次。 | 
| - (void)tpNativeAdOneLayerLoad:(NSDictionary *)adInfo didFailWithError:(NSError *)error; | 当每个广告源加载失败后会都会回调一次,返回三方源的错误信息 | 
| - (void)tpNativeAdAllLoaded:(BOOL)success; | 加载流程全部结束 | 
| - (void)tpNativePasterDidPlayFinished:(NSDictionary *)adInfo; | 视频贴片类型播放完成回调 v6.8.0+ | 
| - (void)tpNativeAdVideoPlayStart:(NSDictionary *)adInfo; | v7.8.0+新增 视频播放开始 | 
| - (void)tpNativeAdVideoPlayEnd:(NSDictionary *)adInfo; | v7.8.0+新增 视频播放结束 | 
| - (void)tpNativeAdDisLikeInfo:(NSDictionary *)dislikeInfo adInfo:(NSDictionary *)adInfo; | v9.4.0+新增 dislike回调  当前支持穿山甲,百度,快手,Sigmob平台 tpNativeAdDisLikeInfo:adInfo: 会替代这些平台的 tpNativeAdClose: 回调,如无特殊需求可以不设置 dislikeInfo[@"dislikeInfo"]:三方源返回的dislike信息 dislikeInfo[@"dislikeObject"]:三方源返回的对象信息,可能为nil  | 
3. 其他API
- 获取原生广告的媒体内容宽高比( v9.7.0+) 注:支持AdMob、FaceBook、MyTarget、穿山甲
 
@property (nonatomic,strong)TradPlusAdNativeObject *nativeObject;
self.nativeObject = [self.native getReadyNativeObject];
    if(self.nativeObject != nil)
    {
        TradPlusAdRes *res = self.nativeObject.res;
        CGFloat aspectRatio = res.aspectRatio;
    }
三、示例代码
请参考:TradPlusAdNativeViewController
#import <TradPlusAds/TradPlusAdNative.h>
@interface TradPlusAdNativeViewController ()<TradPlusADNativeDelegate>
@property (nonatomic,strong)TradPlusAdNative *nativeAd;
@end
@implementation TradPlusAdNativeViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.nativeAd = [[TradPlusAdNative alloc] init];
	//设置广告位ID
    [self.nativeAd setAdUnitID:@"在TP平台创建的广告位ID"];
	//设置原生模版类广告的加载尺寸(可选)
	[self.nativeAd setTemplateRenderSize:CGSizeMake(320, 200)];
	//下载完资源成后通知load完成(可选)
	self.nativeAd.finishDownload = YES;
	//设置回调
	self.nativeAd.delegate = self;
	//加载广告需要一些时间,可以在展示广告前提前加载好广告
	[self.nativeAd loadAd];
}
- (void)showNativeAd
{
    //直接通过布局Class进行渲染
//    [self showWithRenderingViewClass];
    //通过自定义Renderer进行渲染
    [self showWithRenderer];
//    NSDictionary *adInfo = [self.nativeAd getReadyAdInfo];
//    //为空则说明没有广告
//    if(adInfo != nil)
//    {
        //可以通过以下两个字短判断是那个广告源
//        MSThirdNetwork thirdNetwork = (MSThirdNetwork)[adInfo[@"network_id"] integerValue];
//        NSString *adsource_name = adInfo[@"adsource_name"];
//        NSLog(@"%@ %u",adsource_name ,thirdNetwork);
//    }
}
//通过设置 NativeRenderer 来渲染
- (void)showWithRenderer
{
    //支持任何UIView 无需支持任何协议
    TPNativeTemplate *adView = [[NSBundle mainBundle] loadNibNamed:@"TPNativeTemplate" owner:self options:nil].lastObject;
    adView.frame = self.adView.bounds;
    [adView layoutIfNeeded];
    TradPlusNativeRenderer *nativeRenderer = [[TradPlusNativeRenderer alloc] init];
    [nativeRenderer setTitleLable:adView.titleLabel canClick:YES];
    [nativeRenderer setTextLable:adView.textLabel canClick:YES];
    [nativeRenderer setCtaLable:adView.ctaLabel canClick:YES];
    [nativeRenderer setIconView:adView.iconImageView canClick:YES];
    [nativeRenderer setMainImageView:adView.mainImageView canClick:YES];
    [nativeRenderer setAdChoiceImageView:adView.adChoiceImageView canClick:YES];
    [nativeRenderer setAdView:adView canClick:YES];
    [self.nativeAd showADWithNativeRenderer:nativeRenderer subview:self.adView sceneId:nil];
}
//通过设置 RenderingViewClass 来渲染
- (void)showWithRenderingViewClass
{
    [self.nativeAd showADWithRenderingViewClass:[TPNativeTemplate class] subview:self.adView sceneId:nil];
}
#pragma mark - TradPlusADNativeDelegate
//原生广告加载完成 首个广告源加载成功时回调 一次加载流程只会回调一次
- (void)tpNativeAdLoaded:(NSDictionary *)adInfo
{
}
//原生广告加载失败
- (void)tpNativeAdLoadFailWithError:(NSError *)error
{
}
//原生广告展现
- (void)tpNativeAdImpression:(NSDictionary *)adInfo
{
}
//原生广告展现失败
- (void)tpNativeAdShow:(NSDictionary *)adInfo didFailWithError:(NSError *)error
{
}
//原生广告被点击
- (void)tpNativeAdClicked:(NSDictionary *)adInfo
{
}
四、自定义view 渲染方式(可选)
//初始化自定义UIView
TPNativeTemplate *nativeView = [[NSBundle mainBundle] loadNibNamed:@"TPNativeView" owner:self options:nil].lastObject;
nativeView.frame = self.adView.bounds;
[nativeView layoutIfNeeded];
//自行设置渲染元素 以及 元素是否可点击
TradPlusNativeRenderer *nativeRenderer = [[TradPlusNativeRenderer alloc] init];
[nativeRenderer setTitleLable:nativeView.titleLabel canClick:YES];
[nativeRenderer setTextLable:nativeView.textLabel canClick:YES];
[nativeRenderer setCtaLable:nativeView.ctaLabel canClick:YES];
[nativeRenderer setIconView:nativeView.iconImageView canClick:YES];
[nativeRenderer setMainImageView:nativeView.mainImageView canClick:YES];
[nativeRenderer setAdChoiceImageView:nativeView.adChoiceImageView canClick:YES];
[nativeRenderer setAdView:nativeView canClick:YES];
//设置Renderer 及 subview 
//sceneId为广告场景ID
[self.nativeAd showADWithNativeRenderer:nativeRenderer subview:self.adView sceneId:nil];
自动布局相关示例可参考:
五、原生视频贴片(v6.8.0+)
- 原生视频贴片使用方式及接入方式和原生广告一致。
 - 其中部分视频贴片广告支持使用自定义播放器进行展示。
 
使用自定义播放器需要使用 v6.8.0+新增API 来进行获取资源并进行展示。
1. 首先通过新增API getReadyNativeObject 获取一个已缓存广告对象
⚠️注意
- 从此API获取到缓存时,TPSDK同时会移除对此缓存的引用
 - 获取后,需要开发者自行保留好此对象的引用
 - 调用API返回
nil时,则说明已经没有任何缓存了。 - 一般情况下不要连续调用此API。
 
- (TradPlusAdNativeObject *)getReadyNativeObject;
2. 判断资源是否支持自定义播放器
TradPlusAdNativeObject 对象包含show方法及三方资源信息
开发者可以通过 TradPlusAdNativeObject  中的  customVideoPaster 来判断资源是否支持使用自定义播放器。
customVideoPaster = nil,则说明资源不支持使用自定义播放器。
- 属性说明
 
| 属性 | 说明 | 
|---|---|
| customAdInfo | 用于开发者在广告展示前设置透传的自定义数据,SDK将在展示后的相关回调中返回。 开发者可通过 key:customAdInfo 获取。adInfo[@"customAdInfo"]  | 
| res | TP封装的Native资源 | 
| adapter | 对应的adapter | 
| customObject | 三方的资源对象 | 
| config | 三方配置信息 | 
| adunit_id | 广告位ID | 
| adsource_placement_id | 广告源ID | 
| channel_id | 三方广告网络对应的编号 | 
| channel_name | 三方广告网络名称 | 
| adType | 原生类型 | 
| customVideoPaster | 支持自定义播放器的贴片,平台:穿山甲视频贴片 | 
3. 获取视频地址,实现各埋点回调
TradPlusAdCustomVideoPaster 对象包含视频资源信息及埋点回调接口
- 属性说明
 
| 属性 | 说明 | 
|---|---|
| videoUrl | 穿山甲国内 视频贴片的视频播放地址 | 
| videoDuration | 穿山甲国内 腾讯 视频贴片的视频播放时间 | 
- 方法说明
 
| 方法 | 说明 | 
|---|---|
| - (void)startPlayVideo; | 开始视频播放 | 
| - (void)didStartPlayVideoWithVideoDuration:(NSTimeInterval)duration; | 开始视频播放 | 
| - (void)didAutoStartPlayWithVideoDuration:(NSTimeInterval)duration; | 自动开始视频播放 | 
| - (void)didFinishVideo; | 完成视频播放 | 
| - (void)didPauseVideoWithCurrentDuration:(NSTimeInterval)duration; | 暂停视频播放 | 
| - (void)didResumeVideoWithCurrentDuration:(NSTimeInterval)duration; | 恢复视频播放 | 
| - (void)didBreakVideoWithCurrentDuration:(NSTimeInterval)duration; | 休眠视频播放 | 
| - (void)didClickVideoViewWithCurrentDuration:(NSTimeInterval)duration; | 点击视频 | 
| - (void)didPlayFailedWithError:(NSError *)error; | 视频播放失败 | 
| - (void)didPlayStartFailedWithError:(NSError *)error; | 开始播放失败 | 
| - (void)didPlayBufferStart; | 开始播放视频缓冲区 | 
| - (void)didPlayBufferEnd; | 结束播放视频缓冲区 | 
具体实现可以参照Demo NativePaster
六、广告平台特殊配置说明
StartApp
开发者可以通过以下代码设置startapp原生请求的图片尺寸
注:需要在加载前设置
v9.3.0及以上版本
self.native.localParams = @{@"startapp_primaryImageSize":@(3),@"startapp_secondaryImageSize":@(4)};
| 参数 | 说明 | |
|---|---|---|
| startapp_primaryImageSize | 主图; 默认值:4 (1200X628)  | 0 - image size of 72X72  1 - image size of 100X100 2 - image size of 150X150 3 - image size of 340X340 4 - image size of 1200X628  | 
| startapp_secondaryImageSize | 副图; 默认值:2 (150X150)  | 0 - image size of 72X72  1 - image size of 100X100 2 - image size of 150X150 3 - image size of 340X340  | 
Admob & GoogleAdManger
开发者可以通过以下代码设置 Admob&GoogleAdManger 原生广告的角标位置
注:需要在设置广告位ID前设置
v9.3.0及以上版本
AdMobAdChoicesPosition pos = AdMobAdChoicesPositionTopRightCorner;
self.native.localParams = @{@"adchoices_position":@(pos)};
支持容器的4角位置
 AdMobAdChoicesPositionTopRightCorner       ///< Top right corner.
 AdMobAdChoicesPositionTopLeftCorner         ///< Top left corner.
 AdMobAdChoicesPositionBottomRightCorner  ///< Bottom right corner.
 AdMobAdChoicesPositionBottomLeftCorner    ///< Bottom Left Corner.
Liftoff
v12.7.0及以上版本 使用 Inline类型广告时需通过以下API设置需要的广告尺寸
//加载前设置
[self.nativeAd setTemplateRenderSize:CGSizeMake(320, 400)];
另:如需要单独设置Liftoff的 Inline类型广告尺寸
//加载前设置
self.native.localParams = @{@"liftoff_inline_width":@(320),@"liftoff_inline_height":@(400)};