美文网首页
2020-09-27

2020-09-27

作者: TooWalker | 来源:发表于2020-09-27 16:52 被阅读0次

    聚合广告 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];
    }
    }]; }
    
    1. 将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回调,但广告还是展示异 常,请录屏并反馈给技术支持人员。

    相关文章

      网友评论

          本文标题:2020-09-27

          本文链接:https://www.haomeiwen.com/subject/cpjluktx.html