iOS視頻廣告(二) GoogleAds-IMA-iOS-SDK

iOS視頻廣告(二) GoogleAds-IMA-iOS-SDK

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

開(kāi)發(fā)
  1. 開(kāi)發(fā)環(huán)境: Xcode 7
  2. 運(yùn)行條件: iOS(9.0+)
  3. 管理平臺(tái): admanger帳號(hào)。 https://admanager.google.com
  4. 官網(wǎng)文檔地址:
    https://developers.google.com/interactive-media-ads/docs/sdks/ios/

?

注意:
  • 管理平臺(tái),官網(wǎng)文檔都需要vpn才能瀏覽.
  • GoogleAds-IMA-iOS-SDK只提供了視頻廣告功能, 如果要實(shí)現(xiàn)橫幅廣告/插頁(yè)式廣告/原生廣告/激勵(lì)廣告可以使用Google-Mobile-Ads-SDK, 后邊的文章會(huì)介紹
  • 開(kāi)源框架:github地址
  • 谷歌視頻廣告SDK介紹: iOS視頻廣告(一) GoogleAds-IMA-iOS-SDK

?

(如果使用有什么問(wèn)題久脯,可以給我留言沛硅,歡迎一起學(xué)習(xí)规肴,歡迎github-star, 點(diǎn)贊)


為什么要封裝SDK:
  • 雖說(shuō)可以直接使用谷歌的SDK寫進(jìn)項(xiàng)目中, 但是實(shí)現(xiàn)起來(lái)還是小復(fù)雜, 需要踩的坑還是有點(diǎn)多. (比如調(diào)用順序變換可能會(huì)導(dǎo)致廣告播不出來(lái))
  • 提供給開(kāi)發(fā)者加載廣告接口不止一個(gè)橄杨,沒(méi)接觸過(guò)谷歌SDK, 挨個(gè)看,測(cè)試?yán)速M(fèi)精力蛛勉。
  • 使用起來(lái)代碼看起來(lái)會(huì)有些亂, 耦合性高, 不方便后期的維護(hù), 而且需要處理的代理回調(diào)方法稍微有些小麻煩儡司。

?

不多說(shuō)廢話, 直接給大家講講 JXVideoAds 如何使用, 幫助大家快速用起來(lái)。


JXVideoAds介紹

?

JXVideoAds是一個(gè)對(duì)谷歌視頻廣告SDK進(jìn)行二次封裝的框架, JXVideoAds主要提供了兩個(gè)類控制廣告的生命周期渐尿,任選一個(gè)使用即可:

(1)、 JXAVideoOperator - 基于NSObjct矾瑰, 用于加載廣告砖茸,類似于manager。
  • 必須傳入一個(gè)(UIView)container - 作為廣告播放的容器視圖殴穴。
  • 必須傳入(StateBlock)state - 廣告加載和調(diào)用狀態(tài)的回調(diào)凉夯。
  • 必須傳入(NSString)tagUrl - 廣告Url货葬。
  • 可選:(ProgressBlock)progress - 加載進(jìn)度回調(diào)。
  • 可選:(AVPlayer)player - 播放器劲够, JXVideoOperator可以根據(jù)傳入的player返回給你廣告播放進(jìn)度震桶。
  • 可選:userContext:- 廣告加載器標(biāo)識(shí)。
  • 可選:(ParamsBlock)params - 自定義參數(shù)構(gòu)建Block征绎。

?

(2)蹲姐、JXAVideoView - 基于UIView,作為廣告播放的容器視圖人柿,也是廣告的管理者柴墩。(推薦使用這個(gè)類,使用起來(lái)更簡(jiǎn)易凫岖,內(nèi)部自己封裝好了AVPlayer江咳,無(wú)需傳入)
  • 必須傳入(StateBlock)state - 廣告加載和調(diào)用狀態(tài)的回調(diào)。
  • 必須傳入(NSString)tagUrl - 廣告Url哥放。
  • 可選:(ProgressBlock)progress - 加載進(jìn)度回調(diào)歼指。
  • 可選:userContext:- 廣告加載器標(biāo)識(shí)。
  • 可選:(ParamsBlock)params - 自定義參數(shù)構(gòu)建Block甥雕。

?

(另外JXAVideoParamsBuilder - 一個(gè)參數(shù)構(gòu)建者踩身,內(nèi)部封裝了一些常用的個(gè)性化參數(shù),點(diǎn)語(yǔ)法依次自定義參數(shù)犀农,開(kāi)發(fā)者可以挑選使用惰赋。)

Installation [安裝]

安裝,只需將以下面代碼添加到您的Podfile:


platform :ios, '9.0'

target 'TargetName' do
pod 'JXVideoAds'
end


注意 !!!  :
* OC - 終端安裝命令正常輸入: pod install
* Swift - 終端安裝命令: IS_FRAMEWORK=1 pod install

因?yàn)镾wift必須使用framework(use_frameworks!), 所以安裝不了objc源碼,只能打包安裝.


