💡Tips
- 🚀 采用预加载机制提升用户体验
- ⚠️ 注意处理生命周期防止内存泄漏
- 🔧 推荐使用标准化回调处理流程
// 导入头文件
#import <AnyThinkNative/AnyThinkNative.h>
@interface SelfRenderVC () <ATADXPublicLoadingDelegate, ATADXPublicNativeLoadingDelegate, ATADXPubNativeDelegate>
@property (nonatomic, strong) UIView *selfRenderView;
@property (nonatomic, strong) ATADXNativeAd *nativeAd;
@end
@implementation SelfRenderVC
//广告位ID
#define Native_SelfRender_PlacementID @"广告位id"
//场景ID,可选,可在后台生成。没有可传入空字符串
#define Native_SelfRender_SceneID @""
#pragma mark - Load Ad 加载广告
/// 加载广告
- (void)loadAd {
NSMutableDictionary * loadConfigDict = [NSMutableDictionary dictionary];
//设置请求广告的尺寸
[loadConfigDict setValue:[NSValue valueWithCGSize:CGSizeMake(SelfRenderViewWidth, SelfRenderViewHeight)] forKey:kATExtraInfoNativeAdSizeKey];
ATADXNativeAd *adInfo = [[ATADXNativeAd alloc] initAdWithPlacementId:Native_SelfRender_PlacementID];
adInfo.extra = loadConfigDict;
adInfo.loadDelegate = self;
adInfo.showDelegate = self;
[adInfo loadAd];
}
#pragma mark - ATADXPublicLoadingDelegate
/// 广告位加载完成
- (void)didFinishLoadingADXNativeItem:(ATADXBaseAd *)item nativeView:(ATNativeADView *)nativeView {
// item为nativeView绑定关系
}
/// 广告位加载失败
- (void)didFailToLoadADXItem:(ATADXBaseAd *)item
error:(NSError*)error {
}
#pragma mark - ATADXPubNativeDelegate
/// 原生广告已展示
- (void)adxDidShowNativeAd:(ATADXBaseAd *)item {
}
/// 原生广告点击
- (void)adxDidClickNativeAd:(ATADXBaseAd *)item {
}
/// 原生广告开始播放视频
- (void)adxDidStartPlayingVideo:(ATADXBaseAd *)item {
}
/// 原生广告视频播放结束
- (void)adxDidEndPlayingVideo:(ATADXBaseAd *)item {
}
/// 原生广告点击了关闭按钮
- (void)adxDidTapCloseButton:(ATADXBaseAd *)item {
}
/// 原生广告已打开或跳转深链接页面
- (void)adxDidDeepLinkOrJump:(ATADXBaseAd *)item
result:(BOOL)success {
}
| 渲染方式 | 实现步骤 |
|---|---|
| 自渲染 | 1、根据当前的 nativeAd 调用showNativeViewWithConfig进行视图数据绑定 2、调用 ATNativePrepareInfo 的 loadPrepareInfo 方法进行自渲染控件的绑定,绑定需展示的控件,其他不展示的不需要绑定。 3、调用 ATNativeAdOffer 的 rendererWithConfiguration: selfRenderView: nativeADView: 方法完成渲染步骤。 |
| 模板渲染 | 1、根据当前的 nativeAd 调用showNativeViewWithConfig进行视图数据绑定 2、调用 ATNativeAdOffer 的 rendererWithConfiguration: selfRenderView: nativeADView: 方法完成渲染步骤,selfRenderView传入nil。 |
/// 自渲染展示
- (void)showAd {
// 场景统计功能,可选接入
// [[ATAdManager sharedManager] entryNativeScenarioWithPlacementID:Native_SelfRender_PlacementID scene:Native_SelfRender_SceneID];
// 检查是否有就绪
BOOL isReady = [self.nativeAd isReady];
if (!isReady) {
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;
// 调用后消耗一条广告缓存,创建绑定视图
[self.nativeAd showNativeViewWithConfig:showConfig nativeConfig:config];
// 创建自渲染视图view,同时根据offer信息内容去赋值
SelfRenderView *selfRenderView = [[SelfRenderView alloc] initWithOffer:offer];
// 创建广告nativeADView
// 获取原生广告展示容器视图
ATNativeADView *nativeADView = adInfo.nativeView;
// 创建可点击组件的容器数组
NSMutableArray *clickableViewArray = [NSMutableArray array];
// 获取mediaView,如需要自行添加到自渲染视图上
UIView *mediaView = [nativeADView getMediaView];
if (mediaView) {
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];
// 渲染广告
[self.nativeAd.nativeOffer 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];
}
/// 模版渲染展示
- (void)showAd {
// 场景统计功能,可选接入
// [[ATAdManager sharedManager] entryNativeScenarioWithPlacementID:Native_Express_PlacementID scene:Native_Express_SceneID];
// 检查是否有就绪
BOOL isReady = [self.nativeAd isReady];
if (!isReady) {
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;
// 调用后消耗广告创建绑定视图
[self.nativeAd showNativeViewWithConfig:showConfig nativeConfig:config];
ATNativeADView *nativeADView = adInfo.nativeView;
// 渲染广告
[self.nativeAd 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 {
[self.nativeAd destroy];
if (self.adView && self.adView.superview) {
[self.adView removeFromSuperview];
}
// [self.adView destroyNative];
// self.adView = nil;
// 自渲染及时销毁offer
[self.selfRenderView destory];
self.selfRenderView = nil;
}
可参考此文档:客户端竞价