菜单

原生广告

概述

SDM SDK支持两种原生广告类型:

  • 原生模板广告(Native Express):由SDK提供完整的广告视图,开发者只需展示即可
  • 原生自渲染广告(Native Self-Render):需要开发者自己创建广告视图并绑定广告元素

1. 加载广告

1.1 模板原生广告加载

模板原生广告由SDK提供完整的广告视图,适合快速集成。

1.1.1 初始化模板原生广告

首先在头文件中声明属性:

objc 复制代码
@property (nonatomic, strong) SDMNative *native;

然后导入必要的头文件并初始化:

objc 复制代码
#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];

1.1.2 模板原生广告加载代理方法

objc 复制代码
#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);
}

1.2 自渲染原生广告加载

自渲染原生广告需要开发者自己创建广告视图,提供更高的自定义度。

1.2.1 初始化自渲染原生广告

objc 复制代码
#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];

1.2.2 自渲染原生广告加载代理方法

objc 复制代码
#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="自渲染原生广告加载代理方法"}

2. 展示广告

2.1 模板原生广告展示

模板原生广告展示非常简单,只需获取SDK提供的templateView并添加到视图中。

objc 复制代码
// 检查广告是否准备就绪
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(@"模板原生广告展示成功");
    }
}

2.2 自渲染原生广告展示

自渲染原生广告需要开发者创建自定义视图并绑定广告元素。

2.2.1 创建自渲染广告视图

首先创建自定义的广告视图类:

objc 复制代码
// 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

2.2.2 获取媒体视图(MediaView)

自渲染广告的媒体视图(视频或图片)需要通过API获取,而不是直接创建:

objc 复制代码
// 获取媒体视图
UIView *mediaView = [nativeAd getMediaViewWithDelegate:self];

// 将媒体视图添加到容器中
[selfRenderView.mediaContainerView addSubview:mediaView];
mediaView.frame = selfRenderView.mediaContainerView.bounds;

2.2.3 展示自渲染原生广告

objc 复制代码
// 检查广告是否准备就绪
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(@"自渲染原生广告展示成功");
    }
}

3. 广告展示代理方法

无论是模板广告还是自渲染广告,都使用相同的展示代理方法:

objc 复制代码
#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 ? @"成功" : @"失败");
}

4. 检查广告状态

objc 复制代码
// 检查原生广告是否准备就绪
if ([nativeAd isReady]) {
    NSLog(@"原生广告已准备就绪");
    
    // 检查是否为视频广告
    BOOL isVideoContents = [nativeAd.nativeAdOffer isVideoContents];
    NSLog(@"是否为原生视频广告:%@", isVideoContents ? @"是" : @"否");
} else {
    NSLog(@"原生广告未准备就绪");
}

5. 释放资源

在不再需要广告实例时,及时释放资源避免内存泄漏:

objc 复制代码
// 销毁原生广告
[nativeAd destroy];

// 清空引用
self.native = nil;

6. 注意事项

6.1 模板原生广告注意事项

  • 必须设置 SDMAdRequestadWidthadHeight
  • 广告视图由SDK完全控制,开发者无法自定义样式
  • 适合快速集成,但自定义程度较低

6.2 自渲染原生广告注意事项

  • 不需要设置 SDMAdRequest
  • 必须创建自定义视图并正确绑定广告元素
  • 需要设置 SDMNativeLayoutParams 配置参数
  • 提供完全的UI自定义能力,但集成复杂度较高
  • 确保所有可点击元素都添加到 clickableViews 数组中

6.3 通用注意事项

  • 在广告加载成功后再进行展示操作
  • 及时释放广告资源避免内存泄漏
  • 正确处理广告加载失败的情况
上一个
横幅广告
下一个
广告信息说明
最近修改: 2025-10-11Powered by