聚合广告 iOS SDK接入文档 [TOC]
背景
开发环境
- 开发工具: Xcode 10及以上版本 - 部署目标: iOS 9.0及以上版本
术语
- PlacementId: 广告位id,为您的应用所创建的某种类型 (Banner、开屏、插屏、原生)的广告位置的ID
广告位申请 广告位的申请,需要跟商务人员沟通,线下发放
支持广告类型
|广告类型|简介|
|:----|:----:|:----:| |开屏广告|开屏广告以App启动作为曝光时机,提供5s的 可感知
广告展示| |原生模板|原生广告提供了更加灵活、多样化的广告样式选择| |自渲染|开发者可以自由拼合广告素材,包括广告标题、文字 描述和图片| |激励视频|将短视频融入到app场景当中。用户观看短视频广告 后可以得到一些应用内奖励|
聚合第三方平台
SDK为聚合SDK,所依赖的第三方库信息
|平台 | 版本 |
|------ | :----- |
|广点通 | 4.11.8 百度 | 4.70 穿山甲 | 3.1.0.6
SDK部署 ### 自动部署
自动部署可以省去您工程配置的时间。iOS SDK可以通过 CocoaPos进行本地集成。推荐您使用自动部署
1.安装CocoaPods CocoaPods是一个Swift和Objective-C项目的依赖管理器。它拥 有超过49,000个第三方库,超过3,000,000个app都在使用 cocoaPods做依赖管理,CocoaPods可以帮助你优雅的扩展你 的项目。 如果您未安装过cocoaPods,可以通过以下命令行 进行安装。更多详情请访问CocoaPods官 网
$ sudo gem install cocoapods ```
注意:安装过程可能会耗时比较长,也有可能收到网络状况导 致失败,请多次尝试直到安装成功。
#### 2.移动SDK文件
将AHSdSDK文件夹,放在工程的物理路径下
#### 3.配置Podfile文件
在您的工程文件所在文件夹下有一个名为Podfile的文件。如果
您第一次使用CocoaPods,可以在通过以下命令初始化一个
Podfile文件:
```#
$ pod init
打开Podfile文件,应该是如下内容(具体内容可能会有一些出 入):
# platform :ios, '9.0' target 'podTest' do
# use_frameworks!
# Pods for podTest end
修改Podfile文件,如下所示:
# platform :ios, '9.0' target 'podTest' do
# use_frameworks! #path所配置的路径是JHAdSDK文件夹相对于Podfile的路径,
#如果项目中没有集成广点通,百度,穿山甲,需要这样写
pod 'JHAd',:subspecs => ['Core','Ad/GDT','Ad/Baidu','Ad/TouTiao'],:path =>
'../JHAdSDK' #如果项目中有了广点通,百度,穿山甲,然后把JHAdSDK路径下的GDT文件夹删除
#pod 'JHAd',:subspecs => ['Core'],:path => '../JHAdSDK'
# Pods for podTest end
4.部署 ```#
$ pod install
命令执行成功后,会生成.xcworkspace文件,打
开.xcworkspace来启动工程
### 手动部署
#### 1.导入SDK
将AHSdSDK文件夹,拖入项目中,如图所示
[图片上传失败...(image-19ade9-1601197113981)] #### 2.添加第三方平台的依赖库
请参数第三方广告平台文档,添加依赖库,如果已经集成,略 过
需要依赖的第三方库如下
平台 | 版本 | ------ | :----- |
广点通 | 4.11.8 百度 | 4.70 穿山甲 | 3.1.0.6
#### 3.其他设置
在Target->Build Settings -> Other Linker Flags中添加-ObjC, 字母o和c大写。
### 其他配置
苹果公司在iOS9中升级了应用网络通信安全策略,默认推荐 开发者使用HTTPS协议来进行网络通信,并限制HTTP协议的
请求。为了避免出现无法拉取到广告的情况,我们推荐开发者 在info.plist文件中增加如下配置来实现广告的网络访问:(信 任HTTP请求)
[图片上传失败...(image-45b6ef-1601197113981)]
## 接入代码 ### 初始化
在调用sdk其他代码之前,一定要进行初始化,在appDelegate 头文中导入头文件
```#
#import <JHAd/JHAd.h>
在- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中 调用初始化代码
[JHAdApi initJHAd];
开屏广告 #### 简介
基本信息 开屏广告以App启动作为曝光时机,提供5s的可感知广告展示。 用户可以点击广告跳转到目标页面;或者点击右上角的“跳过” 按钮,跳转到app内容首页
适用场景 开屏广告会在您的应用开启时加载,拥有固定展示时间(一般
为5秒),展示完毕后自动关闭并进入您的应用主界面 分类
开屏广告分为半屏和全屏,其中半屏开屏广告支持开发者自定
义设置开屏底部的界面,用以展示应用Logo等。具体种类可 以在开发者平台进行选择
主要API 生命周期事件回调
您可以实现全部或部分JHSplashAdDelegate,以跟踪广告生命周 期事件
@protocol JHSplashAdDelegate <NSObject>
@optional /**
* 开屏广告成功展示 */
- (void)jh_splashAdSuccessPresentScreen:(JHSplashAd * __nullable)splashAd; /**
* 开屏广告素材加载成功 */
- (void)jh_splashAdDidLoad:(JHSplashAd * __nullable)splashAd; /**
* 开屏广告展示失败
*/
- (void)jh_splashAdFailToPresent:(JHSplashAd * __nullable)splashAd
withError:(NSError *)error; /**
* 应用进入后台时回调
* 详解: 当点击下载应用时会调用系统程序打开,应用切换到后台
*/
- (void)jh_splashAdApplicationWillEnterBackground:(JHSplashAd * __nullable)splashAd;
/**
* 开屏广告曝光回调
*/
- (void)jh_splashAdExposured:(JHSplashAd * __nullable)splashAd;
/**
* 开屏广告点击回调
*/
- (void)jh_splashAdClicked:(JHSplashAd * __nullable)splashAd;
/**
* 开屏广告将要关闭回调
*/
- (void)jh_splashAdWillClosed:(JHSplashAd * __nullable)splashAd;
/**
* 开屏广告关闭回调
*/
- (void)jh_splashAdClosed:(JHSplashAd * __nullable)splashAd;
/**
* 开屏广告点击以后即将弹出全屏广告页
*/
- (void)jh_splashAdWillPresentFullScreenModal:(JHSplashAd * __nullable)splashAd;
/**
* 开屏广告点击以后弹出全屏广告页
*/
- (void)jh_splashAdDidPresentFullScreenModal:(JHSplashAd * __nullable)splashAd;
/**
* 点击以后全屏广告页将要关闭
*/
- (void)jh_splashAdWillDismissFullScreenModal:(JHSplashAd * __nullable)splashAd;
/**
* 点击以后全屏广告页已经关闭
*/
- (void)jh_splashAdDidDismissFullScreenModal:(JHSplashAd * __nullable)splashAd;
/**
* 开屏广告剩余时间回调
*/
- (void)jh_splashAdLifeTime:(NSUInteger)time splashAd:(JHSplashAd *__nullable)splashAd;
@end
在实现上述事件回调之前,请务必先设置delegate
self.splashAd.delegate = self; ```
**回调函数列表**
回调函数名 | 回调函数含义 | ------ | :----- |
jh_splashAdSuccessPresentScreen | 开屏广告成功展示 | jh_splashAdDidLoad | 开屏广告素材加载成功 | jh_splashAdFailToPresent | 开屏广告展示失败 | jh_splashAdApplicationWillEnterBackground | 应用进入后台时回
调|
jh_splashAdExposured | 开屏广告曝光回调 | jh_splashAdClicked | 开屏广告点击回调 | jh_splashAdWillClosed | 开屏广告将要关闭回调 | jh_splashAdClosed | 开屏广告关闭回调| jh_splashAdWillPresentFullScreenModal | 将弹出全屏广告页 | jh_splashAdDidPresentFullScreenModal | 出全屏广告页 | jh_splashAdWillDismissFullScreenModal | 将要关闭 | jh_splashAdDidDismissFullScreenModal | 已经关闭 |
jh_splashAdLifeTime | 开屏广告剩余时间回调|
#### 接入代码示例
**加载并展示开屏广告** 1.在AppDelegate头文件中导入头文件并声明实例
```#
#import <JHAd/JHAd.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate,JHSplashAdDelegate> @property (nonatomic, strong) UIWindow *window; @property (nonatomic, strong) JHSplashAd *splashAd;
开屏广告点击以后即
开屏广告点击以后弹
点击以后全屏广告页
点击以后全屏广告页
@end
2.在AppDelegate的实现文件中初始化并加载广告数据,开屏广 告目前支持全屏开屏和半屏开屏广告两种形式,其中半屏开屏 广告支持开发者自定义设置开屏底部的界面,用以展示应用
Logo等
self.splashAd = [JHSplashAdFactory
createSplashAdWithPlacementId:@"W1000083"]; self.splashAd.delegate = self;
self.splashAd.fetchDelay = 5;
UIImage *splashImage = [UIImage imageNamed:@"plus"]; self.splashAd.backgroundImage = splashImage; self.splashAd.backgroundImage.accessibilityIdentifier = @"splash_ad";
UIView *bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0,
self.window.frame.size.width, self.window.frame.size.height * 0.25)];
bottomView.backgroundColor = [UIColor whiteColor];
UILabel *bottomLabel = [[UILabel alloc] initWithFrame:bottomView.bounds]; bottomLabel.text = @"底部视图可以定制";
bottomLabel.textAlignment = NSTextAlignmentCenter; bottomLabel.font = [UIFont systemFontOfSize:25]; [bottomView addSubview:bottomLabel];
[self.splashAd loadAdAndShowInWindow:self.window withBottomView:bottomView];
3.PlacementId 要换成自己的id >说明:
目前开屏广告只针对iPhone设备在垂直方向上展示。 广告发起请求并展示在Window中,同时在屏幕底部设置应用 自身的Logo页面或是自定义View,Logo页面或是自定义View 所占的空间不能过大,高度不能超过屏幕高度的 25%。
开屏广告拉取超时时间 您可以设置拉取广告的超时时间,默认为3秒。通常情况,开
发者调用loadAd后会展示backgroundColor,如果在该时间内广 告拉取成功,则显示开屏广告;否则放弃本次广告展示。
在不展示开屏广告时执行调试 在您的工程里实现如下回调,处理开屏广告加载失败的问题:
- (void)jh_splashAdFailToPresent:(JHSplashAd * __nullable)splashAd
withError:(NSError *)error {
NSLog(@"----->%s",__func__); }
说明: 开屏广告只支持竖屏使用 ### 原生模板广告
简介 基本信息
原生模板广告是聚合SDK推出的一种自动化展现的原生广告, 图文广告零门槛不需要申请权限就可以使用,视频广告需要申 请对应的权限。开通对应的权限后,在新建广告位时支持只出 图文广告或只出视频广告,也支持图文和视频广告混出。但为 了保证广告位的填充率,当您有接入视频广告需求的时候,建 议尽量选择图文和视频广告混出
适用场景 如果我们提供的模板广告样式符合您的需求,建议直接使用该 接口
分类 样式 | 尺寸|
------ |
---|
1280x720 |
上图下文 上文下图 左图右文 左文右图 双图双文
纯图片 | 800x1200| 纯图片 | 1280x720|
主要API 生命周期事件回调
您可以实现全部或部分JHNativeExpressAdDelegate,以跟踪点 击成功或者插屏广告请求失败等广告生命周期事件。
| 1280x720| | 1200x800| | 1200x800| | 1280x720|
@protocol JHNativeExpressAdDelegete <NSObject>
@optional
- (void)jh_nativeExpressAdSuccessToLoad:views;
- (void)jh_nativeExpressAdFailToLoad: error;
- (void)jh_nativeExpressAdViewRenderSuccess;
- (void)jh_nativeExpressAdViewRenderFail;
- (void)jh_nativeExpressAdViewExposure;
- (void)jh_nativeExpressAdViewClicked;
- (void)jh_nativeExpressAdViewClosed;
- (void)jh_nativeExpressAdViewWillPresentScreen;
- (void)jh_nativeExpressAdViewDidPresentScreen;
- (void)jh_nativeExpressAdViewWillDissmissScreen;
- (void)jh_nativeExpressAdViewDidDissmissScreen;
- (void)jh_nativeExpressAdViewApplicationWillEnterBackground; - (void)jh_nativeExpressAdView:playerStatusChanged;
- (void)jh_nativeExpressAdViewWillPresentVideoVC;
- (void)jh_nativeExpressAdViewDidPresentVideoVC;
- (void)jh_nativeExpressAdViewWillDismissVideoVC;
- (void)jh_nativeExpressAdViewDidDismissVideoVC;
@end
在实现上述事件回调之前,请务必先设置delegate:
self.nativeExpressAd.delegate = self; ```
**回调函数列表** 回调函数名 | 回调函数含义 |
------ | :----- |
jh_nativeExpressAdSuccessToLoad:views | 拉取原生模板广告
成功 |
jh_nativeExpressAdFailToLoad:error | 拉取原生模板广告失败 | jh_nativeExpressAdViewRenderSuccess | 原生模板广告渲染成 功|
jh_nativeExpressAdViewRenderFail | 原生模板广告渲染失败 | jh_nativeExpressAdViewExposure | 原生模板广告曝光回调 | jh_nativeExpressAdViewClicked |原生模板广告点击回调 | jh_nativeExpressAdViewClosed | 原生模板广告被关闭| jh_nativeExpressAdViewWillPresentScreen | 即将弹出全屏广告 页|
jh_nativeExpressAdViewWillDissmissScreen| 全屏广告页将要关 闭|
jh_nativeExpressAdViewDidDissmissScreen | 全屏广告页已经关 闭|
jh_nativeExpressAdViewApplicationWillEnterBackground| 进入后 台时调用|
jh_nativeExpressAdView:playerStatusChanged | 原生模板视频 广告 player 播放状态更新回调| jh_nativeExpressAdViewWillPresentVideoVC | 原生视频模板详 情页将要展示 |
jh_nativeExpressAdViewDidPresentVideoVC | 原生视频模板详 情页已经展示 |
jh_nativeExpressAdViewWillDismissVideoVC | 原生视频模板详 情页将要消失|
jh_nativeExpressAdViewDidDismissVideoVC | 原生视频模板详 情页已经消失 |
其中,视频播放过程中,会有如下几种状态
枚举变量 | 枚举含义 | ------ | :----- | ------:
JHMediaPlayerStatusInitial | 初始状态 | JHMediaPlayerStatusLoading | 加载中 | JHMediaPlayerStatusStarted | 开始播放 | JHMediaPlayerStatusPaused | 用户行为导致暂停 | JHMediaPlayerStatusStoped | 播放停止 | JHMediaPlayerStatusError | 播放出错 |
#### 接入代码示例 1.在您的试图控制器中导入头文件,声明您会实现
JHNativeExpressAdDelegate协议: ```#
#import <JHAd/JHAd.h>
@interface NativeExpressAdViewController ()<UITableViewDelegate,UITableViewDataSource,JHNativeExpressAdDelegete>
@property (nonatomic, strong) NSMutableArray *expressAdViews; @property (nonatomic, strong) JHNativeExpressAd *nativeExpressAd; @property (nonatomic, weak) UITableView *listView;
2.在需要加载广告的地方,加载广告
createNativeExpressAdWithPlacementId:nativePlacementId adSize:CGSizeMake(self.widthSlider.value, self.heightSlider.value) listView:self.listView curVC:self result:^(JHNativeExpressAd * _Nullable nativeExpressAd, NSError * _Nullable error) {
if (error) {
NSLog(@"error message = %@",error.localizedDescription);
}else{
self.nativeExpressAd = nativeExpressAd; self.nativeExpressAd.delegate = self; [self.nativeExpressAd loadAd:self.countSlider.value];
} }];
3.将nativePlacementId 替换成你自己的广告位Id 4.实现获取广告成功的回调,在回调里做数据处理,并且为原 生模板广告的展现做准备。这里以展示在TableView中为例。
- (void)jh_nativeExpressAdSuccessToLoad:(JHNativeExpressAd *)nativeExpressAd
views:(NSArray<__kindof JHNativeExpressAdView *> *)views {
NSLog(@"%s",__FUNCTION__);
self.expressAdViews = [NSMutableArray arrayWithArray:views]; if (self.expressAdViews.count) {
[self.expressAdViews enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
*)obj;
JHNativeExpressAdView *expressView = (JHNativeExpressAdView
[expressView render];
NSLog(@"eCPM:%zd eCPMLevel:%@", [expressView eCPM], [expressView eCPMLevel]);
}]; }
[self.listView reloadData]; }
5.在您要展示的视图中对获得的原生模板广告进行展示。这里 以展示在TableView中为例。这里推荐开发者使用SDK给出的
推荐尺寸。完整参考代码如下:
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"indexPath->row = %zd",indexPath.row); if (indexPath.row % 2 == 0) {
UIView *view = [self.expressAdViews objectAtIndex:indexPath.row / 2];
return ((JHNativeExpressAdView *)view).showFrame.size.height; }
else {
return 44;
} }
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = nil;
if (indexPath.row % 2 == 0) {
cell = [tableView dequeueReusableCellWithIdentifier:@"nativeexpresscell" forIndexPath:indexPath];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UIView *subView = (UIView *)[cell.contentView viewWithTag:1000]; if ([subView superview]) {
[subView removeFromSuperview]; }
UIView *view = [self.expressAdViews objectAtIndex:indexPath.row / 2]; view.tag = 1000;
[cell.contentView addSubview:view];
cell.accessibilityIdentifier = @"nativeTemp_ad";
} else {
cell = [tableView
dequeueReusableCellWithIdentifier:@"splitnativeexpresscell" forIndexPath:indexPath];
cell.backgroundColor = [UIColor grayColor]; }
return cell; }
在不展示原生模板广告时执行调试 ```#
/**
- 拉取广告失败的回调
*/
- (void)jh_nativeExpressAdRenderFail:(JHNativeExpressAdView )nativeExpressAdView
{
NSLog(@"%s",FUNCTION); }
/*
- 拉取原生模板广告失败
*/
- (void)jh_nativeExpressAdFailToLoad:(JHNativeExpressAd *)nativeExpressAd error:(NSError *)error
{
NSLog(@"%s",FUNCTION);
NSLog(@"Express Ad Load Fail : %@",error); }
### 自渲染 #### 简介
**基本信息** 使用自渲染广告可以为您的应用打造定制式的体验。
**适用场景** 如果我们提供的模板广告样式符合您的需求,建议直接使用该 接口
**示例** 在使用自渲染2.0的API时,您会收到一组相关属性(图标、图
片、广告标题、广告描述、是否包含视频等)。一条典型的广 告包含如下字段,如有需要您可以创建以下字段相关视图:
广告App图标
广告媒体图(URL)
广告标题
广告描述 除此之外,开发者还可以拿到应用类广告的星级、应用类广告 的价格、以及三小图广告的图片集合。
#### 主要API **JHUnifiedNativeAd 事件回调**
```# /**
广告数据回调
@param unifiedNativeAdDataObjects 广告数据数组
@param error 错误信息
*/
- (void)jh_unifiedNativeAdLoaded:(NSArray<JHUnifiedNativeAdDataObject *> * _Nullable)unifiedNativeAdDataObjects unifiedNativeAd:(JHUnifiedNativeAd *)unifiedNativeAd error:(NSError * _Nullable)error;
JHUnifiedNativeAdViewDelegate ```#
/**
广告曝光回调
@param unifiedNativeAdView JHUnifiedNativeAdView 实例
*/
- (void)jh_unifiedNativeAdViewWillExpose:(JHUnifiedNativeAdView )unifiedNativeAdView;
/*
广告点击回调
@param unifiedNativeAdView JHUnifiedNativeAdView 实例
*/ - (void)jh_unifiedNativeAdViewDidClick:(JHUnifiedNativeAdView )unifiedNativeAdView;
/*
广告详情页关闭回调
@param unifiedNativeAdView JHUnifiedNativeAdView 实例
*/ - (void)jh_unifiedNativeAdDetailViewClosed:(JHUnifiedNativeAdView )unifiedNativeAdView;
/*
当点击应用下载或者广告调用系统程序打开时调用
@param unifiedNativeAdView JHUnifiedNativeAdView 实例
/ -
(void)jh_unifiedNativeAdViewApplicationWillEnterBackground:(JHUnifiedNativeA dView )unifiedNativeAdView;
/
广告详情页面即将展示回调
@param unifiedNativeAdView JHUnifiedNativeAdView 实例
*/ - (void)jh_unifiedNativeAdDetailViewWillPresentScreen:(JHUnifiedNativeAdView )unifiedNativeAdView;
/*
视频广告播放状态更改回调
@param unifiedNativeAdView 实例 @param status 视频广告播放状态 @param userInfo 视频广告信息
*/ - (void)jh_unifiedNativeAdView:(JHUnifiedNativeAdView *)unifiedNativeAdView playerStatusChanged:(JHMediaPlayerStatus)status userInfo:(NSDictionary *)userInfo;
**JHMediaViewDelegate** ```#
/**
用户点击 MediaView 回调,当 JHVideoConfig userControlEnable 设为 YES,
用户点击 mediaView 会回调。 @param mediaView 播放器实例
*/
- (void)jh_mediaViewDidTapped:(JHMediaView *)mediaView;
/**
播放完成回调
@param mediaView 播放器实例 */
- (void)jh_mediaViewDidPlayFinished:(JHMediaView *)mediaView;
在实现上述事件回调之前,请务必先设置delegate:
self.unifiedNativeAd.delegate = self;//设置JHUnifiedNativeAd的代理 unifiedNativeAdView.delegate = self;//设置JHUnifiedNativeAdView的代理 unifiedNativeAdView.mediaView.delegate = self;//设置JHMediaView的代理
营销组件能力 接入营销组件能力分2步:
step1:判断广告是否支持营销组件能力
可通过JHUnifiedNativeAdDataObject的callToAction属性来判断 广告是否支持营销组件能力,返回为空值时表示该广告不支持 营销组件能力,返回非空时,表示广告拥有营销组件能力,返
回值代表SDK推荐开发者使用的文案,如“立即预约”、“电话 咨询”等。
@interface JHUnifiedNativeAdDataObject : NSObject
@property (nonatomic, readonly) NSString *callToAction; @end
step2:接入营销组件能力
在 step1中若广告支持营销组件能力,则调用
JHUnifiedNativeAdView的registerClickableCallToActionView方 法注册点击事件,当发生点击行为时,系统会弹出营销组件页 面,接口如下
注册可点击的callToAction视图的方法
建议开发者使用JHUnifiedNativeAdDataObject中的callToAction字段来创建视 图,并取代自定义的下载或打开等button,
调用此方法之前必须先调用registerDataObject:clickableViews @param callToActionView CTA视图, 系统自动处理点击事件
*/
- (void)registerClickableCallToActionView:(UIView *)callToActionView;
示例代码
文案
if ([unifiedNativeDataObject.callToAction length] > 0) { [self.clickButton setHidden:YES];
[self.CTAButton setHidden:NO];
[self.CTAButton setTitle:unifiedNativeDataObject.callToAction
forState:UIControlStateNormal]; }
//step2:注册点击事件
if ([[dataObject callToAction] length] > 0) {
[self.adView registerClickableCallToActionView:self.adView.CTAButton];
}
####接入代码示例
1.在控制器头文件中加入SDK头文件,声明unifiedNativeAd变 量
#import <JHAd/JHAd.h>
@interface UnifiedNativeAdFeedImageViewController ()<JHUnifiedNativeAdDelegate,JHUnifiedNativeAdViewDelegate,UITableViewDele gate,UITableViewDataSource>
@property (nonatomic, strong) JHUnifiedNativeAd *unifiedNativeAd;
@property (nonatomic, weak) UITableView *listView; @property (nonatomic, strong) NSArray *listArray;
2.在ViewController的实现文件中初始化并加载广告数据:
createUnifiedNativeAdWithPlacementId:unifiedNativePlacementId result:^(JHUnifiedNativeAd * _Nullable unifiedNativeAd, NSError * _Nullable error) {
if (error) {
NSLog(@"error = %@",error.localizedDescription);
}else{
self.unifiedNativeAd = unifiedNativeAd; self.unifiedNativeAd.delegate = self; [self.unifiedNativeAd loadAdWithAdCount:10];
} }];
3.将unifiedNativePlacementId 换成自己的广告位Id
4.需要在广告内容准备就绪的时候展示广告。开发者需要在拿 到数据的回调方法,即jh_unifiedNativeAdLoaded:error里处理数
据并做广告展示:
- (void)jh_unifiedNativeAdLoaded:(NSArray<JHUnifiedNativeAdDataObject *>
*)unifiedNativeAdDataObjects unifiedNativeAd:(JHUnifiedNativeAd *)unifiedNativeAd error:(NSError *)error
{
self.listArray = unifiedNativeAdDataObjects; [self.listView reloadData];
NSLog(@"");
}
- (void)setupWithUnifiedNativeAdDataObject:(JHUnifiedNativeAdDataObject *)dataObject listView:(UIView *)listView delegate:(id<JHUnifiedNativeAdViewDelegate>)delegate vc:(UIViewController *)vc
{
CGFloat imageRate = 16 / 9;
if (dataObject.imageHeight > 0) {
imageRate = dataObject.imageWidth / (CGFloat)dataObject.imageHeight;
}
CGFloat width = [UIScreen mainScreen].bounds.size.width - 16;
self.iconImageView.frame = CGRectMake(8, 8, 60, 60); self.clickButton.frame = CGRectMake(width - 68, 8, 60, 44); self.CTAButton.frame = CGRectMake(width - 100, 8, 100, 44); self.titleLabel.frame = CGRectMake(76, 8, 250, 30); self.descLabel.frame = CGRectMake(8, 76, width, 30); CGFloat imageWidth = width;
self.imageBacView.frame = CGRectMake(8, 114, imageWidth, imageWidth / imageRate);
self.customView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 122 + imageWidth / imageRate);
if (!self.adView) {
JHUnifiedNativeAdView *adView = [JHUnifiedNativeAdFactory
bindUnifiedNativeAdView:self.customView listView:listView curVC:vc delegate:delegate];
self.adView = adView;
[self.contentView addSubview:self.adView]; self.adView.backgroundColor = [UIColor grayColor];
}
self.adView.logoView.frame = CGRectMake(CGRectGetWidth(self.adView.frame) - kJHLogoImageViewDefaultWidth, CGRectGetHeight(self.adView.frame) - kJHLogoImageViewDefaultHeight, kJHLogoImageViewDefaultWidth, kJHLogoImageViewDefaultHeight);
[self.adView registerDataObject:dataObject];
if ([[dataObject callToAction] length] > 0) {
[self.adView registerClickableCallToActionView:self.CTAButton];
} }
在不展示自渲染广告时执行调试 ```#
/**
- 拉取广告的回调,包含成功和失败情况
*/
pragma mark - JHUnifiedNativeAdDelegate
- (void)gdt_unifiedNativeAdLoaded:(NSArray<JHUnifiedNativeAdDataObject *> *)unifiedNativeAdDataObjects error:(NSError *)error
{
if (error.code == 5004) { NSLog(@"没匹配的广告,禁止重试,否则影响流量变现效果");
} else if (error.code == 5005) { NSLog(@"流量控制导致没有广告,超过日限额,请明天再尝试");
} else if (error.code == 5009) { NSLog(@"流量控制导致没有广告,超过小时限额");
} else if (error.code == 5006) { NSLog(@"包名错误");
} else if (error.code == 5010) { NSLog(@"广告样式校验失败");
} else if (error.code == 3001) { NSLog(@"网络错误");
} else {
NSLog(@"ERROR: %@", error);
} }
如果需要关注视频播放出错的情况,开发者需要实现 jh_unifiedNativeAdView:playerStatusChanged:userInfo回调方 法,并在里面对Error的情况做相应观察与处理:
```# /**
视频广告播放状态更改回调
@param unifiedNativeAdView 实例 @param status 视频广告播放状态 @param userInfo 视频广告信息
*/
- (void)jh_unifiedNativeAdView:(JHUnifiedNativeAdView *)unifiedNativeAdView playerStatusChanged:(JHMediaPlayerStatus)status userInfo:(NSDictionary *)userInfo
{
NSLog(@""); NSLog(@"视频广告状态变更");
switch (status) {
case JHMediaPlayerStatusError:
NSLog(@"视频播放出错"); //开发者可以在这里添加逻辑
default: break;
} }
说明:
1.register方法中,只接受在容器可视范围内的元素的点击(有 效点击),如果不在容器内可见,也不会响应广告的点击事 件;
2.自渲染 不需要再自行创建 JHLogoView 和 JHMediaView, 调用 register 方法后自动生成,可通过容器 View 获取 mediaView 调整布局,支持 AutoLayout。 3.LogoView不需要添加到任何View中,系统默认会生成一个 logoView。如果想要自定义,只需要赋值给 JHUnifiedNativeAdView的logoView属性即可。
激励视频广告 #### 简介
基本信息 激励视频广告是一种常见于游戏内的广告样式。用户通过开发 者提供的入口,全屏观看完整视频,获得相应的奖励。
分类 目前的视频包括横版及竖版2种样式,您可以根据需要创建对
应的广告位
主要API 激励视频广告生命周期事件回调
您可以实现全部或部分JHRewardedVideoAdDelegate,以跟踪 点击成功或者激励视频广告请求失败等广告生命周期事件。
@protocol JHRewardedVideoAdDelegate <NSObject>
@optional /**
广告数据加载成功回调
@param rewardedVideoAd JHRewardVideoAd 实例
*/
- (void)jh_rewardVideoAdDidLoad:(JHRewardVideoAd *)rewardedVideoAd;
/**
视频数据下载成功回调,已经下载过的视频会直接回调 @param rewardedVideoAd JHRewardVideoAd 实例
*/
- (void)jh_rewardVideoAdVideoDidLoad:(JHRewardVideoAd *)rewardedVideoAd;
/**
视频播放页即将展示回调
@param rewardedVideoAd JHRewardVideoAd 实例
*/
- (void)jh_rewardVideoAdWillVisible:(JHRewardVideoAd *)rewardedVideoAd;
/**
视频广告曝光回调
@param rewardedVideoAd JHRewardVideoAd 实例 */
- (void)jh_rewardVideoAdDidExposed:(JHRewardVideoAd *)rewardedVideoAd; /**
视频播放页关闭回调
@param rewardedVideoAd JHRewardVideoAd 实例
*/
- (void)jh_rewardVideoAdDidClose:(JHRewardVideoAd *)rewardedVideoAd;
/**
视频广告信息点击回调
@param rewardedVideoAd JHRewardVideoAd 实例
*/
- (void)jh_rewardVideoAdDidClicked:(JHRewardVideoAd *)rewardedVideoAd;
/**
视频广告各种错误信息回调
@param rewardedVideoAd JHRewardVideoAd 实例
@param error 具体错误信息
*/
- (void)jh_rewardVideoAd:(JHRewardVideoAd *)rewardedVideoAd didFailWithError:(NSError *)error;
/**
视频广告播放达到激励条件回调
@param rewardedVideoAd JHRewardVideoAd 实例
*/
- (void)jh_rewardVideoAdDidRewardEffective:(JHRewardVideoAd *)rewardedVideoAd;
/**
视频广告视频播放完成
@param rewardedVideoAd JHRewardVideoAd 实例 */
- (void)jh_rewardVideoAdDidPlayFinish:(JHRewardVideoAd *)rewardedVideoAd; @end
在实现上述事件回调之前,请务必先设置delegate:
self.rewardVideoAd.delegate = self; ```
**回调函数列表**
回调函数名 | 回调函数含义 | ------ | :----- |
jh_rewardVideoAdDidLoad| 激励视频广告加载广告数据成功回 调|
jh_rewardVideoAdVideoDidLoad| 激励视频数据下载成功回调 | jh_rewardVideoAdWillVisible| 激励视频播放页即将展示回调 | jh_rewardVideoAdDidExposed| 激励视频广告曝光回调 | jh_rewardVideoAdDidClose| 激励视频广告播放页关闭回调 | jh_rewardVideoAdDidClicked| 激励视频广告信息点击回调 | jh_rewardVideoAd:didFailWithError| 激励视频广告各种错误信息 回调 |
jh_rewardVideoAdDidRewardEffective| 激励视频广告播放达到 激励条件回调 |
jh_rewardVideoAdDidPlayFinish| 激励视频广告播放完成回调 |
#### 接入代码示例 **加载并显示激励广告**
1.在控制器头文件中加入SDK头文件,声明rewardVideoAd属性 ```#
#import <JHAd/JHAd.h>
@interface RewardVideoAdViewController ()<JHRewardedVideoAdDelegate>
@property (nonatomic, weak) UIButton *loadBtn;
@property (nonatomic, strong) JHRewardVideoAd *rewardVideoAd; @property (nonatomic, weak) UILabel *statusLabel;
@end
2.加载广告
- (void)loadBtnClick {
[JHRewardVideoAdFactory createRewardVideoAdWithPlacementId:rewardVideoPlacementId result:^(JHRewardVideoAd * _Nullable rewardVideoAd, NSError * _Nullable error) {
if (error) {
NSLog(@"error = %@",error);
}else{
self.rewardVideoAd = rewardVideoAd; self.rewardVideoAd.delegate = self; [self.rewardVideoAd loadAd];
}
}]; }
- 将rewardVideoPlacementId 换成自己的广告位id 在不展示激励视频广告时执行调试
在您的ViewController里实现如下回调,处理激励视频广告加 载失败的问题:
@param rewardedVideoAd JHRewardVideoAd 实例 @param error 具体错误信息
*/
- (void)jh_rewardVideoAd:(JHRewardVideoAd *)rewardedVideoAd didFailWithError:(NSError *)error
{
NSLog(@"%s",__FUNCTION__); if (error.code == 4014) {
NSLog(@"请拉取到广告后再调用展示接口"); self.statusLabel.text = @"请拉取到广告后再调用展示接口";
} else if (error.code == 4016) { NSLog(@"应用方向与广告位支持方向不一致");
self.statusLabel.text = @"应用方向与广告位支持方向不一致"; } else if (error.code == 5012) {
NSLog(@"广告已过期"); self.statusLabel.text = @"广告已过期";
} else if (error.code == 4015) { NSLog(@"广告已经播放过,请重新拉取");
self.statusLabel.text = @"广告已经播放过,请重新拉取"; } else if (error.code == 5002) {
NSLog(@"视频下载失败"); self.statusLabel.text = @"视频下载失败";
} else if (error.code == 5003) { NSLog(@"视频播放失败");
self.statusLabel.text = @"视频播放失败"; } else if (error.code == 5004) {
NSLog(@"没有合适的广告"); self.statusLabel.text = @"没有合适的广告";
} else if (error.code == 5013) { NSLog(@"请求太频繁,请稍后再试");
self.statusLabel.text = @"请求太频繁,请稍后再试"; } else if (error.code == 3002) {
NSLog(@"网络连接超时"); self.statusLabel.text = @"网络连接超时";
}
NSLog(@"ERROR: %@", error); }
说明:
建议在释放激励视频广告 JHRewardVideoAd 对象之前将
JHRewardVideoAd 对象的 delegate 属性设置为nil. 当用户点击广告弹出内置目标页时,请勿释放
JHRewardVideoAd 实例。
广告从拉取成功会提供 expiredTimestamp 属性表示广告的超 时时间,展示广告之前请做广告的有效性检查,广告如果失效 请提前重新拉取,否则将作无法展示广告。 激励视频问题排查流程:
首先确认是否已拉取到广告,即是否有收到 jh_rewardVideoAdDidLoad回调,若未收到,请根据
jh_rewardVideoAd:didFailWithError中的error.code查询失败原 因;
若拉取广告成功,但展示广告失败,请根据
jh_rewardVideoAd:didFailWithError中的error查询失败原因,并 检查代码确认是否在jh_rewardVideoAdVideoDidLoad回调后调 用的showAdFromRootViewController方法;
若拉取广告成功,且在jh_rewardVideoAdVideoDidLoad回调后 调用的showAdFromRootViewController方法,也未收到
jh_rewardVideoAd:didFailWithError回调,但广告还是展示异 常,请录屏并反馈给技术支持人员。
网友评论