跳到主要内容

Dirichlet 聚合 SDK iOS 接入文档

SDK 概述

Dirichlet Mediation SDK 是一个高性能的广告聚合 SDK,能够同时调用多个广告网络的 SDK,通过实时竞价机制选择最优的广告展示给用户,最大化广告收益。

支持的广告网络:

  • Dirichlet Ad(DRA):Dirichlet Ad 广告平台
  • 穿山甲(CSJ):字节跳动广告平台
  • 优量汇(GDT):腾讯广告平台

支持的广告类型:

  • 开屏广告(Splash Ad)
  • 激励视频广告(Reward Video Ad)
  • Banner 广告
  • 插屏广告(Interstitial Ad)
  • 自渲染信息流广告(Native Feed Ad)

SDK 支持版本

  • iOS 11.0 及以上
  • Xcode 12.0 及以上
  • Objective-C 或 Swift 项目

SDK 集成

配置 Podfile 文件

修改 Podfile 文件,添加 SDK 依赖:

platform :ios, '11.0'
use_frameworks!

target 'YourProjectName' do
# Dirichlet Mediation SDK
pod 'DirichletMediationSDK', '~> 4.2.0.1'

# 广告网络适配器(根据需要选择)
pod 'DirichletMediationAdapterDRA', '~> 4.2.0.1' # Dirichlet Ad 适配器
pod 'DirichletMediationAdapterCSJ', '~> 4.2.0.1' # 穿山甲适配器
pod 'DirichletMediationAdapterGDT', '~> 4.2.0.1' # 优量汇适配器
end

安装 SDK

如果未安装过 CocoaPods,可以通过以下命令行进行安装:

$ sudo gem install cocoapods

通过 CocoaPods 安装 SDK 前,确保 CocoaPods 索引已经更新:

$ pod repo update

运行命令进行安装:

$ pod install

Xcode 配置

检查清单

  • DirichletMediationSDK 只支持相同版本的适配器,例如优量汇适配器 DirichletMediationAdapterGDT 会强制校验接入的 DirichletMediationSDK 版本号是否一致
  • 将 SKAdNetwork ID 添加到 Info.plist 中,以保证 SKAdNetwork 的正确运行
  • 调试阶段尽量使用真机,以便获取 IDFA
  • 如需支持 HTTP 请求,可开启 NSAllowsArbitraryLoads 配置项(可选)

SKAdNetwork 配置

在 Info.plist 中添加以下配置以支持 SKAdNetwork:

<key>SKAdNetworkItems</key>
<array>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>238da6jt44.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>x2jnk7ly8j.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>22mmun2rn5.skadnetwork</string>
</dict>
</array>

注意:当前配置的 SKAdNetwork ID 均为穿山甲广告网络提供。如需其他广告网络的 SKAdNetwork ID,请参考对应官方文档。

App Tracking Transparency (ATT)

从 iOS 14 开始,需要在 Info.plist 中添加 ATT 权限描述:

<key>NSUserTrackingUsageDescription</key>
<string>该标识符将用于向您投放个性化广告</string>

iOS 14.5 以上在拉取广告前请求 ATT 权限:

#import <AppTrackingTransparency/AppTrackingTransparency.h>

if (@available(iOS 14.5, *)) {
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
switch (status) {
case ATTrackingManagerAuthorizationStatusDenied:
NSLog(@"用户拒绝了应用跟踪权限");
break;
case ATTrackingManagerAuthorizationStatusAuthorized:
NSLog(@"用户授权了应用跟踪权限");
break;
case ATTrackingManagerAuthorizationStatusRestricted:
NSLog(@"应用跟踪权限受限");
break;
case ATTrackingManagerAuthorizationStatusNotDetermined:
NSLog(@"用户尚未决定应用跟踪权限");
break;
default:
break;
}
}];
}

SDK 初始化

基本初始化

