iOS视频广告(二) GoogleAds-IMA-iOS-SDK

iOS视频广告(二) GoogleAds-IMA-iOS-SDK

(GoogleAds-IMA-iOS-SDK 二次封装)

开发
  1. 开发环境: Xcode 7
  2. 运行条件: iOS(9.0+)
  3. 管理平台: admanger帐号。 https://admanager.google.com
  4. 官网文档地址:
    https://developers.google.com/interactive-media-ads/docs/sdks/ios/

 

注意:
  • 管理平台,官网文档都需要vpn才能浏览.
  • GoogleAds-IMA-iOS-SDK只提供了视频广告功能, 如果要实现横幅广告/插页式广告/原生广告/激励广告可以使用Google-Mobile-Ads-SDK, 后边的文章会介绍
  • 开源框架:github地址
  • 谷歌视频广告SDK介绍: iOS视频广告(一) GoogleAds-IMA-iOS-SDK

 

(如果使用有什么问题,可以给我留言,欢迎一起学习,欢迎github-star, 点赞)


为什么要封装SDK:
  • 虽说可以直接使用谷歌的SDK写进项目中, 但是实现起来还是小复杂, 需要踩的坑还是有点多. (比如调用顺序变换可能会导致广告播不出来)
  • 提供给开发者加载广告接口不止一个,没接触过谷歌SDK, 挨个看,测试浪费精力。
  • 使用起来代码看起来会有些乱, 耦合性高, 不方便后期的维护, 而且需要处理的代理回调方法稍微有些小麻烦。

 

不多说废话, 直接给大家讲讲 JXVideoAds 如何使用, 帮助大家快速用起来。


JXVideoAds介绍

 

JXVideoAds是一个对谷歌视频广告SDK进行二次封装的框架, JXVideoAds主要提供了两个类控制广告的生命周期,任选一个使用即可:

(1)、 JXAVideoOperator - 基于NSObjct, 用于加载广告,类似于manager。
  • 必须传入一个(UIView)container - 作为广告播放的容器视图。
  • 必须传入(StateBlock)state - 广告加载和调用状态的回调。
  • 必须传入(NSString)tagUrl - 广告Url。
  • 可选:(ProgressBlock)progress - 加载进度回调。
  • 可选:(AVPlayer)player - 播放器, JXVideoOperator可以根据传入的player返回给你广告播放进度。
  • 可选:userContext:- 广告加载器标识。
  • 可选:(ParamsBlock)params - 自定义参数构建Block。

 

(2)、JXAVideoView - 基于UIView,作为广告播放的容器视图,也是广告的管理者。(推荐使用这个类,使用起来更简易,内部自己封装好了AVPlayer,无需传入)
  • 必须传入(StateBlock)state - 广告加载和调用状态的回调。
  • 必须传入(NSString)tagUrl - 广告Url。
  • 可选:(ProgressBlock)progress - 加载进度回调。
  • 可选:userContext:- 广告加载器标识。
  • 可选:(ParamsBlock)params - 自定义参数构建Block。

 

(另外JXAVideoParamsBuilder - 一个参数构建者,内部封装了一些常用的个性化参数,点语法依次自定义参数,开发者可以挑选使用。)

Installation [安装]

安装,只需将以下面代码添加到您的Podfile:


platform :ios, '9.0'

target 'TargetName' do
pod 'JXVideoAds'
end


注意 !!!  :
* OC - 终端安装命令正常输入: pod install
* Swift - 终端安装命令: IS_FRAMEWORK=1 pod install

因为Swift必须使用framework(use_frameworks!), 所以安装不了objc源码,只能打包安装.


Frame set [框架集合]

  • API 外部应该访问的接口
  • Common SDK内部公共类
  • GoogleIma 谷歌广告API

The UI effect:

 

  • Breakpoint Play


    breakpoint_play.gif

 

  • Fullscreen


    fullscreen.gif

SDK例子:

 

[JXAVideoView 使用] :

 

Example 1

 


// import
#import "JXAVideoView.h"

// 加载广告

