SDM SDK支持两种原生广告类型:
模板原生广告由SDK提供完整的广告视图,适合快速集成。
首先在头文件中声明属性:
@property (nonatomic, strong) SDMNative *native;
然后导入必要的头文件并初始化:
#import <SmartdigimktSDK/SDMNative.h>
#import <SmartdigimktSDK/SDMNativeAd.h>
#import <SmartdigimktSDK/SDMAdRequest.h>
// 创建原生广告实例
self.native = [[SDMNative alloc] initAdWithPlacementId:@"placement_id"];
// 设置代理
self.native.delegate = self;
// 设置广告请求参数(模板广告必须设置)
SDMAdRequest *adRequest = [[SDMAdRequest alloc] init];
adRequest.adWidth = CGRectGetWidth(self.view.bounds);
adRequest.adHeight = 350;
self.native.adRequest = adRequest;
// 加载广告
[self.native load];
#pragma mark - SDMNativeLoadDelegate
// 广告加载成功
- (void)onAdLoaded:(SDMNativeAd *)nativeAd {
NSLog(@"模板原生广告加载成功");
// 设置展示代理
nativeAd.showDelegate = self;
// 检查是否为模板广告
SDMNativeAdRenderType renderType = [nativeAd.nativeAdOffer nativeAdRenderType];
if (renderType == SDMNativeAdRenderExpress) {
NSLog(@"确认为模板原生广告");
}
}
// 广告加载失败
- (void)onAdLoadFail:(NSError *)error {
NSLog(@"模板原生广告加载失败: %@", error.localizedDescription);
}
自渲染原生广告需要开发者自己创建广告视图,提供更高的自定义度。
#import <SmartdigimktSDK/SDMNative.h>
#import <SmartdigimktSDK/SDMNativeAd.h>
#import <SmartdigimktSDK/SDMNativePrepareInfo.h>
#import <SmartdigimktSDK/SDMNativeLayoutParams.h>
// 创建原生广告实例
self.native = [[SDMNative alloc] initAdWithPlacementId:@"placement_id"];
// 设置代理
self.native.delegate = self;
// 自渲染广告不需要设置adRequest,直接加载
[self.native load];
#pragma mark - SDMNativeLoadDelegate
// 广告加载成功
- (void)onAdLoaded:(SDMNativeAd *)nativeAd {
NSLog(@"自渲染原生广告加载成功");
// 设置展示代理
nativeAd.showDelegate = self;
// 检查是否为自渲染广告
SDMNativeAdRenderType renderType = [nativeAd.nativeAdOffer nativeAdRenderType];
if (renderType == SDMNativeAdRenderSelf) {
NSLog(@"确认为自渲染原生广告");
}
}
// 广告加载失败
- (void)onAdLoadFail:(NSError *)error {
NSLog(@"自渲染原生广告加载失败: %@", error.localizedDescription);
}
{collapsible="true" collapsed-title="自渲染原生广告加载代理方法"}
模板原生广告展示非常简单,只需获取SDK提供的templateView并添加到视图中。
// 检查广告是否准备就绪
if ([nativeAd isReady]) {
// 获取广告渲染类型
SDMNativeAdRenderType renderType = [nativeAd.nativeAdOffer nativeAdRenderType];
// 确认是模板广告
if (renderType == SDMNativeAdRenderExpress) {
// 获取模板广告视图
UIView *templateView = nativeAd.nativeAdOffer.templateView;
// 注册广告视图(模板广告参数可以传nil)
[nativeAd registerAdView:nil
clickViews:nil
prepareInfo:nil
configParam:nil
closeView:nil];
// 设置广告视图frame
templateView.frame = CGRectMake(0, 100, CGRectGetWidth(self.view.bounds), 350);
// 展示广告视图
[self.view addSubview:templateView];
NSLog(@"模板原生广告展示成功");
}
}
自渲染原生广告需要开发者创建自定义视图并绑定广告元素。
首先创建自定义的广告视图类:
// SDMNativeSelfRenderView.h
@interface SDMNativeSelfRenderView : UIView
@property (nonatomic, strong) UILabel *titleLabel; // 标题标签
@property (nonatomic, strong) UILabel *textLabel; // 描述标签
@property (nonatomic, strong) UILabel *ctaLabel; // 行动按钮标签
@property (nonatomic, strong) UILabel *advertiserLabel; // 广告商标签
@property (nonatomic, strong) UILabel *ratingLabel; // 评分标签
@property (nonatomic, strong) UIImageView *iconImageView; // 图标视图
@property (nonatomic, strong) UIImageView *mainImageView; // 主图视图
@property (nonatomic, strong) UIView *mediaView; // 媒体视图(视频或图片)
@property (nonatomic, strong) UIView *mediaContainerView; // 媒体容器视图
@property (nonatomic, strong) UIButton *dislikeButton; // 不喜欢按钮
- (instancetype)initWithOffer:(SDMNativeAd *)offer;
@end
自渲染广告的媒体视图(视频或图片)需要通过API获取,而不是直接创建:
// 获取媒体视图
UIView *mediaView = [nativeAd getMediaViewWithDelegate:self];
// 将媒体视图添加到容器中
[selfRenderView.mediaContainerView addSubview:mediaView];
mediaView.frame = selfRenderView.mediaContainerView.bounds;
// 检查广告是否准备就绪
if ([nativeAd isReady]) {
// 获取广告渲染类型
SDMNativeAdRenderType renderType = [nativeAd.nativeAdOffer nativeAdRenderType];
// 确认是自渲染广告
if (renderType == SDMNativeAdRenderSelf) {
// 创建自渲染广告视图
SDMNativeSelfRenderView *selfRenderView = [[SDMNativeSelfRenderView alloc] initWithOffer:nativeAd];
// 设置广告视图frame
selfRenderView.frame = CGRectMake(0, 100, CGRectGetWidth(self.view.bounds), 350);
// 获取媒体视图并添加到容器
UIView *mediaView = [nativeAd getMediaViewWithDelegate:self];
[selfRenderView.mediaContainerView addSubview:mediaView];
mediaView.frame = selfRenderView.mediaContainerView.bounds;
// 准备广告元素信息
SDMNativePrepareInfo *prepareInfo = [SDMNativePrepareInfo loadPrepareInfo:^(SDMNativePrepareInfo *prepareInfo) {
prepareInfo.titleLabel = selfRenderView.titleLabel;
prepareInfo.textLabel = selfRenderView.textLabel;
prepareInfo.iconImageView = selfRenderView.iconImageView;
prepareInfo.mainImageView = selfRenderView.mainImageView;
prepareInfo.ctaLabel = selfRenderView.ctaLabel;
prepareInfo.mediaView = selfRenderView.mediaView;
prepareInfo.mediaContainerView = selfRenderView.mediaContainerView;
prepareInfo.advertiserLabel = selfRenderView.advertiserLabel;
prepareInfo.ratingLabel = selfRenderView.ratingLabel;
prepareInfo.dislikeButton = selfRenderView.dislikeButton;
}];
// 创建可点击视图数组
NSMutableArray *clickableViews = [@[
selfRenderView.iconImageView,
selfRenderView.titleLabel,
selfRenderView.textLabel,
selfRenderView.ctaLabel,
selfRenderView.mainImageView
] mutableCopy];
// 如果有媒体视图,也需要添加到可点击视图数组中
if (selfRenderView.mediaView) {
[clickableViews addObject:selfRenderView.mediaView];
}
// 配置广告参数
SDMNativeLayoutParams *layoutParams = [[SDMNativeLayoutParams alloc] init];
layoutParams.AdFrame = CGRectMake(0, 100, self.view.frame.size.width, 350);
layoutParams.mediaViewFrame = CGRectMake(0, 250, self.view.frame.size.width - 40, 200);
layoutParams.sizeToFit = YES;
layoutParams.rootViewController = self;
layoutParams.videoPlayType = SDMNativeAdOfferVideoPlayOnlyWiFiAutoPlayType;
// 注册广告视图和可点击元素
[nativeAd registerAdView:selfRenderView
clickViews:clickableViews
prepareInfo:prepareInfo
configParam:layoutParams
closeView:nil];
// 展示广告视图
[self.view addSubview:selfRenderView];
NSLog(@"自渲染原生广告展示成功");
}
}
无论是模板广告还是自渲染广告,都使用相同的展示代理方法:
#pragma mark - SDMPubNativeDelegate
// 广告展示
- (void)onAdShow:(SDMNativeAd *)item {
NSLog(@"原生广告展示");
}
// 广告点击
- (void)onAdClick:(SDMNativeAd *)item extra:(nullable NSDictionary *)extra {
NSLog(@"原生广告点击");
}
// 广告关闭
- (void)onAdClosed:(SDMNativeAd *)item extra:(nullable NSDictionary *)extra {
NSLog(@"原生广告关闭");
// 移除广告视图
if (item.nativeAdOffer.templateView) {
// 模板广告
[item.nativeAdOffer.templateView removeFromSuperview];
} else {
// 自渲染广告需要手动移除自定义视图
// [selfRenderView removeFromSuperview];
}
}
// Deeplink跳转回调
- (void)onDeeplinkCallback:(SDMNativeAd *)item result:(BOOL)success {
NSLog(@"原生广告Deeplink跳转: %@", success ? @"成功" : @"失败");
}
// 检查原生广告是否准备就绪
if ([nativeAd isReady]) {
NSLog(@"原生广告已准备就绪");
// 检查是否为视频广告
BOOL isVideoContents = [nativeAd.nativeAdOffer isVideoContents];
NSLog(@"是否为原生视频广告:%@", isVideoContents ? @"是" : @"否");
} else {
NSLog(@"原生广告未准备就绪");
}
在不再需要广告实例时,及时释放资源避免内存泄漏:
// 销毁原生广告
[nativeAd destroy];
// 清空引用
self.native = nil;
SDMAdRequest
的 adWidth
和 adHeight
SDMAdRequest
SDMNativeLayoutParams
配置参数clickableViews
数组中