💡Tips
- 🚀 支持自渲染和模版渲染两种展示方式
- ⚠️ 注意处理生命周期防止内存泄漏
- 🔧 推荐使用标准化回调处理流程
#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 {
}
自渲染方式请参考 示例Demo中的
SelfRenderVC.m
// 检查是否有准备好展示的广告,确认广告是否准备就绪 - 必需步骤
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
// 检查是否有准备好展示的广告
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];
- (void)destroy {
if (_adInfo) {
[self showLog:[NSString stringWithFormat:@"destroy:%@", _adInfo.mediationPlacementId]];
[self.nativeAdLoader destroyAd];
_nativeAdView = nil;
_adInfo = nil;
}
}
- (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;
}