#import <DirichletMediationSDK/DirichletMediationSDK.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 创建配置对象
DRMSDKConfig *config = [DRMSDKConfig configWithMediaId:@"YOUR_MEDIA_ID"
mediaKey:@"YOUR_MEDIA_KEY"];

// 设置游戏渠道信息(可选)
config.gameChannel = @"TapTap";

// 配置调试模式(可选,默认为 NO,正式发布前应改为 NO)
config.isDebug = NO;

// 开启摇一摇(可选,默认为 YES)
config.shakeEnabled = YES;

// 初始化 SDK
[DirichletMediation startWithConfig:config completion:^(BOOL success, NSError * _Nullable error) {
if (success) {
NSLog(@"SDK 初始化成功");
// 可以开始请求广告
} else {
NSLog(@"SDK 初始化失败: %@", error.localizedDescription);
}
}];

return YES;
}

完整配置示例

// 创建配置对象
DRMSDKConfig *config = [DRMSDKConfig configWithMediaId:@"YOUR_MEDIA_ID"
mediaKey:@"YOUR_MEDIA_KEY"];

// 设置媒体名称(可选)
config.mediaName = @"YourMediaName";

// 设置游戏渠道(可选)
config.gameChannel = @"TapTap";

// 开启调试模式(可选,建议仅在开发阶段使用)
config.isDebug = NO;

// 启用或禁用摇一摇功能(可选,默认为 YES,仅对优量汇广告有效)
config.shakeEnabled = YES;

// 配置自定义控制器(可选)
config.customController = [[MyCustomController alloc] init];

// 设置是否允许访问 IDFA(可选,默认为 YES)
config.allowIDFAAccess = YES;

// 初始化 SDK
[DirichletMediation startWithConfig:config completion:^(BOOL success, NSError * _Nullable error) {
if (success) {
NSLog(@"SDK 初始化成功");
} else {
NSLog(@"SDK 初始化失败: %@", error.localizedDescription);
}
}];

配置参数说明

@interface DRMSDKConfig : NSObject

// ===== 必需参数 =====
/// 媒体 ID(必填)
@property (nonatomic, copy, readonly) NSString *mediaId;

/// 媒体密钥(必填)
@property (nonatomic, copy, readonly) NSString *mediaKey;

// ===== 可选参数 =====
/// 媒体名称
@property (nonatomic, copy, nullable) NSString *mediaName;

/// 游戏渠道信息
@property (nonatomic, copy, nullable) NSString *gameChannel;

/// 调试模式(默认 NO)
@property (nonatomic, assign) BOOL isDebug;

/// 是否启用摇一摇功能(默认 YES,仅对优量汇广告有效)
@property (nonatomic, assign) BOOL shakeEnabled;

/// 自定义控制器
@property (nonatomic, strong, nullable) DRMCustomController *customController;

/// 是否允许访问 IDFA(默认 YES)
@property (nonatomic, assign) BOOL allowIDFAAccess;

@end

自定义控制器

通过实现 DRMCustomController 协议可以控制 SDK 的权限和数据获取行为:

@interface MyCustomController : NSObject <DRMCustomController>
@end

@implementation MyCustomController

- (BOOL)canUseLocation {
// 控制是否允许使用位置信息
return YES;
}

- (CLLocationDegrees)latitude {
// 返回当前纬度
return 39.9042;
}

- (CLLocationDegrees)longitude {
// 返回当前经度
return 116.4074;
}

@end

// 使用自定义控制器
config.customController = [[MyCustomController alloc] init];

广告请求参数

所有广告类型都使用 DRMAdLoadRequest 来配置请求参数:

@interface DRMAdLoadRequest : NSObject

/// 广告位 ID(必填)
@property (nonatomic, copy) NSString *spaceId;

/// 广告尺寸(Splash、Banner、Feed 广告使用)
@property (nonatomic, assign) CGSize adSize;

