主要场景
• 开屏广告
• 插屏广告
• 激励视频
• 信息流
• banner
运行环境
• ⽀持系统 iOS12.0 及以上;
• SDK 编译环境 Xcode14.2;
• ⽀持架构:arm64;
引入framework包
⼿动导入 - ⽬前仅支持⼿动导入
将demo中获取的framework文件 AdSDKLib 拖入项⽬中即可
2.Xcode配置
添加权限
• 工程plist文件设置,点击右边的information Property List后边的 "+" 展开添加 App Transport Security Settings,先点击左侧展开箭头,再点右侧加号,Allow Arbitrary Loads 选项自动加入,修改值为 YES。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
• SDK 不会主动获取应⽤位置权限,当应⽤本身有获取位置权限逻辑时,需要在应⽤的info.plist 添加相应配置信息,避免 App Store 审核被拒。
Privacy - Location When In Use Usage Description
Privacy - Location Always and When In Use Usage Description
Privacy - Location Always Usage Description
Privacy - Location Usage Description
• 从 iOS 14.5 开始,若开发者设置 App Tracking Transparency 向用户申请跟踪授权,在用户授权之前IDFA 将不可用。
<key>NSUserTrackingUsageDescription</key>
<string>该标识符将用于向您投放个性化广告</string>
权限 | 功能 | 用途和目的 | 申请时机 |
---|---|---|---|
NSLocationAlwaysUsageDescription | 【可选】总是允许访问定位 | 根据位置情况实现流量分组功能 | 需要定位功能时 |
NSLocationAlwaysAndWhenInUseUsageDescription | 【可选】总是允许/使用期间访问定位 | 根据位置情况实现流量分组功能 | 准备从"使用期间"升级到"始终"定位权限时,必须配置此字段;iOS 13及以后系统默认需要,防止请求失败 |
NSLocationWhenInUseUsageDescription | 【可选】使用期间访问定位 | 根据位置情况实现流量分组功能 | 用户已同意"使用期间"定位后,进一步申请"始终定位"权限时用 |
NSUserTrackingUsageDescription | 【可选】获取设备标识,以识别设备信息 | 根据设备信息情况实现流量分组功能 | 在访问 IDFA(广告标识符)之前必须申请 |
• 在Target->Build Settings -> Other Linker Flags中添加-ObjC -all_load, 字⺟o和c⼤写。
[图片上传失败...(image-69e7ea-1753346146244)]
添加依赖库
工程需要在TARGETS -> Build Phases中找到Link Binary With Libraries,点击“+”,依次添加下列依赖库。
• Accelerate.framework
• AdSupport.framework
• AppTrackingTransparency.framework
• AudioToolbox.framework
• AVFoundation.framework
• CFNetwork.framework
• CoreGraphics.framework
• CoreFoundation.framework
• CoreImage.framework
• CoreLocation.framework
• CoreMedia.framework
• CoreMotion.framework
• CoreTelephony.framework
• Foundation.framework
• ImageIO.framework
• MediaPlayer.framework
• MobileCoreServices.framework
• QuartzCore.framework
• Security.framework
• StoreKit.framework
• SystemConfiguration.framework
• UIKit.framework
• WebKit.framework
• libbz2.tbd
• libc++.tbd
• libiconv.tbd
• libresolv.9.tbd
• libsqlite3.tbd
• libxml2.tbd
• libz.tbd
• libc++abi.tbd
3.SDK初始化及全局配置
引入framework包
⼿动导入 - ⽬前仅⽀持⼿动导入
将demo中获取的framework⽂件AdSDKLib(包括微信SDK WechatOpenSDK-XCFramework) 拖入项⽬中即可(或者参考微信开放平台https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/iOS.html)具体配置请参考微信开放平台。
AppDelegate
@property (strong, nonatomic) UIWindow *window;
-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIWindow *keyWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window = keyWindow;
//SDK初始化 isGetLocation:是否获取定位信息
[JiHuoNiaoSDKManagerHZ startWithAppid:@"xxx" AppKey:@"xxx" isGetLocation:YES];
return YES;
}
隐私数据说明
SDK支持的隐私数据相关配置目前主要集中在JiHuoNiaoSDKConfiguration类来集中管理。
[JiHuoNiaoSDKConfiguration configuration].jihuoniaoCustomIdfa = @"111";
[JiHuoNiaoSDKConfiguration configuration].jihuoniaoIsPersonalAds = YES;
[JiHuoNiaoSDKConfiguration configuration].jihuoniaoIsPprogrammaticAds = YES;
[JiHuoNiaoSDKConfiguration configuration].jihuoniaoSDKAgeGroup = JiHuoNiaoAdSDKAgeGroupAdult;
[JiHuoNiaoSDKConfiguration setjihuoniaoSDKLBSLon:@"9.1111" lat:@"8.1111"];
方法 | 说明 |
---|---|
@property (nonatomic, copy) NSString * jihuoniaoCustomIdfa | 自定义idfa (字符串) |
@property (nonatomic, assign) BOOL jihuoniaoIsPersonalAds; | 个性化广告推荐 (默认NO) NO-不限制,YES-限制 |
@property (nonatomic, assign) BOOL jihuoniaoIsPprogrammaticAds | 程序化广告推荐(默认NO) NO-不限制,YES-限制 |
@property (nonatomic, assign) JiHuoNiaoAdSDKAgeGroup jihuoniaoSDKAgeGroup; | 未成年人设置成人/年龄15~18岁/年龄小于15岁 JiHuoNiaoAdSDKAgeGroupAdult(默认)成年人 JiHuoNiaoAdSDKAgeGroupTeenager年龄15~18岁 JiHuoNiaoAdSDKAgeGroupMinor年龄小于15岁 |
+ (void)setjihuoniaoSDKLBSLon:(NSString *)lon lat:(NSString *)lat | 外部媒体通过该接口传递经纬度 设置SDK是否可以使用某些隐私数据,或者自己传递这些隐私数据。如果未设置此属性,SDK将执行默认的隐私数据使用逻辑 |
ATT授权 & SKAdNetwork
向用户申请权限时,请调用 requestTrackingAuthorizationWithCompletionHandler:方法。我们建议您申请权限后再请求广告,以便准确的获得用户授权状态。
#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <AdSupport/AdSupport.h>
- (void)requestIDFATracking {
if (@available(iOS 14, *)) {
// iOS14及以上版本需要先请求权限
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
// 获取到权限后,依然使用老方法获取idfa
if (status == ATTrackingManagerAuthorizationStatusAuthorized) {
NSString *idfa = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString];
NSLog(@"%@",idfa);
} else {
NSLog(@"请在设置-隐私-跟踪中允许App请求跟踪");
}
}];
} else {
// iOS14以下版本依然使用老方法
// 判断在设置-隐私里用户是否打开了广告跟踪
if ([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) {
NSString *idfa = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString];
NSLog(@"%@",idfa);
} else {
NSLog(@"请在设置-隐私-广告中打开广告跟踪功能");
}
}
}
开屏广告
@property (nonatomic,strong)JiHuoNiaoSplashAdHZ *jiHuoNiaoSplashAd;
//拉取⼴告
self.jiHuoNiaoSplashAd = [[JiHuoNiaoSplashAdHZ alloc] initWithJihuoniaoHZADSiteID:jiHuoNiao_splash_ID];
self.jiHuoNiaoSplashAd.delegate = self;
//如果需设置底部logoView
[self.jiHuoNiaoSplashAd setJiHuoNiaoHZLogoBottom:[self bottomView]];
//加载并显示
[self.jiHuoNiaoSplashAd jiHuoNiaoHZLoadAd];
//加载
[self.jiHuoNiaoSplashAd jiHuoNiaoHZOnlyLoad];
//显示
[self.jiHuoNiaoSplashAd jiHuoNiaoHZOnlyShow];
//竞价价格
self.jiHuoNiaoSplashAd.jiHuoNiaoHZGetEcpm
//竞价成功或者失败回传
JiHuoNiaoServerBiddingResultModel * resultModel = [[JiHuoNiaoServerBiddingResultModel alloc]init];
[self.jiHuoNiaoSplashAd jiHuoNiaoHZEcpmWinSucessOrFailed:resultModel];
//开屏⼴告
- (void)JiHuoNiaoSplashViewHZRenderSuccess;
//开屏⼴告点击
- (void)JiHuoNiaoSplashViewHZDidClick;
//开屏⼴告关闭
- (void)JiHuoNiaoSplashViewHZDidClose;
//开屏网络请求成功
- (void)JiHuoNiaoSplashViewHZLoadSuccess;
//开屏网络请求错误
- (void)JiHuoNiaoSplashViewHZFailWithCode:(NSInteger)code TipStr:(NSString *)tipStr ErrorMessage:(NSString *)errorMessage;
插屏广告
self.jiHuoNiaoInterstitialAd = [[JiHuoNiaoInterstitialAdHZ alloc] initWithJihuoniaoHZADSiteID:jiHuoNiao_interstitial_ID];
self.jiHuoNiaoInterstitialAd.delegate = self;
//加载并显示
[self.jiHuoNiaoInterstitialAd jiHuoNiaoHZLoadAd];
//加载
[self.jiHuoNiaoInterstitialAd jiHuoNiaoHZOnlyLoad];
//显示
[self.jiHuoNiaoInterstitialAd jiHuoNiaoHZOnlyShow];
//竞价价格
self.jiHuoNiaoInterstitialAd.jiHuoNiaoHZGetEcpm
//竞价成功或者失败回传
JiHuoNiaoServerBiddingResultModel * resultModel = [[JiHuoNiaoServerBiddingResultModel alloc]init];
[self.jiHuoNiaoInterstitialAd jiHuoNiaoHZEcpmWinSucessOrFailed:resultModel];
// 插屏⼴告网络请求成功
- (void)JiHuoNiaoInterstitialAdHZLoadSuccess
插屏⼴告曝光
- (void)JiHuoNiaoInterstitialAdHZRenderSuccess;
插屏⼴告点击
- (void)JiHuoNiaoInterstitialAdHZDidClick;
插屏⼴告关闭
- (void)JiHuoNiaoInterstitialAdHZDidClose;
//插⼴告错误
- (void)JiHuoNiaoInterstitialAdHZFailWithCode:(NSInteger)code TipStr:(NSString *)tipStr ErrorMessage:(NSString *)errorMessage;
激励视频广告
//媒体用户可选id
@property(nonatomic,strong) NSString * jiHuoNiao_user_id;
//媒体用户扩展信息可选json
@property(nonatomic,strong) NSString * jiHuoNiao_user_extra;
self.jiHuoNiaoRewardAd = [[JiHuoNiaoRewardAdHZ alloc]initWithJihuoniaoHZADSiteID:jiHuoNiao_reward_ID];
self.jiHuoNiaoRewardAd.delegate = self;
//加载并显示
[self.jiHuoNiaoRewardAd jiHuoNiaoHZLoadShowRewardAd:self];
//加载
[self.JiHuoNiaoRewardAd jiHuoNiaoHZLoadRewardAd];
//显示
[self.JiHuoNiaoRewardAd jiHuoNiaoHZShowRewardAd:self];
//竞价价格
self.JiHuoNiaoRewardAd.jiHuoNiaoHZGetEcpm
//竞价成功或者失败回传
JiHuoNiaoServerBiddingResultModel * resultModel = [[JiHuoNiaoServerBiddingResultModel alloc]init];
[self.JiHuoNiaoRewardAd jiHuoNiaoHZEcpmWinSucessOrFailed:resultModel];
//激励视频⼴告网络加载成功
- (void)JiHuoNiaoRewardedVideoAdHZDidLoad;
//激励视频⼴告曝光
- (void)JiHuoNiaoRewardedVideoAdHZViewRenderSuccess;
//激励视频⼴告点击
- (void)JiHuoNiaoRewardedVideoAdHZDidClick;
//激励视频⼴告关闭
- (void)JiHuoNiaoRewardedVideoAdHZDidClose;
//激励视频⼴告错误
- (void)JiHuoNiaoRewardedVideoAdHZFailWithCode:(NSInteger)code TipStr:(NSString *)tipStr ErrorMessage:(NSString *)errorMessage;
//激励视频⼴告奖励
- (void)JiHuoNiaoRewardedVideoAdHZHasReward;
信息流广告
//拉取⼴告
//设置宽度。高度是0或者小于45按宽度自适应
CGFloat width = [UIScreen mainScreen].bounds.size.width-52;
self.jiHuoNiaoFeedAd = [[JiHuoNiaoFeedAdHZ alloc] initWithJihuoniaoHZADSiteID:jiHuoNiao_feed_ID Size:CGSizeMake(width, 0)];
self.jiHuoNiaoFeedAd.delegate = self;
//拉取广告,count为拉取范围1-3,最大值为3条
[self.jiHuoNiaoFeedAd jihuoniaoHZLoadAdWithCount:3];
//信息流代理回调
//信息流⼴告加载成功 返回数据源
-(void)JiHuoNiaoFeedAdHZLoad:(NSArray<JiHuoNiaoServerEcpmRequestModel *> *)adList{
for (JiHuoNiaoServerEcpmRequestModel * model in adList) {
JiHuoNiaoServerBiddingResultModel * resultModel = [[JiHuoNiaoServerBiddingResultModel alloc]init];
//竞价价格
model.ecpm
//竞价成功或者失败回传
[self.jiHuoNiaoFeedAd jiHuoNiaoHZEcpmWinSucessOrFailed:resultModel withJihuoniaoAdSiteId:model.jihuoniao_ad_site_id];
}
}
//信息流⼴告加载成功 返回View
- (void)JiHuoNiaoFeedAdHZDidLoadView:(NSArray *)feedDataArray
//信息流⼴告渲染成功
- (void)JiHuoNiaoFeedAdHZViewRenderSuccess;
//信息流⼴告曝光成功
- (void)JiHuoNiaoFeedAdHZViewExposure;
//信息流⼴告点击
- (void)JiHuoNiaoFeedAdHZDidClick;
//信息流⼴告关闭
- (void)JiHuoNiaoFeedAdHZDidClose:(id)feedAd;
//信息流视频⼴告错误
- (void)JiHuoNiaoFeedAdHZFailWithCode:(NSInteger)code TipStr:(NSString *)tipStr ErrorMessage:(NSString *)errorMessage;
banner广告
//拉取⼴告
self.JiHuoNiaoBannerADHZ = [[JiHuoNiaoBannerADHZ alloc]initWithJihuoniaoHZADSiteID: item.slotID];
self.JiHuoNiaoBannerADHZ.delegate = self;
//加载
[self.JiHuoNiaoBannerADHZ jiHuoNiaoHZOnlyLoad];
//banner代理回调
//banner⼴告加载成功
- (void)JiHuoNiaoBannerADHZLoadSuccess{
//需要贴到视图上面
[self.view addSubview:self.JiHuoNiaoBannerADHZ];
//显示
[self.JiHuoNiaoBannerADHZ jiHuoNiaoHZOnlyShow];
JiHuoNiaoServerBiddingResultModel * resultModel = [[JiHuoNiaoServerBiddingResultModel alloc]init];
resultModel.jihuoniaoWin = 0;
//竞价价格
resultModel.jihuoniaoWinEcpm = self.JiHuoNiaoBannerADHZ.jiHuoNiaoHZGetEcpmModel.ecpm;
resultModel.jihuoniaoAdnName = @"激活鸟";
resultModel.jihuoniaoAdTitle = @"banner";
resultModel.jihuoniaoAdRequestId = @"1";
//竞价成功或者失败回传
[self.JiHuoNiaoBannerADHZ jiHuoNiaoHZEcpmWinSucessOrFailed:resultModel];
}
//Banner⼴告曝光
- (void)JiHuoNiaoBannerADHZViewRenderSuccess;
//Banner⼴告点击
- (void)JiHuoNiaoBannerADHZDidClick;
//banner⼴告错误
- (void)JiHuoNiaoBannerADHZFailWithCode:(NSInteger)code TipStr:(NSString *)tipStr ErrorMessage:(NSString *)errorMessage;