请输入
菜单

原生广告

💡Tips

  • 🚀 支持自渲染和模版渲染两种展示方式
  • ⚠️ 注意处理生命周期防止内存泄漏
  • 🔧 推荐使用标准化回调处理流程

1. 加载广告

objective-c 复制代码
#import <MCSDK/MCSDK.h>
@interface SelfRenderVC () <MCNativeAdDelegate, MCAdRevenueDelegate>

// 原生广告加载器
@property (nonatomic, strong) MCNativeAdLoader * nativeAdLoader;
// 原生广告视图
@property (nonatomic, strong) MCNativeAdView   * nativeAdView;
// 广告信息对象
@property (nonatomic, strong) MCAdInfo         * adInfo;
// 重试次数计数器
@property (nonatomic, assign) NSInteger          retryAttempt;

@end

@implementation SelfRenderVC

// 原生聚合单元ID
#define Native_SelfRender_PlacementID @"your mediation unit id"

// 场景ID
#define Native_SelfRender_SceneID @""

#pragma mark - Load Ad
- (void)loadAd {
    // 初始化原生广告加载器(如果尚未创建)
    if (!self.nativeAdLoader) {
        MCNativeAdLoader *nativeAdLoader = [[MCNativeAdLoader alloc] initWithPlacementId:Native_SelfRender_PlacementID];
        self.nativeAdLoader = nativeAdLoader;
    }
    // 设置代理
    self.nativeAdLoader.delegate = self;
    self.nativeAdLoader.revenueDelegate = self;
    // 设置场景ID
    self.nativeAdLoader.placement = Native_SelfRender_SceneID;

    // 开始加载广告
    [self.nativeAdLoader loadAd];
}

#pragma mark - MCNativeAdDelegate
// 广告加载成功
- (void)didLoadNativeAd:(nullable MCNativeAdView *)nativeAdView forAd:(MCAdInfo *_Nonnull)ad {
    // 对于自渲染,需要创建MCNativeAdView
    if (!ad.nativeAd.isTemplate) {
        CGFloat scale = 4.0/3.0;
        CGFloat viewW = CGRectGetWidth([UIScreen mainScreen].bounds);
        CGFloat viewH = viewW/scale;
        _nativeAdView = [[MCNativeAdView alloc] initWithFrame:CGRectMake(0, 0, viewW, viewH)];
    } else {
        _nativeAdView = nativeAdView;
    }
    
    _adInfo = ad;
    
    // 重置重试次数
    self.retryAttempt = 0;
}

// 广告加载失败
- (void)didFailToLoadNativeAdWithError:(MCError *_Nonnull)error {  
    // 我们建议您使用指数递增延迟重试,最大延迟时间为8秒或最大重试次数为3次
    if (self.retryAttempt >= 3) {
        return;
    }
    self.retryAttempt++;
     
    // 计算延迟时间(指数退避算法)
    NSInteger delaySec = pow(2, MIN(3, self.retryAttempt));

    // 延迟重试
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delaySec * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        [self.nativeAdLoader loadAd];
    });
}

// 广告展示成功
- (void)didDisplayAd:(MCAdInfo *_Nonnull)ad {

}

// 广告关闭
- (void)didHideAd:(MCAdInfo *)ad {
    // 预加载下一个广告
    [self.nativeAdLoader loadAd];
}

// 广告展示失败
- (void)didFailToDisplayAd:(MCAdInfo *)ad withError:(MCError *)error {
    // 预加载下一个广告
    [self.nativeAdLoader loadAd];
}

// 广告点击
- (void)didClickNativeAd:(MCAdInfo *_Nonnull)ad {

}

#pragma mark - MCAdRevenueDelegate
// 收益追踪
- (void)didPayRevenueForAd:(MCAdInfo *)ad {

}

2. 展示广告

自渲染方式请参考 示例Demo中的SelfRenderVC.m

objective-c 复制代码
// 检查是否有准备好展示的广告,确认广告是否准备就绪 - 必需步骤
BOOL isReady = self.nativeAdView ? YES : NO;
if (!isReady) {
    [self showLog:[NSString stringWithFormat:@"%@",kLocalizeStr(@"广告没有准备就绪")]];
    // 当前广告位没有可用缓存,建议重新加载
    [self.nativeAdLoader loadAd];
    return;
}