/// 当前 ViewController(Banner 广告使用)
@property (nonatomic, weak, nullable) UIViewController *viewController;

/// 额外参数(可选)
@property (nonatomic, strong, nullable) NSDictionary<NSString *, id> *extras;

/// 用户 ID(激励视频广告使用)
@property (nonatomic, copy, nullable) NSString *rewardUserId;

/// 奖励名称(激励视频广告使用)
@property (nonatomic, copy, nullable) NSString *rewardName;

/// 奖励数量(激励视频广告使用)
@property (nonatomic, assign) NSInteger rewardAmount;

/// 激励视频额外设置(开启服务端校验时使用)
@property (nonatomic, copy, nullable) NSString *rewardExtra;

/// 小游戏子媒体 ID(可选)
@property (nonatomic, copy, nullable) NSString *minaId;

@end

广告类型

开屏广告

开屏广告是应用启动时展示的全屏广告。

信息

开屏广告的展示和加载必须在同一个 ViewController 中。

竖屏开屏广告要求 width = 屏幕宽,height 需要 >= 75% 屏幕高,否则会影响计费。

横屏开屏广告要求 width = 屏幕宽,height 需要 = 屏幕高,否则会影响计费。

获取和展示广告

#import <DirichletMediationSDK/DirichletMediationSDK.h>

@interface SplashViewController () <DRMSplashAdDelegate>
@property (nonatomic, strong) DRMSplashAd *splashAd;
@end

@implementation SplashViewController

- (void)loadSplashAd {
// 创建广告请求
DRMAdLoadRequest *request = [[DRMAdLoadRequest alloc] initWithSpaceId:@"YOUR_SPLASH_SPACE_ID"];

// 设置广告尺寸
CGSize screenSize = UIScreen.mainScreen.bounds.size;
request.adSize = screenSize;

// 加载开屏广告
[DRMSplashAd loadWithRequest:request
completion:^(NSArray<DRMSplashAd *> * _Nullable ads, NSError * _Nullable error) {
if (error) {
NSLog(@"开屏广告加载失败: %@", error.localizedDescription);
[self goToMainActivity];
return;
}

if (ads.count > 0) {
self.splashAd = ads.firstObject;
self.splashAd.delegate = self;
[self.splashAd showFromViewController:self];
}
}];
}

- (void)goToMainActivity {
// 跳转到主页面
}

#pragma mark - DRMSplashAdDelegate

- (void)splashAdDidShow:(DRMSplashAd *)splashAd {
NSLog(@"开屏广告展示");
}

- (void)splashAdDidClick:(DRMSplashAd *)splashAd {
NSLog(@"开屏广告点击");
}

- (void)splashAdDidClose:(DRMSplashAd *)splashAd {
NSLog(@"开屏广告关闭");
[self goToMainActivity];
}

- (void)splashAdDidSkip:(DRMSplashAd *)splashAd {
NSLog(@"开屏广告被跳过");
[self goToMainActivity];
}

@end

激励视频广告

激励视频广告是用户观看完整视频后获得奖励的广告类型。

获取和展示广告

#import <DirichletMediationSDK/DirichletMediationSDK.h>

@interface RewardViewController () <DRMRewardVideoAdDelegate>
@property (nonatomic, strong) DRMRewardVideoAd *rewardAd;
@end

@implementation RewardViewController

- (void)loadRewardVideoAd {
// 创建广告请求
DRMAdLoadRequest *request = [[DRMAdLoadRequest alloc] initWithSpaceId:@"YOUR_REWARD_SPACE_ID"];
request.rewardUserId = @"user123";
request.rewardName = @"金币";
request.rewardAmount = 100;

// 加载激励视频广告
[DRMRewardVideoAd loadWithRequest:request
completion:^(NSArray<DRMRewardVideoAd *> * _Nullable ads, NSError * _Nullable error) {
if (error) {
NSLog(@"激励视频广告加载失败: %@", error.localizedDescription);
return;
}

if (ads.count > 0) {
self.rewardAd = ads.firstObject;
self.rewardAd.delegate = self;
NSLog(@"激励视频广告加载成功");
}
}];
}

