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', '~> 5.2.1.5'
# 广告网络适配器(根据需要选择)
pod 'DirichletMediationAdapterDRA', '~> 5.2.1.5' # Dirichlet Ad 适配器
pod 'DirichletMediationAdapterCSJ', '~> 5.2.1.5' # 穿山甲适配器
pod 'DirichletMediationAdapterGDT', '~> 5.2.1.5' # 优量汇适配器
end
5.2.1.5 版本的适配器会自动解析穿山甲 SDK 7.5.0.7 和优量汇 SDK 4.16.00,请勿在 Podfile 中另外固定不兼容的三方 SDK 版本。
安装 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);
}
}];
媒体通参(可选)
媒体通参可在任意时机设置,后续 广告请求会读取最新值。键长度为 1~32 个字符,值长度为 1~64 个字符,最多保留 5 组键值对。
// 设置或更新通参
[DirichletMediation.publisherMetadata putMediaGlobalSettings:@"user123" forKey:@"uid"];
[DirichletMediation.publisherMetadata putMediaGlobalSettings:@"vip" forKey:@"level"];
// 获取当前快照
NSDictionary<NSString *, NSString *> *metadata =
[DirichletMediation.publisherMetadata allValuesSnapshot];
// 移除指定通参或清空全部通参
[DirichletMediation.publisherMetadata removeValueForKey:@"uid"];
[DirichletMediation.publisherMetadata removeAllValues];
配置参数说明
@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 广告
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>
@interface NativeFeedViewController () <DRMNativeFeedAdDelegate>
@property (nonatomic, strong) DRMNativeFeedAd *nativeFeedAd;
@property (nonatomic, strong) UIView<DRMNativeFeedAdView> *nativeFeedAdView;
@end
- (void)loadNativeFeedAd {
DRMAdLoadRequest *request = [[DRMAdLoadRequest alloc] initWithSpaceId:@"YOUR_NATIVE_FEED_SPACE_ID"];
[DRMNativeFeedAd loadWithRequest:request
completion:^(NSArray<DRMNativeFeedAd *> * _Nullable ads, NSError * _Nullable error) {
if (error || ads.count == 0) {
NSLog(@"自渲染信息流广告加载失败: %@", error.localizedDescription);
return;
}
self.nativeFeedAd = ads.firstObject;
self.nativeFeedAd.delegate = self;
UIView<DRMNativeFeedAdView> *adView = self.nativeFeedAd.view;
adView.frame = self.feedContainer.bounds;
adView.viewController = self;
DRMNativeFeedAdData *adData = self.nativeFeedAd.adData;
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 280, 30)];
titleLabel.text = adData.title;
UIButton *ctaButton = [UIButton buttonWithType:UIButtonTypeSystem];
ctaButton.frame = CGRectMake(10, 60, 280, 40);
[ctaButton setTitle:adData.callToAction ?: @"查看详情" forState:UIControlStateNormal];
UIButton *closeButton = [UIButton buttonWithType:UIButtonTypeSystem];
closeButton.frame = CGRectMake(adView.bounds.size.width - 40, 8, 32, 32);
[closeButton setTitle:@"×" forState:UIControlStateNormal];
[adView addSubview:titleLabel];
[adView addSubview:ctaButton];
[adView addSubview:closeButton];
// 视频素材使用 adView.videoView;图片素材使用 adData.imageURLs 自行加载
UIView *videoView = adData.isVideo ? adView.videoView : nil;
if (videoView) {
videoView.frame = CGRectMake(10, 110, 280, 160);
[adView addSubview:videoView];
}
[adView registerClickableViews:@[ctaButton] closableView:closeButton];
self.nativeFeedAdView = adView;
[self.feedContainer addSubview:adView];
}];
}
- (void)clearNativeFeedAd {
if ([self.nativeFeedAdView respondsToSelector:@selector(unregisterClickableViewsAndClosableView)]) {
[self.nativeFeedAdView unregisterClickableViewsAndClosableView];
}
[self.nativeFeedAd destroy];
self.nativeFeedAdView = nil;
self.nativeFeedAd = nil;
}
自渲染 UI 必须添加在 nativeFeedAd.view 的视图层级内,并通过 registerClickableViews:closableView: 注册交互区域。列表复用或页面销毁时应先取消注册,再销毁广告对象。
自渲染信息流广告素材数据
@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', '~> 5.2.1.5'
# 调试期间用 DevTools subspec 替换普通穿山甲适配器依赖
pod 'DirichletMediationAdapterCSJ/DevTools', '~> 5.2.1.5'
end
DevTools 已包含普通适配器能力,请勿同时重复声明 DirichletMediationAdapterCSJ。正式发布前应恢复普通适配器依赖并移除 DevTools。
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. 使用测试工具
- 申请白名单权限:通过平台在线IM、工单或联系商务同学申请使用权限,提供 APPID 开通测试工具白名单
- 添加 IDFA 白名单:在穿山甲后台添加测试设备的 IDFA
- 开启全局广告预览模式:在 App 中打开穿山甲测试工具,找到"全局广告预览模式"开关并开启
- 配置广告位:选择对应的广告位 ID,修改广告类型和素材类型,点击"保存"
更多信息请参考穿山甲 SDK 广告预览工具官方文档。
优量汇测试工具(广告助手)(开发阶段可选集成)
优量汇广告助手是优量汇官方提供的广告调试和测试工具,开发阶段可选集成。
1. 添加依 赖
在 Podfile 中添加优量汇广告助手依赖:
target 'YourProjectName' do
# 主 SDK
pod 'DirichletMediationSDK', '~> 5.2.1.5'
# 调试期间用 DevTools subspec 替换普通优量汇适配器依赖
pod 'DirichletMediationAdapterGDT/DevTools', '~> 5.2.1.5'
end
DevTools 已包含普通适配器能力,请勿同时重复声明 DirichletMediationAdapterGDT。正式发布前应恢复普通适配器依赖并移除 DevTools。
2. 初始化配置
如需调试悬浮球,可在 Debug 环境中启用:
#import <GDTDevToolSDK/GDTDevToolSDK.h>
#ifdef DEBUG
[GDTDevToolSDK ensureEnableFloatBallInDebug:YES];
#endif
3. 添加测试工具入口
#import <GDTDevToolSDK/GDTDevToolSDK.h>
// 打开优量汇广告助手
- (void)openGDTDebugTool {
#ifdef DEBUG
UIViewController *toolViewController =
[GDTDevToolSDK ensureEnableToolVcInDebug:YES];
[self.navigationController pushViewController:toolViewController animated:YES];
#endif
}
4. 使用测试工具
- 添加测试设备:在优量汇后台的"流量管理-测试设备管 理"中添加测试设备的 IDFA
- 开启广告助手:在 App 中打开优量汇广告助手,可以查看广告请求日志、广告位配置等信息
- 测试广告:通过广告助手可以查看广告请求状态、填充情况、错误信息等详细日志
更多信息请参考优量汇广告助手官方文档。
开启调试模式
DRMSDKConfig *config = [DRMSDKConfig configWithMediaId:@"YOUR_MEDIA_ID"
mediaKey:@"YOUR_MEDIA_KEY"];
// 开启调试模式(正式发布时务必关闭)
config.isDebug = YES;
常见问题
SDK 初始化失败怎么办?
请检查以下几点:
- 确保
mediaId和mediaKey正确 - 通过控制台查看日志输出,定位具体错误原因
广告加载失败怎么办?
可能的原因:
- 穿山甲广告需要集成穿山甲测试工具
- 广告位配置错误
- 网络连接问题
- 广告位无可用广告
如何调试 SDK?
建议的调试步骤:
- 开启调试模式
config.isDebug = YES - 查看控制台输出的详细日志
- 使用真机进行测试
支持哪些广告网络?
目前支持:
- Dirichlet Ad (DRA)
- 穿山甲(CSJ)
- 优量汇(GDT)
如何处理广告生命周期事件?
每种广告类型都有对应的代理协议:
DRMBannerAdDelegate: Banner 广告代理DRMInterstitialAdDelegate: 插屏广告代理DRMRewardVideoAdDelegate: 激励视频广告代理DRMSplashAdDelegate: 开屏广告代理DRMNativeFeedAdDelegate: 自渲染信息流广告代理
小游戏场景如何设置子媒体 ID?
DRMAdLoadRequest *request = [[DRMAdLoadRequest alloc] initWithSpaceId:@"SPACE_ID"];
// 设置小游戏子媒体 ID
request.minaId = @"12345";
参考文档
官方接入文档
- 穿山甲 SDK: Xcode 配置指南
- 优量汇 SDK: iOS 集成文档
更新日志
v5.2.1.5 (2026-08-31)
- 【优化】 提升稳定性
v5.1.2.3 (2026-08-12)
- 【优化】 提升稳定性
v5.1.1.1 (2026-08-06)
- 【优化】 广告样式优化
- 【优化】 提升 SDK 整体稳定性及兼容性
v4.2.8.3 (2026-07-28)
- 【新增】 支持媒体通参配置
- 【升级】 iOS 穿山甲SDK升级至7.5.0.7
- 【升级】 iOS 优量汇SDK升级至4.15.80
- 【优化】 提升 SDK 整体稳定性及兼容性
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返回 |