Skip to main content

原生广告

一.必要重写的方法#

  • 开发者需要继承 TradPlusBaseAdapter并重写相关方法:
    • 开发者调用 TradPlusAdNativeloadAd API时,会调用到自定义Adapter的loadAdWithWaterfallItem:方法
    • 开发者调用 TradPlusAdNativeisAdReadyAPI时,会调用到自定义Adapter的isReady方法
    • 开发者调用TradPlusAdNativeshowADWithRenderingViewClass:subview:sceneId:showADWithNativeRenderer:subview:sceneId:API时,会依次调用到自定义Adapter的isReadyendRender:clickView:(自渲染类型)方法
方法参数说明返回值作用
- (void)loadAdWithWaterfallItem:(TradPlusAdWaterfallItem *)itemitem:包含有服务器下发和本地配置的参数void用于获取服务器下发和本地配置的参数,实现自定义广告的加载逻辑
- (UIView )endRender:(NSDictionary )viewInfo clickView:(NSArray *)arrayviewInfo:渲染组件字典列表
clickView:可点击view数组
id用于自渲染类型原生广告注册组件,点击事件等操作。
- (BOOL)isReady-----Bool用于展示广告前判断自定义广告是否过期

二.回调方法说明#

方法说明
- (void)AdConfigError广告配置信息错误时执行回调给开发者
- (void)AdLoadFinsh广告加载完成时执行回调给开发者
- (void)AdLoadFailWithError:(NSError *)error广告加载失败时执行回调给开发者
error:错误信息
- (void)AdShow广告展示时执行回调给开发者
- (void)AdShowFailWithError:(NSError *)error广告展示失败时执行回调给开发者
error:错误信息
- (void)AdClick广告点击时执行回调给开发者
- (void)AdClose三方广告关闭通知时执行回调给开发者
(部分广告平台的模版类型支持)

三.集成说明#

1.创建您在 TP后台登记 的自定义类,并继承TradPlusBaseAdapter

#import <TradPlusAds/TradPlusBaseAdapter.h>
@interface ClassName : TradPlusBaseAdapter
@end

2.在loadAdWithWaterfallItem:方法中实现自定义平台的初始化,加载等逻辑

  • 通过 TradPlusAdWaterfallItem 类,item.config 获取 后台配置的参数
  • 初始化自定义广告平台,根据自身需求,设置广告平台的参数,海外平台的隐私设置(如:CCPA,COPPA,GDPR)等。
//以AdMob为例
- (void)loadAdWithWaterfallItem:(TradPlusAdWaterfallItem *)item
{
//通过 item.config 获取后台配置信息
NSString *placementId = item.config[@"placementId"];
if(placementId == nil)
{
//配置错误
[self AdConfigError]
return;
}
//初始化三方平台,设置广告平台的参数,海外平台的隐私设置等
GADRequest *request = [GADRequest request];
//设置GDPR
if (![MSConsentManager sharedManager].canCollectPersonalInfo)
{
GADExtras *extras = [[GADExtras alloc] init];
extras.additionalParameters = @{@"npa": @"1"};
[request registerAdNetworkExtras:extras];
}
//设置其他参数
GADNativeAdImageAdLoaderOptions *nativeAdImageLoaderOptions =
[[GADNativeAdImageAdLoaderOptions alloc] init];
nativeAdImageLoaderOptions.shouldRequestMultipleImages = NO;
GADNativeAdMediaAdLoaderOptions *nativeAdMediaAdLoaderOptions =
[[GADNativeAdMediaAdLoaderOptions alloc] init];
nativeAdMediaAdLoaderOptions.mediaAspectRatio = GADMediaAspectRatioAny;
GADNativeAdViewAdOptions *nativeAdViewAdOptions = [[GADNativeAdViewAdOptions alloc] init];
nativeAdViewAdOptions.preferredAdChoicesPosition = GADAdChoicesPositionTopRightCorner;
self.adLoader =
[[GADAdLoader alloc] initWithAdUnitID:placementId
rootViewController:nil
adTypes:@[ kGADAdLoaderAdTypeNative ]
options:@[ nativeAdImageLoaderOptions,
nativeAdViewAdOptions,
nativeAdMediaAdLoaderOptions
]];
self.adLoader.delegate = self;
[self.adLoader loadRequest:request];
}

3.根据load结果调用 AdLoadFailWithError:AdLoadFinsh

  • 加载失败
//以AdMob为例
#pragma mark - GADAdLoaderDelegate
- (void)adLoader:(nonnull GADAdLoader *)adLoader
didFailToReceiveAdWithError:(nonnull NSError *)error
{
//加载失败
[self AdLoadFailWithError:error];
}
  • 加载成功 (自渲染类型)
    • 加载成功后 新建 TradPlusAdRes
    • 根据平台需求,将自渲染素材中元素 或三方控件 与 TradPlusAdRes中的字段进行绑定
    • TradPlusAdResself.waterfallItem.adRes 进行绑定
    • 调用 AdLoadFinsh 完成加载流程