- (void)showRewardVideoAd {
if (self.rewardAd && [self.rewardAd isReady]) {
[self.rewardAd showFromViewController:self];
} else {
NSLog(@"激励视频广告未就绪");
}
}

#pragma mark - DRMRewardVideoAdDelegate

- (void)rewardVideoAdDidShow:(DRMRewardVideoAd *)rewardVideoAd {
NSLog(@"激励视频广告展示");
}

- (void)rewardVideoAdDidRewardUser:(DRMRewardVideoAd *)rewardVideoAd {
NSLog(@"用户获得奖励");
// 发放奖励给用户
}

- (void)rewardVideoAdDidClose:(DRMRewardVideoAd *)rewardVideoAd {
NSLog(@"激励视频广告关闭");
}

- (void)rewardVideoAd:(DRMRewardVideoAd *)rewardVideoAd didFailWithError:(NSError *)error {
NSLog(@"激励视频广告错误: %@", error.localizedDescription);
}

@end

插屏广告

插屏广告支持全屏或半屏展示,适用于应用内自然停顿点。

提示

插屏广告分横竖屏形式,强烈建议在后台配置后正确使用横屏或竖屏广告,若用错配置的 orientation,可能会出现 UI 兼容异常问题。

获取和展示广告

#import <DirichletMediationSDK/DirichletMediationSDK.h>

@interface InterstitialViewController () <DRMInterstitialAdDelegate>
@property (nonatomic, strong) DRMInterstitialAd *interstitialAd;
@end

@implementation InterstitialViewController

- (void)loadInterstitialAd {
// 创建广告请求
DRMAdLoadRequest *request = [[DRMAdLoadRequest alloc] initWithSpaceId:@"YOUR_INTERSTITIAL_SPACE_ID"];

// 加载插屏广告
[DRMInterstitialAd loadWithRequest:request
completion:^(NSArray<DRMInterstitialAd *> * _Nullable ads, NSError * _Nullable error) {
if (error) {
NSLog(@"插屏广告加载失败: %@", error.localizedDescription);
return;
}

if (ads.count > 0) {
self.interstitialAd = ads.firstObject;
self.interstitialAd.delegate = self;

// 检查是否准备好
if ([self.interstitialAd isReady]) {
[self.interstitialAd showFromViewController:self];
}
}
}];
}

#pragma mark - DRMInterstitialAdDelegate

- (void)interstitialAdDidShow:(DRMInterstitialAd *)interstitialAd {
NSLog(@"插屏广告展示");
}

- (void)interstitialAdDidClose:(DRMInterstitialAd *)interstitialAd {
NSLog(@"插屏广告关闭");
}

- (void)interstitialAd:(DRMInterstitialAd *)interstitialAd didFailWithError:(NSError *)error {
NSLog(@"插屏广告错误: %@", error.localizedDescription);
}

@end

Banner 广告是固定在屏幕某个位置的横幅广告。

获取和展示广告

#import <DirichletMediationSDK/DirichletMediationSDK.h>

@interface BannerViewController () <DRMBannerAdDelegate>
@property (nonatomic, strong) DRMBannerAd *bannerAd;
@end

@implementation BannerViewController

- (void)loadBannerAd {
// 创建广告请求
DRMAdLoadRequest *request = [[DRMAdLoadRequest alloc] initWithSpaceId:@"YOUR_BANNER_SPACE_ID"];
request.adSize = CGSizeMake(300, 150);
request.viewController = self;

// 加载 Banner 广告
[DRMBannerAd loadWithRequest:request
completion:^(NSArray<DRMBannerAd *> * _Nullable ads, NSError * _Nullable error) {
if (error) {
NSLog(@"Banner 广告加载失败: %@", error.localizedDescription);
return;
}

if (ads.count > 0) {
self.bannerAd = ads.firstObject;
self.bannerAd.delegate = self;
[self.view addSubview:self.bannerAd.view];
}
}];
}

