菜单

原生广告

1. 集成建议

类型 说明 注意事项 Demo示例代码所在位置
自渲染 由第三方广告平台返回广告素材由开发者来拼接。第三方广告平台后台的类型选择需要和Taku后台一致,否则会导致错误。 自渲染原生广告注意事项 • 单个自渲染: SelfRenderVC.m
• Feed信息流列表: FeedSelfRenderVC.m
模板渲染 第三方广告平台返回渲染好的视图,您可以直接将其添加到一个容器以展示。 • 不同广告平台的模板广告有自己的广告宽高比例,您可在这些广告平台后台进行查看。
• 请您尽量在广告平台后台选择宽高比例一样或者接近的模板,在代码中传入该宽高比例宽高来加载、展示广告,以获得最佳展示效果。
• 单个模版渲染: ExpressVC.m
• Feed信息流列表: FeedTemplateVC.m

2. 加载广告

此步骤的extra字典中支持传入相关配置广告的参数与您的自定义参数,您可以在这里查看更多关于extra参数的说明。

objc 复制代码
// 导入头文件
#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 {
}

3. 展示广告

渲染方式 实现步骤
自渲染 1. 根据获取的 nativeAd 给自渲染视图赋值,创建 ATNativeADView 对象,查看是否有 mediaView,并注册点击事件。
2. 调用 ATNativePrepareInfoloadPrepareInfo 方法进行自渲染控件的绑定,绑定需展示的控件,其他不展示的不需要绑定。
3. 调用 ATNativeAdOfferrendererWithConfiguration: selfRenderView: nativeADView: 方法完成渲染步骤。
模板渲染 1. 根据获取 offer 和 新建ATNativeADConfiguration 对象配置去创建 ATNativeADView 对象
2. 调用 ATNativeAdOfferrendererWithConfiguration: selfRenderView: nativeADView: 方法完成渲染步骤,selfRenderView传入nil

3.1 自渲染广告展示

objc 复制代码
    //场景统计功能,可选接入
    [[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];

3.2 模板广告展示

objc 复制代码
    //场景统计功能,可选接入
    [[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];

4. 销毁广告

objc 复制代码
- (void)removeAd {
    if (self.adView && self.adView.superview) {
        [self.adView removeFromSuperview];
    }
    [self.adView destroyNative];
    self.adView = nil;
    // 自渲染及时销毁offer
    [self.selfRenderView destory];
    self.selfRenderView = nil;
}

5. API说明

类名/文件名 简介
ATAdManager 广告的基础操作类,包括广告加载、过滤广告、场景统计、比价工具等功能。
ATAdManager (Native) 针对原生广告的操作拓展,提供广告展示、检查缓存、检查广告是否就绪、场景统计等功能,其中有Extra键的定义。
ATAdLoadingDelegate 广告的基础代理回调声明,包括广告位与广告源级别的加载成功或失败回调,以及竞价广告源的竞价结束与竞价失败回调。
ATNativeADDelegate 针对原生广告类型的代理回调,包括展示、点击和关闭等。
ATSDKGlobalSetting 通用设置类,提供形如清除广告内存中的缓存、自定义流量分组设置、测试模式、设置第三方广告SDK相关信息等功能,还声明了一些通用的属性。
ATNativeADConfiguration 原生广告配置类,用于设置广告的显示尺寸、播放行为、渲染方式等参数。
ATNativeAdOffer 原生广告素材供应类,用于封装单个原生广告的相关信息(如广告内容、网络平台ID、供应信息等)。
ATNativeADView 原生广告视图类,负责原生广告的渲染和交互控制,提供视频播放控制、广告展示管理、点击追踪、特效动画(如摇晃和滑动)等,提供自渲染相关支持。
ATNativePrepareInfo 原生广告准备信息类,用于配置原生广告各个UI组件的引用,包括文本标签、图片视图、媒体容器、交互按钮等,开发者通过这个类来关联自定义UI组件与广告内容。
上一个
自定义横幅广告
下一个
自渲染广告注意事项
最近修改: 2025-07-31Powered by