类型 | 说明 | 注意事项 | Demo示例代码所在位置 |
---|---|---|---|
自渲染 | 由第三方广告平台返回广告素材由开发者来拼接。第三方广告平台后台的类型选择需要和Taku后台一致,否则会导致错误。 | 自渲染原生广告注意事项 | • 单个自渲染: SelfRenderVC.m • Feed信息流列表: FeedSelfRenderVC.m |
模板渲染 | 第三方广告平台返回渲染好的视图,您可以直接将其添加到一个容器以展示。 | • 不同广告平台的模板广告有自己的广告宽高比例,您可在这些广告平台后台进行查看。 • 请您尽量在广告平台后台选择宽高比例一样或者接近的模板,在代码中传入该宽高比例宽高来加载、展示广告,以获得最佳展示效果。 |
• 单个模版渲染: ExpressVC.m • Feed信息流列表: FeedTemplateVC.m |
此步骤的extra字典中支持传入相关配置广告的参数与您的自定义参数,您可以在这里查看更多关于extra参数的说明。
// 导入头文件
#import <AnyThinkNative/AnyThinkNative.h>
//添加协议<ATNativeADDelegate>
@interface SelfRenderVC () <ATNativeADDelegate>
@property (strong, nonatomic) ATNativeADView * adView;
@property (strong, nonatomic) SelfRenderView * selfRenderView;
@property (nonatomic, strong) ATNativeAdOffer * nativeAdOffer;
// 重试次数计数器
@property (nonatomic, assign) NSInteger retryAttempt;
@end
@implementation SelfRenderVC
//广告位ID
#define Native_SelfRender_PlacementID @"b680af2c216f73"
//场景ID,可选,可在后台生成。没有可传入空字符串
#define Native_SelfRender_SceneID @""
#pragma mark - Load Ad 加载广告
/// 加载广告
- (void)loadAd {
NSMutableDictionary * loadConfigDict = [NSMutableDictionary dictionary];
//设置请求广告的尺寸
[loadConfigDict setValue:[NSValue valueWithCGSize:CGSizeMake(SelfRenderViewWidth, SelfRenderViewHeight)] forKey:kATExtraInfoNativeAdSizeKey];
[[ATAdManager sharedManager] loadADWithPlacementID:Native_SelfRender_PlacementID extra:loadConfigDict delegate:self];
}
#pragma mark - 广告位代理回调
/// 广告位加载完成
/// - Parameter placementID: 广告位ID
- (void)didFinishLoadingADWithPlacementID:(NSString *)placementID {
// 重置重试次数
self.retryAttempt = 0;
}
/// 广告位加载失败
/// - Parameters:
/// - placementID: 广告位ID
/// - error: 错误信息
- (void)didFailToLoadADWithPlacementID:(NSString *)placementID error:(NSError *)error {
// 重试已达到 3 次,不再重试加载
if (self.retryAttempt >= 3) {
return;
}
self.retryAttempt++;
// Calculate delay time: power of 2, maximum 8 seconds
NSInteger delaySec = pow(2, MIN(3, self.retryAttempt));
// Delayed retry loading ad
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delaySec * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self loadAd];
});
}
/// 获得展示收益
/// - Parameters:
/// - placementID: 广告位ID
/// - extra: 额外信息字典
- (void)didRevenueForPlacementID:(NSString *)placementID extra:(NSDictionary *)extra {
}
/// 原生广告已展示
/// - Parameters:
/// - adView: 广告视图对象
/// - placementID: 广告位ID
/// - extra: 额外信息
- (void)didShowNativeAdInAdView:(ATNativeADView *)adView placementID:(NSString *)placementID extra:(NSDictionary *)extra {
}
/// 原生广告点击了关闭按钮
/// - Parameters:
/// - adView: 广告视图对象
/// - placementID: 广告位ID
/// - extra: 额外信息
- (void)didTapCloseButtonInAdView:(ATNativeADView *)adView placementID:(NSString *)placementID extra:(NSDictionary *)extra {
// 销毁广告
[self removeAd];
// 预加载下一个广告
[self loadAd];
}
/// 原生广告开始播放视频
/// - Parameters:
/// - adView: 广告视图对象
/// - placementID: 广告位ID
/// - extra: 额外信息字典
- (void)didStartPlayingVideoInAdView:(ATNativeADView *)adView placementID:(NSString *)placementID extra:(NSDictionary *)extra {
}
/// 原生广告视频播放结束
/// - Parameters:
/// - adView: 广告视图对象
/// - placementID: 广告位ID
/// - extra: 额外信息字典
- (void)didEndPlayingVideoInAdView:(ATNativeADView *)adView placementID:(NSString *)placementID extra:(NSDictionary *)extra {
}
/// 原生广告用户已点击
/// - Parameters:
/// - adView: 广告视图对象
/// - placementID: 广告位ID
/// - extra: 额外信息字典
- (void)didClickNativeAdInAdView:(ATNativeADView *)adView placementID:(NSString *)placementID extra:(NSDictionary *)extra {
}
/// 原生广告已打开或跳转深链接页面
/// - Parameters:
/// - adView: 广告视图对象
/// - placementID: 广告位ID
/// - extra: 额外信息
/// - success: 是否成功
- (void)didDeepLinkOrJumpInAdView:(ATNativeADView *)adView placementID:(NSString *)placementID extra:(NSDictionary *)extra result:(BOOL)success {
}
/// 原生广告已进入全屏视频播放,通常是点击视频meidaView后自动跳转至一个播放落地页
/// - Parameters:
/// - adView: 广告视图对象
/// - placementID: 广告位ID
/// - extra: 额外信息
- (void)didEnterFullScreenVideoInAdView:(ATNativeADView *)adView placementID:(NSString *)placementID extra:(NSDictionary *)extra{
}
/// 原生广告已退出全屏视频播放
/// - Parameters:
/// - adView: 广告视图对象
/// - placementID: 广告位ID
/// - extra: 额外信息
- (void)didExitFullScreenVideoInAdView:(ATNativeADView *)adView placementID:(NSString *)placementID extra:(NSDictionary *)extra {
}
/// 原生广告已退出详情页面
/// - Parameters:
/// - adView: 广告视图对象
/// - placementID: 广告位ID
/// - extra: 额外信息
- (void)didCloseDetailInAdView:(ATNativeADView *)adView placementID:(NSString *)placementID extra:(NSDictionary *)extra {
}
渲染方式 | 实现步骤 |
---|---|
自渲染 | 1. 根据获取的 nativeAd 给自渲染视图赋值,创建 ATNativeADView 对象,查看是否有 mediaView,并注册点击事件。 2. 调用 ATNativePrepareInfo 的 loadPrepareInfo 方法进行自渲染控件的绑定,绑定需展示的控件,其他不展示的不需要绑定。 3. 调用 ATNativeAdOffer 的 rendererWithConfiguration: selfRenderView: nativeADView: 方法完成渲染步骤。 |
模板渲染 | 1. 根据获取 offer 和 新建ATNativeADConfiguration 对象配置去创建 ATNativeADView 对象 2. 调用 ATNativeAdOffer 的 rendererWithConfiguration: selfRenderView: nativeADView: 方法完成渲染步骤,selfRenderView传入nil。 |
//场景统计功能,可选接入
[[ATAdManager sharedManager] entryNativeScenarioWithPlacementID:Native_SelfRender_PlacementID scene:Native_SelfRender_SceneID];
//检查是否有就绪
if (![[ATAdManager sharedManager] nativeAdReadyForPlacementID:Native_SelfRender_PlacementID]) {
[self loadAd];
return;
}
// 初始化config配置
ATNativeADConfiguration *config = [[ATNativeADConfiguration alloc] init];
// 给原生广告进行预布局
config.ADFrame = CGRectMake(0, 0, SelfRenderViewWidth, SelfRenderViewHeight);
// 给视频播放器进行预布局,建议在后面添加到自定义视图后,再次进行一次布局
config.mediaViewFrame = CGRectMake(0, 0, SelfRenderViewMediaViewWidth, SelfRenderViewMediaViewHeight);
//设置代理
config.delegate = self;
config.rootViewController = self;
//让广告View容器贴合于广告
config.sizeToFit = YES;
//【手动布局方式】精确设置logo大小以及位置,与下方【Masonry方式】选择一种实现
config.logoViewFrame = CGRectMake(kScreenW-50-10, SelfRenderViewHeight-50-10, 50, 50);
//设置广告平台logo位置偏好(部分广告平台无法进行精确设置,则通过下面代码设置,建议尽量和上方logoViewFrame位置匹配)
[ATAPI sharedInstance].preferredAdLogoPosition = ATAdLogoPositionBottomRightCorner;
// 获取offer广告对象,获取后消耗一条广告缓存
ATNativeAdOffer *offer = [[ATAdManager sharedManager] getNativeAdOfferWithPlacementID:Native_SelfRender_PlacementID scene:Native_SelfRender_SceneID];
NSDictionary *offerInfoDict = [Tools getOfferInfo:offer];
self.nativeAdOffer = offer;
// 创建自渲染视图view,同时根据offer信息内容去赋值
SelfRenderView *selfRenderView = [[SelfRenderView alloc] initWithOffer:offer];
// 创建广告nativeADView
// 获取原生广告展示容器视图
ATNativeADView *nativeADView = [[ATNativeADView alloc] initWithConfiguration:config currentOffer:offer placementID:Native_SelfRender_PlacementID];
//创建可点击组件的容器数组
NSMutableArray *clickableViewArray = [NSMutableArray array];
// 获取mediaView,需要自行添加到自渲染视图上,必须调用
UIView *mediaView = [nativeADView getMediaView];
if (mediaView) {
// 赋值并布局,这里 set 方法中有布局
selfRenderView.mediaView = mediaView;
}
// 设置需要注册点击事件的UI控件,最好不要把信息流的父视图整体添加到点击事件中,不然可能会出现点击关闭按钮,还触发了点击信息流事件。
// 关闭按钮(dislikeButton)无需注册点击事件
[clickableViewArray addObjectsFromArray:@[selfRenderView.iconImageView,
selfRenderView.titleLabel,
selfRenderView.textLabel,
selfRenderView.ctaLabel,
selfRenderView.mainImageView]];
// 给UI控件注册点击事件
[nativeADView registerClickableViewArray:clickableViewArray];
//绑定组件
ATNativePrepareInfo *info = [ATNativePrepareInfo loadPrepareInfo:^(ATNativePrepareInfo * prepareInfo) {
prepareInfo.textLabel = selfRenderView.textLabel;
prepareInfo.advertiserLabel = selfRenderView.advertiserLabel;
prepareInfo.titleLabel = selfRenderView.titleLabel;
prepareInfo.ratingLabel = selfRenderView.ratingLabel;
prepareInfo.iconImageView = selfRenderView.iconImageView;
prepareInfo.mainImageView = selfRenderView.mainImageView;
prepareInfo.logoImageView = selfRenderView.logoImageView;
prepareInfo.ctaLabel = selfRenderView.ctaLabel;
prepareInfo.dislikeButton = selfRenderView.dislikeButton;
prepareInfo.mediaView = selfRenderView.mediaView;
}];
[nativeADView prepareWithNativePrepareInfo:info];
//渲染广告
[offer rendererWithConfiguration:config selfRenderView:selfRenderView nativeADView:nativeADView];
self.adView = nativeADView;
//展示广告
AdDisplayVC *showVc = [[AdDisplayVC alloc] initWithAdView:nativeADView offer:offer adViewSize:CGSizeMake(SelfRenderViewWidth, SelfRenderViewHeight)];
[self.navigationController pushViewController:showVc animated:YES];
//场景统计功能,可选接入
[[ATAdManager sharedManager] entryNativeScenarioWithPlacementID:Native_Express_PlacementID scene:Native_Express_SceneID];
//检查是否有就绪
if (![[ATAdManager sharedManager] nativeAdReadyForPlacementID:Native_Express_PlacementID]) {
[self loadAd];
return;
}
// 初始化config配置
ATNativeADConfiguration *config = [[ATNativeADConfiguration alloc] init];
// 给模版广告nativeADView设置大小,通常为请求广告时设置的大小
config.ADFrame = CGRectMake(0, 0, ExpressAdWidth, ExpressAdHeight);
//设置代理
config.delegate = self;
//设置展示根控制器
config.rootViewController = self;
// 开启模版广告自适应高度,当实际返回的广告大小与请求广告时设置的大小不一致时,SDK内部将自动调整nativeADView的大小为实际返回广告的大小。
config.sizeToFit = YES;
// 获取offer广告对象,获取后消耗一条广告缓存
ATNativeAdOffer *offer = [[ATAdManager sharedManager] getNativeAdOfferWithPlacementID:Native_Express_PlacementID scene:Native_Express_SceneID];
// 创建广告nativeADView
ATNativeADView *nativeADView = [[ATNativeADView alloc] initWithConfiguration:config currentOffer:offer placementID:Native_Express_PlacementID];
//渲染广告
[offer rendererWithConfiguration:config selfRenderView:nil nativeADView:nativeADView];
self.adView = nativeADView;
//展示广告
AdDisplayVC *showVc = [[AdDisplayVC alloc] initWithAdView:nativeADView offer:offer adViewSize:CGSizeMake(ExpressAdWidth, ExpressAdHeight)];
[self.navigationController pushViewController:showVc animated:YES];
- (void)removeAd {
if (self.adView && self.adView.superview) {
[self.adView removeFromSuperview];
}
[self.adView destroyNative];
self.adView = nil;
// 自渲染及时销毁offer
[self.selfRenderView destory];
self.selfRenderView = nil;
}
类名/文件名 | 简介 |
---|---|
ATAdManager | 广告的基础操作类,包括广告加载、过滤广告、场景统计、比价工具等功能。 |
ATAdManager (Native) | 针对原生广告的操作拓展,提供广告展示、检查缓存、检查广告是否就绪、场景统计等功能,其中有Extra键的定义。 |
ATAdLoadingDelegate | 广告的基础代理回调声明,包括广告位与广告源级别的加载成功或失败回调,以及竞价广告源的竞价结束与竞价失败回调。 |
ATNativeADDelegate | 针对原生广告类型的代理回调,包括展示、点击和关闭等。 |
ATSDKGlobalSetting | 通用设置类,提供形如清除广告内存中的缓存、自定义流量分组设置、测试模式、设置第三方广告SDK相关信息等功能,还声明了一些通用的属性。 |
ATNativeADConfiguration | 原生广告配置类,用于设置广告的显示尺寸、播放行为、渲染方式等参数。 |
ATNativeAdOffer | 原生广告素材供应类,用于封装单个原生广告的相关信息(如广告内容、网络平台ID、供应信息等)。 |
ATNativeADView | 原生广告视图类,负责原生广告的渲染和交互控制,提供视频播放控制、广告展示管理、点击追踪、特效动画(如摇晃和滑动)等,提供自渲染相关支持。 |
ATNativePrepareInfo | 原生广告准备信息类,用于配置原生广告各个UI组件的引用,包括文本标签、图片视图、媒体容器、交互按钮等,开发者通过这个类来关联自定义UI组件与广告内容。 |