#pragma mark - DRMBannerAdDelegate

- (void)bannerAdDidShow:(DRMBannerAd *)bannerAd {
NSLog(@"Banner 广告展示");
}

- (void)bannerAdDidClick:(DRMBannerAd *)bannerAd {
NSLog(@"Banner 广告被点击");
}

@end

自渲染信息流广告

自渲染信息流广告提供原始数据,由接入方自行渲染广告 UI。

信息

支持的广告尺寸:

  • 大图(宽高比:1.78 的图片)
  • 视频(宽高比:1.78 的视频)

获取和展示广告

#import <DirichletMediationSDK/DirichletMediationSDK.h>

- (void)loadNativeFeedAd {
// 创建广告请求
DRMAdLoadRequest *request = [[DRMAdLoadRequest alloc] initWithSpaceId:@"YOUR_NATIVE_FEED_SPACE_ID"];
request.adSize = CGSizeMake(300, 300);

// 加载自渲染信息流广告
[DRMNativeFeedAd loadWithRequest:request
completion:^(NSArray<DRMNativeFeedAd *> * _Nullable ads, NSError * _Nullable error) {
if (error) {
NSLog(@"自渲染信息流广告加载失败: %@", error.localizedDescription);
return;
}

if (ads.count > 0) {
DRMNativeFeedAd *nativeFeedAd = ads.firstObject;
nativeFeedAd.delegate = self;

// 获取广告素材数据
DRMNativeFeedAdData *adData = nativeFeedAd.adData;

// 使用广告数据创建自定义 UI
[self displayCustomAdUI:adData];

// 添加广告视图到容器
[self.feedContainer addSubview:nativeFeedAd.view];
}
}];
}

// 自定义广告 UI 示例
- (void)displayCustomAdUI:(DRMNativeFeedAdData *)adData {
// 创建自定义视图
UIView *adView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];

// 显示标题
if (adData.title) {
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 280, 30)];
titleLabel.text = adData.title;
[adView addSubview:titleLabel];
}

// 显示描述
if (adData.desc) {
UILabel *descLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 50, 280, 50)];
descLabel.text = adData.desc;
descLabel.numberOfLines = 2;
[adView addSubview:descLabel];
}

// 显示图片
if (adData.imageURLs && adData.imageURLs.count > 0) {
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 110, 280, 150)];
// 异步加载图片
NSURL *imageURL = [NSURL URLWithString:adData.imageURLs.firstObject];
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:imageURL
completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (data && !error) {
dispatch_async(dispatch_get_main_queue(), ^{
imageView.image = [UIImage imageWithData:data];
});
}
}];
[task resume];
[adView addSubview:imageView];
}

// 显示 CTA 按钮
if (adData.callToAction) {
UIButton *ctaButton = [UIButton buttonWithType:UIButtonTypeSystem];
ctaButton.frame = CGRectMake(10, 270, 280, 20);
[ctaButton setTitle:adData.callToAction forState:UIControlStateNormal];
[adView addSubview:ctaButton];
}

[self.view addSubview:adView];
}

自渲染信息流广告素材数据

@interface DRMNativeFeedAdData : NSObject

/// 标题
@property (nonatomic, copy, nullable) NSString *title;

/// 描述
@property (nonatomic, copy, nullable) NSString *desc;

/// 图标 URL
@property (nonatomic, copy, nullable) NSString *iconURL;

/// 图片 URL 列表
@property (nonatomic, strong, nullable) NSArray<NSString *> *imageURLs;

/// Call to Action 按钮文案
@property (nonatomic, copy, nullable) NSString *callToAction;

/// 广告评分(0-5)
@property (nonatomic, assign) CGFloat appRating;