// 创建用于布局自渲染广告的自定义视图 - 必需步骤
SelfRenderView *selfRenderView = [[SelfRenderView alloc] initWithAdInfo:self.adInfo];
// 设置其大小和位置
selfRenderView.frame = self.nativeAdView.frame;
self.selfRenderView = selfRenderView;
// 设置广告选择视图的原点x和y坐标
//    self.nativeAdView.adChoicesViewOrigin = CGPointMake(10, 10);
// 设置logo视图框架大小
//    self.nativeAdView.logoViewFrame = CGRectMake(10, self.nativeAdView.frame.size.height - 20 - 10, 60, 20);

// 创建需要绑定广告点击事件的组件数组 - 必需步骤
NSMutableArray *array = [@[selfRenderView.iconImageView,
                           selfRenderView.titleLabel,
                           selfRenderView.textLabel,
                           selfRenderView.ctaLabel,
                           selfRenderView.mainImageView] mutableCopy];

// 注册点击事件 - 必需步骤
[self.nativeAdView registerClickableViewArray:array];

// 指定要渲染的组件列表 - 必需步骤
MCNativePrepareInfo *nativePrepareInfo = [MCNativePrepareInfo loadPrepareInfo:^(MCNativePrepareInfo * _Nonnull 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.dislikeButton = selfRenderView.dislikeButton;
    // 广告"去下载"标语
    prepareInfo.ctaLabel = selfRenderView.ctaLabel;
    // 广告媒体视图
    prepareInfo.mediaView = selfRenderView.mediaView;
}];
// 绑定要渲染的组件 - 必需步骤
[self.nativeAdView prepareWithNativePrepareInfo:nativePrepareInfo];

// 渲染广告 - 必需步骤
[self.nativeAdLoader rendererWithNativeAdView:self.nativeAdView selfRenderView:selfRenderView adInfo:self.adInfo];
 
// 展示广告,AdDisplayVC只是一个示例,您可以根据自己的场景设置和添加nativeAdView显示 - 必需步骤
AdDisplayVC *showVc = [[AdDisplayVC alloc] initWithAdView:self.nativeAdView adViewSize:CGSizeMake(self.selfRenderView.frame.size.width, self.selfRenderView.frame.size.height)];
[self.navigationController pushViewController:showVc animated:YES]; 

模版渲染方式请参考 示例Demo中的ExpressVC.m

objective-c 复制代码
// 检查是否有准备好展示的广告
BOOL isReady = self.nativeAdView ? YES : NO;
if (!isReady) {
    [self showLog:[NSString stringWithFormat:@"%@",kLocalizeStr(@"广告没有准备就绪")]];
    // 当前广告位没有可用缓存,建议重新加载
    [self.nativeAdLoader loadAd];
    return;
}

// 展示广告
AdDisplayVC *showVc = [[AdDisplayVC alloc] initWithAdView:self.nativeAdView adViewSize:CGSizeMake(ExpressAdWidth, ExpressAdHeight)];
[self.navigationController pushViewController:showVc animated:YES]; 

3. 销毁广告

objective-c 复制代码
- (void)destroy {
    if (_adInfo) {
        [self showLog:[NSString stringWithFormat:@"destroy:%@", _adInfo.mediationPlacementId]];
        [self.nativeAdLoader destroyAd];
        _nativeAdView = nil;
        _adInfo = nil;
    }
}

4. 设置自定义参数

objective-c 复制代码
- (void)loadAd {
    MCNativeAdLoader *nativeAdLoader = [[MCNativeAdLoader alloc] initWithPlacementId:self.placementID];
    nativeAdLoader.delegate = self;
    nativeAdLoader.revenueDelegate = self;
    
    [nativeAdLoader setLoadExtraParameter:@{
        @"userData": @"test_userData"
    }];
    
    [nativeAdLoader setExtraParameter:@{
        @"test_extra_key": @"test_extra_value"
    }];
    
    [nativeAdLoader loadAd];
    self.nativeAdLoader = nativeAdLoader;
}

- (void)didLoadAd:(MCAdInfo *)ad {
    // 获取自定义参数
    NSString *originDataJsonString = ad.originData;
}
上一个
开屏广告
下一个
横幅广告
最近修改: 2025-07-09Powered by