Dirichlet Ad SDK iOS 接入文档
SDK 概述
Dirichlet Ad 是一款功能完善的 iOS 广告 SDK,支持多种广告形式:
- 开屏广告(Splash Ad):应用启动时展示的全屏广告
- 激励视频广告(Reward Video Ad):用户观看完整视频后获得奖励
- Banner广告:固定位置的横幅广告
- 插屏广告(Interstitial Ad):全屏或半屏的插屏广告
- 信息流广告(Feed Ad):嵌入内容流中的原生广告
主要特性:
- 丰富的自定义配置选项
- 完善的隐私合规控制
- 多样化的广告交互回调
系统要求
- 最低系统版本:iOS 11.0+
- 开发工具:Xcode 12.0+
- 依赖管理:CocoaPods 1.10.0+
SDK 集成
配置 Podfile 文件
修改 Podfile 文件,添加 SDK 依赖:
platform :ios, '11.0'
use_frameworks!
target 'YourProjectName' do
# Dirichlet Ad
pod 'DirichletAdSDK', '~> 4.2.0.1'
end
安装 SDK
如果未安装过 CocoaPods,可以通过以下命令行进行安装:
$ sudo gem install cocoapods
通过 CocoaPods 安装前,确保 CocoaPods 索引已经更新:
$ pod repo update
运行命令进行安装:
$ pod install
Xcode 配置
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 <DirichletAdSDK/DirichletAdSDK.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 创建配置对象
DRASDKConfig *config = [[DRASDKConfig alloc] initWithMediaId:@"YOUR_MEDIA_ID"
mediaKey:@"YOUR_MEDIA_KEY"];
// 配置调试模式(可选,默认为 NO,正式发布前应改为 NO)
config.isDebug = NO;
// 设置是否启用摇一摇功能(可 选,默认为 YES)
config.shakeEnabled = YES;
// 设置游戏渠道信息(可选)
config.gameChannel = @"TapTap";
// 初始化 SDK
[DirichletAd startWithConfig:config completion:^(BOOL success, NSError * _Nullable error) {
if (success) {
NSLog(@"SDK 初始化成功");
// 可以开始请求广告
} else {
NSLog(@"SDK 初始化失败: %@", error.localizedDescription);
}
}];
return YES;
}
完整配置示例
// 创建配置对象
DRASDKConfig *config = [[DRASDKConfig alloc] initWithMediaId:@"YOUR_MEDIA_ID"
mediaKey:@"YOUR_MEDIA_KEY"];
// 设置媒体名称(可选)
config.mediaName = @"YourAppName";
// 设置游戏渠道(可选)
config.gameChannel = @"TapTap";
// 设置调试模式(可选)
config.isDebug = NO;
// 设置是否启用摇一摇功能(可选,默认为 YES)
config.shakeEnabled = YES;
// 设置是否启用视频预缓存(可选,默认为 YES)
config.enableVideoPreCache = YES;
// 设置 TapTap Client ID(可选)
config.tapClientId = @"YOUR_TAP_CLIENT_ID";
// 设置自定义信息提供者(可选)
config.customInfoProvider = [[MyCustomInfoProvider alloc] init];
// 设置是否允许访问 IDFA(可选,默认为 YES)
config.allowIDFAAccess = YES;
// 初始化 SDK
[DirichletAd startWithConfig:config completion:^(BOOL success, NSError * _Nullable error) {
if (success) {
NSLog(@"SDK 初始化成功");
} else {
NSLog(@"SDK 初始化失败: %@", error.localizedDescription);
}
}];
配置参数说明
@interface DRASDKConfig : 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, getter=isShakeEnabled) BOOL shakeEnabled;
/// 是否启用视频预缓存(默认 YES)
@property (nonatomic, assign, getter=isEnableVideoPreCache) BOOL enableVideoPreCache;
/// TapTap 客户端 ID
@property (nonatomic, copy, nullable) NSString *tapClientId;
/// 自定义信息提供者
@property (nonatomic, strong, nullable) id<DRACustomInfoProviding> customInfoProvider;
/// CTA 拦截器
@property (nonatomic, weak, nullable) id<DRACTAInterceptor> ctaInterceptor;
/// 是否允许访问 IDFA(默认 YES)
@property (nonatomic, assign) BOOL allowIDFAAccess;
@end
广告类型
开屏广告
开屏广告为用户在进入 App 时展示的全屏广告。
信息
竖屏开屏广告要求 width = 屏幕宽,height 需要 >= 75% 屏幕高,否则会影响计费。
横屏开屏广告要求 width = 屏幕宽,height 需要 = 屏幕高,否则会影响计费。
获取广告
#import <DirichletAdSDK/DirichletAdSDK.h>
@interface SplashViewController () <DRASplashAdDelegate>
@property (nonatomic, strong) DRASplashAd *splashAd;
@end
@implementation SplashViewController
- (void)loadSplashAd {
// 创建加载请求
DRASplashAdLoadRequest *request = [[[DRASplashAdLoadRequest builder]
withSpaceId:@"YOUR_SPLASH_AD_SPACE_ID"]
withLogoImage:[UIImage imageNamed:@"app_logo"]] // 可选:配置自定义 Logo
build];
// 加载开屏广告
[DRASplashAd loadWithRequest:request completion:^(DRASplashAd * _Nullable ad, NSError * _Nullable error) {
if (error) {
NSLog(@"开屏广告加载失败: %@", error.localizedDescription);
// 跳转到主页面
[self goToMainActivity];
return;
}
if (ad && ad.isReady) {
self.splashAd = ad;
self.splashAd.delegate = self;
// 展示广告
[self.splashAd showFromViewController:self];
}
}];
}
- (void)goToMainActivity {
// 跳转到主页面逻辑
}
#pragma mark - DRASplashAdDelegate
- (void)dirichletAdDidLoad:(id<DRAAd>)ad {
NSLog(@"开屏广告加载完成");
}
- (void)dirichletAdDidShow:(id<DRAAd>)ad {
NSLog(@"开屏广告开始展示");
}
- (void)dirichletSplashAdDidValidShow:(DRASplashAd *)splashAd {
NSLog(@"开屏广告有效展示");
}
- (void)dirichletSplashAdDidSkip:(DRASplashAd *)splashAd {
NSLog(@"开屏广告被跳过");
[self goToMainActivity];
}
- (void)dirichletSplashAdDidTimeOver:(DRASplashAd *)splashAd {
NSLog(@"开屏广告倒计时结束");
[self goToMainActivity];
}
- (void)dirichletAdDidClose:(id<DRAAd>)ad {
NSLog(@"开屏广告关闭");
self.splashAd = nil;
[self goToMainActivity];
}
- (void)dirichletAd:(id<DRAAd>)ad didFailWithError:(NSError *)error {
NSLog(@"开屏广告错误: %@", error.localizedDescription);
}
@end
激励视频广告
激励视频是一种全屏播放的视频广告,用户可以在观看完整的视频后获取奖励。
信息
- 全屏横屏(宽高比 16:9)
- 全屏竖屏(宽高比 9:16)
获取广告
#import <DirichletAdSDK/DirichletAdSDK.h>
@interface RewardedAdViewController () <DRARewardedAdDelegate>
@property (nonatomic, strong) DRARewardedAd *rewardedAd;
@end
@implementation RewardedAdViewController
- (void)loadRewardedAd {
// 创建加载请求
DRARewardedAdLoadRequest *request = [[[DRARewardedAdLoadRequest builder]
withSpaceId:@"YOUR_REWARD_AD_SPACE_ID"]
withRewardName:@"金币"] // 可选:奖励名称
withRewardAmount:100] // 可选:奖励数量
build];
// 加载激励视频广告
[DRARewardedAd loadWithRequest:request completion:^(DRARewardedAd * _Nullable ad, NSError * _Nullable error) {
if (error) {
NSLog(@"激励视频广告加载失败: %@", error.localizedDescription);
return;
}
if (ad) {
self.rewardedAd = ad;
self.rewardedAd.delegate = self;
NSLog(@"激励视频广告加载成功");
}
}];
}
- (void)showRewardedAd {
if (self.rewardedAd && self.rewardedAd.isReady) {
[self.rewardedAd showFromViewController:self];
} else {
NSLog(@"激励视频广告未就绪");
}
}
#pragma mark - DRARewardedAdDelegate
- (void)dirichletAdDidLoad:(id<DRAAd>)ad {
NSLog(@"激励视频广告加载完成");
}
- (void)dirichletAdDidShow:(id<DRAAd>)ad {
NSLog(@"激励视频广告开始展示");
}
- (void)dirichletAdDidClick:(id<DRAAd>)ad {
NSLog(@"用户点击激励视频广告");
}
- (void)rewardedAd:(DRARewardedAd *)ad
didVerifyReward:(BOOL)verified
rewardAmount:(NSInteger)amount
rewardName:(NSString *)name {
if (verified) {
NSLog(@"用户获得奖励: %@ x %ld", name, (long)amount);
// 发放奖励给用户
} else {
NSLog(@"奖励验证失败");
}
}
- (void)dirichletAdDidClose:(id<DRAAd>)ad {
NSLog(@"激励视频广告关闭");
self.rewardedAd = nil;
}
- (void)dirichletAd:(id<DRAAd>)ad didFailWithError:(NSError *)error {
NSLog(@"激励视频广告错误: %@", error.localizedDescription);
}
@end
插屏广告
插屏广告支持「全屏视频广告」、「全屏图文广告」和「半屏图文广告」等形式。
提示
插屏广告分横竖屏形式,强烈建议在后台配置后正确使用横屏或竖屏广告,若用错配置的 orientation,可能会出现 UI 兼容异常问题。
获取广告
#import <DirichletAdSDK/DirichletAdSDK.h>
@interface InterstitialViewController () <DRAInterstitialAdDelegate>
@property (nonatomic, strong) DRAInterstitialAd *interstitialAd;
@end
@implementation InterstitialViewController
- (void)loadInterstitialAd {
// 创建加载请求
DRAInterstitialAdLoadRequest *request = [[[DRAInterstitialAdLoadRequest builder]
withSpaceId:@"YOUR_INTERSTITIAL_AD_SPACE_ID"]
build];
// 加载插屏广告
[DRAInterstitialAd loadWithRequest:request completion:^(DRAInterstitialAd * _Nullable ad, NSError * _Nullable error) {
if (error) {
NSLog(@"插屏广告加载失败: %@", error.localizedDescription);
return;
}
if (ad) {
self.interstitialAd = ad;
self.interstitialAd.delegate = self;
NSLog(@"插屏广告加载成功");
}
}];
}
- (void)showInterstitialAd {
if (self.interstitialAd && self.interstitialAd.isReady) {
[self.interstitialAd showFromViewController:self];
} else {
NSLog(@"插屏广告未就绪");
}
}
#pragma mark - DRAInterstitialAdDelegate
- (void)dirichletAdDidLoad:(id<DRAAd>)ad {
NSLog(@"插屏广告加载完成");
}
- (void)dirichletAdDidShow:(id<DRAAd>)ad {
NSLog(@"插屏广告开始展示");
}
- (void)dirichletAdDidClick:(id<DRAAd>)ad {
NSLog(@"用户点击插屏广告");
}
- (void)dirichletAdDidClose:(id<DRAAd>)ad {
NSLog(@"插屏广告关闭");
self.interstitialAd = nil;
}
- (void)dirichletAd:(id<DRAAd>)ad didFailWithError:(NSError *)error {
NSLog(@"插屏广告错误: %@", error.localizedDescription);
}
@end
Banner 广告
模版渲染 Banner:开发者不用自行对广告样式进行编辑和渲染,可直接调用相关接口进行广告展示。
获取广告
#import <DirichletAdSDK/DirichletAdSDK.h>
@interface BannerViewController () <DRABannerAdViewDelegate>
@property (nonatomic, strong) DRABannerAdView *bannerView;
@end
@implementation BannerViewController
- (void)loadBannerAd {
// 创建 Banner 视图
self.bannerView = [[DRABannerAdView alloc] init];
self.bannerView.delegate = self;
self.bannerView.frame = CGRectMake(0, 0, 320, 50);
[self.view addSubview:self.bannerView];
// 创建加载请求
DRABannerAdLoadRequest *request = [[[DRABannerAdLoadRequest builder]
withSpaceId:@"YOUR_BANNER_AD_SPACE_ID"]
build];
// 加载广告
[self.bannerView loadWithRequest:request];
}
#pragma mark - DRABannerAdViewDelegate
- (void)bannerAdViewDidLoad:(DRABannerAdView *)bannerAdView {
NSLog(@"Banner 广告加载完成");
}
- (void)bannerAdViewDidShow:(DRABannerAdView *)bannerAdView {
NSLog(@"Banner 广告展示");
}
- (void)bannerAdViewDidClick:(DRABannerAdView *)bannerAdView {
NSLog(@"Banner 广告被点击");
}
- (void)bannerAdView:(DRABannerAdView *)bannerAdView didFailWithError:(NSError *)error {
NSLog(@"Banner 广告加载失败: %@", error.localizedDescription);
}
@end