/// 是否是视频类型
@property (nonatomic, assign) BOOL isVideo;

/// 媒体宽度
@property (nonatomic, assign) CGFloat mediaWidth;

/// 媒体高度
@property (nonatomic, assign) CGFloat mediaHeight;

/// 视频时长(秒,仅视频广告)
@property (nonatomic, assign) NSTimeInterval videoDuration;

@end

测试与调试

穿山甲测试工具(开发阶段可选集成)

穿山甲测试工具是穿山甲官方提供的广告调试和测试工具,开发阶段可选集成

1. 添加依赖

Podfile 中添加穿山甲测试工具依赖:

target 'YourProjectName' do
# 主 SDK 和适配器
pod 'DirichletMediationSDK', '~> 4.2.0.1'
pod 'DirichletMediationAdapterCSJ', '~> 4.2.0.1'

# 穿山甲测试工具(开发阶段必需,仅在 Debug 模式下集成)
pod 'Ads-CN', '~> 7.0.0', :subspecs => ['BUAdTestMeasurement'], :configurations => ['Debug']
end

2. 初始化配置

AppDelegate.m 中添加初始化代码:

#import <BUAdTestMeasurement/BUAdTestMeasurement.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 重要:必须在聚合 SDK 初始化前调用穿山甲测试工具
[self enableCSJTestTool];

// 其他初始化代码(包括聚合 SDK 初始化)...

return YES;
}

#pragma mark - CSJ Test Tool

- (void)enableCSJTestTool {
// 关键:必须在穿山甲 SDK 初始化前调用,否则测试工具界面会异常
[BUAdTestMeasurementManager manager];

// 开启调试模式
[BUAdTestMeasurementConfiguration configuration].debugMode = YES;
}

@end

3. 添加测试工具入口

#import <BUAdTestMeasurement/BUAdTestMeasurement.h>

// 打开穿山甲测试工具
- (void)openCSJTestTool {
[BUAdTestMeasurementManager showTestMeasurementWithController:self.navigationController];
}

4. 使用测试工具

  1. 申请白名单权限:通过平台在线IM、工单或联系商务同学申请使用权限,提供 APPID 开通测试工具白名单
  2. 添加 IDFA 白名单:在穿山甲后台添加测试设备的 IDFA
  3. 开启全局广告预览模式:在 App 中打开穿山甲测试工具,找到"全局广告预览模式"开关并开启
  4. 配置广告位:选择对应的广告位 ID,修改广告类型和素材类型,点击"保存"
信息

优量汇测试工具(广告助手)(开发阶段可选集成)

优量汇广告助手是优量汇官方提供的广告调试和测试工具,开发阶段可选集成

1. 添加依赖

Podfile 中添加优量汇广告助手依赖:

target 'YourProjectName' do
# 主 SDK 和适配器
pod 'DirichletMediationSDK', '~> 4.2.0.1'
pod 'DirichletMediationAdapterGDT', '~> 4.2.0.1'

# 优量汇广告助手(开发阶段可选集成,仅在 Debug 模式下集成)
pod 'GDTMobSDK', '~> 4.14.0', :subspecs => ['GDTAdSDKDebugTool'], :configurations => ['Debug']
end

2. 初始化配置

AppDelegate.m 中添加初始化代码:

#import <GDTMobSDK/GDTAdSDKDebugTool.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 重要:必须在聚合 SDK 初始化前调用优量汇广告助手
[self enableGDTDebugTool];

// 其他初始化代码(包括聚合 SDK 初始化)...

return YES;
}

#pragma mark - GDT Debug Tool

- (void)enableGDTDebugTool {
// 关键:必须在优量汇 SDK 初始化前调用,否则测试工具界面会异常
// 开启广告助手,仅在 Debug 模式下使用
#ifdef DEBUG
[GDTAdSDKDebugTool enableDebugMode:YES];
#endif
}

