原生广告
一.必要重写的方法
- 开发者需要继承 TradPlusBaseAdapter并重写相关方法:
- 开发者调用
TradPlusAdNative
的loadAd
API时,会调用到自定义Adapter的loadAdWithWaterfallItem:
方法 - 开发者调用
TradPlusAdNative
的isAdReady
API时,会调用到自定义Adapter的isReady
方法 - 开发者调用
TradPlusAdNative
的showADWithRenderingViewClass:subview:sceneId:
或showADWithNativeRenderer:subview:sceneId:
API时,会依次调用到自定义Adapter的isReady
、endRender:clickView:
(自渲染类型)方法
- 开发者调用
方法 | 参数说明 | 返回值 | 作用 |
---|---|---|---|
- (void)loadAdWithWaterfallItem:(TradPlusAdWaterfallItem *)item | item:包含有服务器下发和本地配置的参数 | void | 用于获取服务器下发和本地配置的参数,实现自定义广告的加载逻辑 |
- (UIView *)endRender:(NSDictionary *)viewInfo clickView:(NSArray *)array | viewInfo:渲染组件字典列表 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
中的字段进行绑定 - 将
TradPlusAdRes
与self.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进行绑定 - 将
TradPlusAdRes
与self.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 | 广告的主图 |
kTPRendererMediaView | MediaView |
kTPRendererAdChoiceImageView | AdChoice 图标 |
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].canCollectPersonalInfo | GDPR,欧盟(EU)和欧洲经济区(EEA)通用数据保护条例 yes=允许获取设备数据 no=不允许获取设备数据 |