- (IBAction)params:(id)sender {
    [self.containerView params:^JXAVideoParamsBuilder *(JXAVideoParamsBuilder *paramsBuilder) {
        return  paramsBuilder
        .autoPlayAdBreaks(YES)
        .adTagUrl(tag);
    } state:^(JXAVideoAdsState state, JXAVideoAds *video) {
        switch (state) {
                
            case JXAVideoAdsState_Loaded:
                NSLog(@"已经加载完毕 - JXAVideoAdsState_Loaded");
//                [video play];
                break;
                
            case JXAVideoAdsState_Started:
                NSLog(@"已经开始播放广告 - JXAVideoAdsState_Started");
                break;
            case JXAVideoAdsState_Error:
                NSLog(@"加载错误 - JXAVideoAdsState_Error");
                break;
            case JXAVideoAdsState_Pause:
                NSLog(@"广告暂停 - JXAVideoAdsState_Pause");
                break;
            case JXAVideoAdsState_Ended:
                NSLog(@"广告播放结束 - JXAVideoAdsState_Ended");
                break;
            case JXAVideoAdsState_Skipped:
                NSLog(@"广告已经跳过 - JXAVideoAdsState_Skipped");
                break;
                
            default:
                break;
        }
    }];
}

// 不使用时,最好销毁。
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    [self.containerView remove];
}


Example 2

 


// import
#import "JXAVideoView.h"

- (IBAction)paramsP:(id)sender {
    
    [self.containerView params:^JXAVideoParamsBuilder *(JXAVideoParamsBuilder *paramsBuilder) {
        return  paramsBuilder
        .autoPlayAdBreaks(YES)
        .language(@"en")
        .enableBackgroundPlayback(YES)
        .volume(@1)
        .adTagUrl(tagOne)
        .userContext(nil)
        .player(nil)
        .mimeTypes(@[ @"video/mp4", @"application/x-mpegURL"])
        .bitrate(1024)
        .webOpenerPresentingController([JXViewController new])
        .webOpenerDelegate(self);
    } state:^(JXAVideoAdsState state, JXAVideoAds *video) {
        switch (state) {
                
            case JXAVideoAdsState_Loaded:
                NSLog(@"已经加载完毕 - JXAVideoAdsState_Loaded");
                                [video play];
                break;
                
            case JXAVideoAdsState_Started:
                NSLog(@"已经开始播放广告 - JXAVideoAdsState_Started");
                break;
            case JXAVideoAdsState_Error:
                NSLog(@"加载错误 - JXAVideoAdsState_Error");
                break;
            case JXAVideoAdsState_Pause:
                NSLog(@"广告暂停 - JXAVideoAdsState_Pause");
                break;
            case JXAVideoAdsState_Ended:
                NSLog(@"广告播放结束 - JXAVideoAdsState_Ended");
                break;
            case JXAVideoAdsState_Skipped:
                NSLog(@"广告已经跳过 - JXAVideoAdsState_Skipped");
                break;
                
            default:
                break;
        }
    } progress:^(CGFloat current, CGFloat duration) {
        NSLog(@"currentTime -- %f \n duration -- %f", current, duration);
    }];
}

// 不使用时,最好销毁。
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    [self.containerView remove];
}



Example 3 and so on ...

 


[XAVideoOperator 使用] :

 

Example 1


#import "JXAVideoOperator.h"

- (IBAction)mNormal:(id)sender {
    
    self.operator = [[JXAVideoOperator alloc]
                    initWithTagUrl:tagOne
                    containerView:self.containerView
                    userContext:nil
                    state:^(JXAVideoAdsState state,
                            JXAVideoAds *video) {
                        switch (state) {
                                
                            case JXAVideoAdsState_Loaded:
                                NSLog(@"广告加载完毕 - JXAVideoAdsState_Loaded");
                                [video play];
                                break;
                                
                            case JXAVideoAdsState_Started:
                                NSLog(@"已经开始播放广告 - JXAVideoAdsState_Started");
                                break;
                            case JXAVideoAdsState_Error:
                                NSLog(@"加载错误 - JXAVideoAdsState_Error");
                                break;
                            case JXAVideoAdsState_Pause:
                                NSLog(@"广告暂停 - JXAVideoAdsState_Pause");
                                break;
                            case JXAVideoAdsState_Ended:
                                NSLog(@"广告播放结束 - JXAVideoAdsState_Ended");
                                break;
                            case JXAVideoAdsState_Skipped:
                                NSLog(@"广告已经跳过 - JXAVideoAdsState_Skipped");
                                break;
                                
                            default:
                                break;
                        }
                    }];
}
...


- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    [self.operator remove];
}

Example 2 and so on ...


#import "JXAVideoOperator.h"
...

Demo地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容