Frame set [框架集合]

  • API 外部應(yīng)該訪問(wèn)的接口
  • Common SDK內(nèi)部公共類
  • 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(@"已經(jīng)加載完畢 - JXAVideoAdsState_Loaded");
//                [video play];
                break;
                
            case JXAVideoAdsState_Started:
                NSLog(@"已經(jīng)開(kāi)始播放廣告 - JXAVideoAdsState_Started");
                break;
            case JXAVideoAdsState_Error:
                NSLog(@"加載錯(cuò)誤 - JXAVideoAdsState_Error");
                break;
            case JXAVideoAdsState_Pause:
                NSLog(@"廣告暫停 - JXAVideoAdsState_Pause");
                break;
            case JXAVideoAdsState_Ended:
                NSLog(@"廣告播放結(jié)束 - JXAVideoAdsState_Ended");
                break;
            case JXAVideoAdsState_Skipped:
                NSLog(@"廣告已經(jīng)跳過(guò) - JXAVideoAdsState_Skipped");
                break;
                
            default:
                break;
        }
    }];
}

// 不使用時(shí)呵哨,最好銷毀赁濒。
- (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(@"已經(jīng)加載完畢 - JXAVideoAdsState_Loaded");
                                [video play];
                break;
                
            case JXAVideoAdsState_Started:
                NSLog(@"已經(jīng)開(kāi)始播放廣告 - JXAVideoAdsState_Started");
                break;
            case JXAVideoAdsState_Error:
                NSLog(@"加載錯(cuò)誤 - JXAVideoAdsState_Error");
                break;
            case JXAVideoAdsState_Pause:
                NSLog(@"廣告暫停 - JXAVideoAdsState_Pause");
                break;
            case JXAVideoAdsState_Ended:
                NSLog(@"廣告播放結(jié)束 - JXAVideoAdsState_Ended");
                break;
            case JXAVideoAdsState_Skipped:
                NSLog(@"廣告已經(jīng)跳過(guò) - JXAVideoAdsState_Skipped");
                break;
                
            default:
                break;
        }
    } progress:^(CGFloat current, CGFloat duration) {
        NSLog(@"currentTime -- %f \n duration -- %f", current, duration);
    }];
}

// 不使用時(shí),最好銷毀孟害。
- (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(@"已經(jīng)開(kāi)始播放廣告 - JXAVideoAdsState_Started");
                                break;
                            case JXAVideoAdsState_Error:
                                NSLog(@"加載錯(cuò)誤 - JXAVideoAdsState_Error");
                                break;
                            case JXAVideoAdsState_Pause:
                                NSLog(@"廣告暫停 - JXAVideoAdsState_Pause");
                                break;
                            case JXAVideoAdsState_Ended:
                                NSLog(@"廣告播放結(jié)束 - JXAVideoAdsState_Ended");
                                break;
                            case JXAVideoAdsState_Skipped:
                                NSLog(@"廣告已經(jīng)跳過(guò) - JXAVideoAdsState_Skipped");
                                break;
                                
                            default:
                                break;
                        }
                    }];
}
...


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

Example 2 and so on ...


#import "JXAVideoOperator.h"
...

Demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拒炎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子挨务,更是在濱河造成了極大的恐慌击你,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谎柄,死亡現(xiàn)場(chǎng)離奇詭異丁侄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)朝巫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門鸿摇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人劈猿,你說(shuō)我怎么就攤上這事拙吉〕蹦酰” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵筷黔,是天一觀的道長(zhǎng)往史。 經(jīng)常有香客問(wèn)我,道長(zhǎng)佛舱,這世上最難降的妖魔是什么椎例? 我笑而不...
    開(kāi)封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮名眉,結(jié)果婚禮上粟矿,老公的妹妹穿的比我還像新娘。我一直安慰自己损拢,他們只是感情好陌粹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著福压,像睡著了一般掏秩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荆姆,一...
    開(kāi)封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天蒙幻,我揣著相機(jī)與錄音,去河邊找鬼胆筒。 笑死邮破,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仆救。 我是一名探鬼主播抒和,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼彤蔽!你這毒婦竟也來(lái)了摧莽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤顿痪,失蹤者是張志新(化名)和其女友劉穎镊辕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蚁袭,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡征懈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揩悄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片受裹。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棉饶,到底是詐尸還是另有隱情,我是刑警寧澤镇匀,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布照藻,位于F島的核電站,受9級(jí)特大地震影響汗侵,放射性物質(zhì)發(fā)生泄漏幸缕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一晰韵、第九天 我趴在偏房一處隱蔽的房頂上張望发乔。 院中可真熱鬧,春花似錦雪猪、人聲如沸栏尚。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)译仗。三九已至,卻和暖如春官觅,著一層夾襖步出監(jiān)牢的瞬間纵菌,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工休涤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咱圆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓功氨,卻偏偏與公主長(zhǎng)得像序苏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疑故,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容