@end

3. 添加测试工具入口

#import <GDTMobSDK/GDTAdSDKDebugTool.h>

// 打开优量汇广告助手
- (void)openGDTDebugTool {
[GDTAdSDKDebugTool presentDebugToolFromViewController:self];
}

4. 使用测试工具

  1. 添加测试设备:在优量汇后台的"流量管理-测试设备管理"中添加测试设备的 IDFA
  2. 开启广告助手:在 App 中打开优量汇广告助手,可以查看广告请求日志、广告位配置等信息
  3. 测试广告:通过广告助手可以查看广告请求状态、填充情况、错误信息等详细日志
信息

更多信息请参考优量汇广告助手官方文档

开启调试模式

DRMSDKConfig *config = [DRMSDKConfig configWithMediaId:@"YOUR_MEDIA_ID" 
mediaKey:@"YOUR_MEDIA_KEY"];
// 开启调试模式(正式发布时务必关闭)
config.isDebug = YES;

常见问题

SDK 初始化失败怎么办?

请检查以下几点:

  1. 确保 mediaIdmediaKey 正确
  2. 通过控制台查看日志输出,定位具体错误原因

广告加载失败怎么办?

可能的原因:

  1. 穿山甲广告需要集成穿山甲测试工具
  2. 广告位配置错误
  3. 网络连接问题
  4. 广告位无可用广告

如何调试 SDK?

建议的调试步骤:

  1. 开启调试模式 config.isDebug = YES
  2. 查看控制台输出的详细日志
  3. 使用真机进行测试

支持哪些广告网络?

目前支持:

  • Dirichlet Ad (DRA)
  • 穿山甲(CSJ)
  • 优量汇(GDT)

如何处理广告生命周期事件?

每种广告类型都有对应的代理协议:

  • DRMBannerAdDelegate: Banner 广告代理
  • DRMInterstitialAdDelegate: 插屏广告代理
  • DRMRewardVideoAdDelegate: 激励视频广告代理
  • DRMSplashAdDelegate: 开屏广告代理
  • DRMNativeFeedAdDelegate: 自渲染信息流广告代理

小游戏场景如何设置子媒体 ID?

DRMAdLoadRequest *request = [[DRMAdLoadRequest alloc] initWithSpaceId:@"SPACE_ID"];
// 设置小游戏子媒体 ID
request.minaId = @"12345";

参考文档

官方接入文档

更新日志

v4.2.0.1 (2026-01-01)

  • 稳定性提升,性能优化
  • 修复已知问题,优化整体运行效率

v4.1.2.5 (2025-12-05)

  • 稳定性提升
  • 修复已知问题

v4.1.2.0 (2025-12-01)

  • 稳定性优化
  • 修复已知问题

v4.1.0.14 (2025-11-11)

  • 显著减小聚合 SDK 二进制体积,优化启动性能和内存占用
  • 修复若干已知问题,提升聚合链路稳定性

v4.1.0.13 (2025-11-07)

  • 新增 allowIDFAAccess 配置项,默认为 YES
  • 优化广告加载性能
  • 修复已知问题

v4.1.0.11 (2025-10-29)

  • 初始版本发布
  • 支持 Banner、插屏、激励视频、开屏、原生信息流广告
  • 支持穿山甲、优量汇、Dirichlet Ad 广告网络
  • 完善配置参数文档
  • 补充信息流广告类型和使用示例

SDK 错误码说明

错误码格式

SDK 错误码采用6位数字格式:2XXYYY

  • 2: 固定前缀,表示广告相关错误
  • XX: 错误类别(2位)
  • YYY: 具体错误编号(3位)

常见错误码

错误码说明
200001广告位无填充,参考详细msg返回
200002广告数据无填充,参考详细msg返回
200010广告渲染失败,参考详细msg返回
200011视频播放失败,参考详细msg返回
200012广告下载失败,参考详细msg返回