//以AdMob为例
#pragma mark - GADNativeAdLoaderDelegate
- (void)adLoader:(nonnull GADAdLoader *)adLoader didReceiveNativeAd:(nonnull GADNativeAd *)nativeAd
{
self.nativeAd = nativeAd;
self.nativeAd.delegate = self;
//新建 TradPlusAdRes
TradPlusAdRes *res = [[TradPlusAdRes alloc] init];
//绑定元素
res.title = self.nativeAd.headline;
res.body = self.nativeAd.body;
res.ctaText = self.nativeAd.callToAction;
if(self.nativeAd.icon != nil)
{
res.iconImage = self.nativeAd.icon.image;
}
self.mediaView = [[GADMediaView alloc] init];
self.mediaView.mediaContent = self.nativeAd.mediaContent;
res.mediaView = self.mediaView;
//设置 Res。用于TP SDK的原生界面渲染
self.waterfallItem.adRes = res;
//加载成功
[self AdLoadFinsh];
}
  • 加载成功 (模版类型)
    • 加载成功后 新建 TradPlusAdRes
    • TradPlusAdRes的adView 与返回的三方模版view进行绑定
    • TradPlusAdResself.waterfallItem.adRes 进行绑定
    • 调用 AdLoadFinsh 完成加载流程
//Mintegral
#pragma mark - MTGNativeAdvancedAdDelegate
- (void)nativeAdvancedAdLoadSuccess:(MTGNativeAdvancedAd *)nativeAd
{
//新建 TradPlusAdRes
TradPlusAdRes *res = [[TradPlusAdRes alloc] init];
self.adView = [self.advancedAd fetchAdView];
//设置模版view
res.adView = self.adView;
//设置 Res
self.waterfallItem.adRes = res;
//加载成功
[self AdLoadFinsh];
}

4.对于 自渲染类型 需要在endRender:clickView:方法中对渲染元素进行注册

  • 根据三方平台规则对各元素进行注册操作

  • 模版类型则不需要实现此方法

例1:AdMob 根据AdMob的规则需要使用AdMob的GADNativeAdView 对广告视图进行注册并展示

//以AdMob为例
- (UIView *)endRender:(NSDictionary *)viewInfo clickView:(NSArray *)array
{
GADNativeAdView *nativeAdView = [[GADNativeAdView alloc] init];
nativeAdView.nativeAd = self.nativeAd;
if([viewInfo valueForKey:kTPRendererAdView])
{
UIView *view = viewInfo[kTPRendererAdView];
nativeAdView.frame = view.bounds;
[nativeAdView addSubview:view];
}
if([viewInfo valueForKey:kTPRendererTitleLable])
{
UIView *view = viewInfo[kTPRendererTitleLable];
nativeAdView.headlineView = view;
}
if([viewInfo valueForKey:kTPRendererTextLable])
{
UIView *view = viewInfo[kTPRendererTextLable];
nativeAdView.bodyView = view;
}
if([viewInfo valueForKey:kTPRendererCtaLabel])
{
UIView *view = viewInfo[kTPRendererCtaLabel];
nativeAdView.callToActionView = view;
}
if([viewInfo valueForKey:kTPRendererIconView])
{
UIView *view = viewInfo[kTPRendererIconView];
nativeAdView.iconView = view;
}
if(self.mediaView != nil)
{
nativeAdView.mediaView = self.mediaView;
}
//完成设置 返回AdMob 的 GADNativeAdView
return nativeAdView;
}

例2:Facebook 根据Facebook的规则只需要向其注册广告视图及可点击视图等

//以Facebook为例
- (UIView *)endRender:(NSDictionary *)viewInfo clickView:(NSArray *)array
{
UIView *adView = viewInfo[kTPRendererAdView];
[self.nativeAd registerViewForInteraction:adView
mediaView:self.mediaView
iconView:self.iconView
viewController:self.rootViewController
clickableViews:array];
//完成注册操作 返回nil
return nil;
}
  • ViewInfo中常用Key值说明
key说明
kTPRendererAdView广告视图
kTPRendererTitleLable广告的标题
kTPRendererTextLable广告的描述
kTPRendererCtaLabel广告的按钮
kTPRendererIconView广告的图标
kTPRendererMainImageView广告的主图
kTPRendererMediaViewMediaView
kTPRendererAdChoiceImageViewAdChoice图标

5.在isReady方法中返回广告是否过期

//以AdMob为例
- (BOOL)isReady
{
return (self.nativeAd != nil);
}

6.根据各广告平台API,执行相关方法通知开发者

//以AdMob为例
#pragma mark - GADNativeAdDelegate
- (void)nativeAdDidRecordImpression:(nonnull GADNativeAd *)nativeAd;
{
//广告展示
[self AdShow];
}
- (void)nativeAdDidRecordClick:(nonnull GADNativeAd *)nativeAd
{
//广告点击
[self AdClick];
}

四.其他#

代码实例

关于 如何获取 TPSDK 中的 海外隐私权限设置参数

#import <TradPlusAds/MsCommon.h>
#import <TradPlusAds/MSConsentManager.h>
方法说明
[[NSUserDefaults standardUserDefaults] integerForKey:gTPCOPPAStorageKey]COPPA,美国儿童在线隐私权保护法
0=未设置,1=成人 ,2=儿童
[[NSUserDefaults standardUserDefaults] integerForKey:gTPCCPAStorageKey]CCPA,加州消费者隐私法案
0=未设置,1=不上报数据 ,2=上报数据
[MSConsentManager sharedManager].canCollectPersonalInfoGDPR,欧盟(EU)和欧洲经济区(EEA)通用数据保护条例
yes=允许获取设备数据 no=不允许获取设备数据