GoogleAds-IMA-iOS-SDK
(谷歌純視頻廣告SDK介紹 - iOS)
開(kāi)發(fā)
- 開(kāi)發(fā)環(huán)境: Xcode 7
- 運(yùn)行條件: iOS(9.0+)
- 管理平臺(tái): admanger帳號(hào)雄嚣。 https://admanager.google.com
- 官網(wǎng)文檔地址:
https://developers.google.com/interactive-media-ads/docs/sdks/ios/
?
注意:
- 管理平臺(tái),官網(wǎng)文檔都需要vpn才能瀏覽.
- 如果只是實(shí)現(xiàn)廣告的一些簡(jiǎn)單功能, 看下文"SDK業(yè)務(wù)調(diào)用邏輯"介紹就可以了
- GoogleAds-IMA-iOS-SDK只提供了視頻廣告功能, 如果要實(shí)現(xiàn)橫幅廣告/插頁(yè)式廣告/原生廣告/激勵(lì)廣告可以使用Google-Mobile-Ads-SDK, 后邊的文章會(huì)介紹
- 小編還提供了一個(gè)SDK二次封裝的git開(kāi)源庫(kù)和介紹
?
SDK業(yè)務(wù)調(diào)用邏輯
基礎(chǔ)類介紹
IMAAVPlayerContentPlayhead(一個(gè)內(nèi)容播放跟蹤類)
- AVPlayer – 播放器
(可以設(shè)置播放器, 并且獲取播放的時(shí)間)
IMAAdsLoader(一個(gè)視頻請(qǐng)求加載類)
- IMAAdsLoaderDelegate - 監(jiān)聽(tīng)加載情況(返回IMAAdsLoadedData->設(shè)置IMAAdsManager)
- IMASettings - 存儲(chǔ)SDK范圍的設(shè)置(ppid蜜徽、language、enableBackgroundPlayback)
IMAAdsRequest(一個(gè)數(shù)據(jù)請(qǐng)求類)
- adTagUrl – 視頻請(qǐng)求完成地址
- adWillAutoPlay – 自動(dòng)播放
- adWillPlayMuted – 靜音播放
- IMAAdDisplayContainer - 廣告容器視圖和廣告插槽(adContainer隐砸、companionSlots)主要用于插隨播廣告
IMAAdsManager(一個(gè)廣告管理類)
- IMAAdsManagerDelegate – 廣告響應(yīng)事件,生命周期
- adsRenderingSettings –> 呈現(xiàn)廣告的屬性集
?
添加隨播廣告
播放廣告時(shí)塞茅,可以設(shè)置一些插播放廣告
IMACompanionAdSlot(插放廣告類)
- view - 容器視圖
- width - 槽的寬度混聊,以像素為單位
- height - 槽的高度,以像素為單位
- IMACompanionDelegate - 隨播廣告事件監(jiān)聽(tīng)代理
// 新建隨播廣告
self.companionSlot =
[[IMACompanionAdSlot alloc] initWithView:self.companionView
width:self.companionView.frame.size.width
height:self.companionView.frame.size.height];
// 在新建容器IMAAdDisplayContainer時(shí)加入隨播廣告
self.container =
[[IMAAdDisplayContainer alloc] initWithAdContainer:self.videoView
companionSlots:@[ self.companionSlot ]];
?
手動(dòng)控制播放和暫停
這里主要講手動(dòng)控制廣告播放和暫停的功能瞬场。
在默認(rèn)實(shí)現(xiàn)中买鸽,SDK將在其預(yù)定時(shí)間自動(dòng)播放。開(kāi)發(fā)人員要控制播放功能贯被,阻止SDK自動(dòng)播放眼五,你需要在IMAAdsManagerDelegate ->
(adsManager:didReceiveAdEvent:)方法中監(jiān)聽(tīng) AD_BREAK _READY 事件中處理手動(dòng)播放
- (void)setUpAdsLoader {
...
IMASettings settings = [[IMASettings alloc] init];
// 設(shè)置手動(dòng)控制廣告播放和中斷的功能
settings.autoPlayAdBreaks = NO;
self.adsLoader = [[IMAAdsLoader alloc] initWithSettings:settings];
...
}
- (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdEvent:(IMAAdEvent *)event {
...
switch (event.type) {
// 監(jiān)聽(tīng)AD_BREAK_READY事件
case kIMAAdEvent_AD_BREAK_READY:
// 開(kāi)始播放廣告
[adsManager start];
break;
...
}
}
?
配置app內(nèi)部瀏覽器
瀏覽器打開(kāi)的位置: 用戶點(diǎn)擊廣告并進(jìn)入該廣告的目標(biāo)網(wǎng)頁(yè)的過(guò)程。SDK默認(rèn)使用Safari打開(kāi)彤灶,這里介紹如何配置APP內(nèi)部打開(kāi)目標(biāo)網(wǎng)站看幼,以及如何監(jiān)聽(tīng)與訪問(wèn)該頁(yè)面的用戶相關(guān)的事件。
- IMAAdsRenderingSettings - 影響廣告呈現(xiàn)方式的屬性集
IMAAdsRenderingSettings設(shè)置內(nèi)部瀏覽器
- (void)createAdsRenderingSettings {
self.adsRenderingSettings = [[IMAAdsRenderingSettings alloc] init];
self.adsRenderingSettings.webOpenerDelegate = self;
self.adsRenderingSettings.webOpenerPresentingController = self;
}
配置IMAAdsRenderingSettings實(shí)例后幌陕,可以將其傳遞給IMAAdsManager初始化方法:
[self.adsManager initializeWithAdsRenderingSettings: adsRenderingSettings];
IMA SDK提供IMAWebOpenerDelegate诵姜,以便在用戶即將查看或剛剛關(guān)閉點(diǎn)擊頁(yè)面時(shí)進(jìn)行通信。
// 外部瀏覽器將打開(kāi)
- (void)webOpenerWillOpenExternalBrowser:(NSObject *)webOpener { }
// 應(yīng)用內(nèi)瀏覽器將打開(kāi)
- (void)webOpenerWillOpenInAppBrowser:(NSObject *)webOpener { }
// 應(yīng)用內(nèi)瀏覽器已經(jīng)打開(kāi)了
- (void)webOpenerDidOpenInAppBrowser:(NSObject *)webOpener { }
// 應(yīng)用內(nèi)瀏覽器將關(guān)閉
- (void)webOpenerWillCloseInAppBrowser:(NSObject *)webOpener { }
// 應(yīng)用內(nèi)瀏覽器已經(jīng)關(guān)閉
- (void)webOpenerDidCloseInAppBrowser:(NSObject *)webOpener { }
?
Picture in Picture(畫(huà)中畫(huà))
畫(huà)中畫(huà)就是懸浮窗視頻效果
1搏熄、PIP模式是基于AVPlayerLayer的棚唆,畫(huà)面在‘原視圖’和‘懸浮窗’之間切換,實(shí)質(zhì)是‘原視圖’的layer取出心例,縮小宵凌,放到懸浮窗的layer上;
2契邀、‘懸浮窗’在新的iOS9 SDK中摆寄,有一個(gè)NB的名字:AVPictureInPictureController,目前它是不支持自定義操作的坯门,統(tǒng)一有三個(gè)按鈕微饥,‘還原’,‘暫凸糯鳎’欠橘,‘關(guān)閉’;
3现恼、PIP什么時(shí)候用呢肃续?就我而言黍檩,兩個(gè)地方:
(1)home鍵回到后臺(tái)時(shí),視頻用‘懸浮窗’播放
(2)點(diǎn)擊視頻播放器上某一個(gè)PIP按鈕始锚,視頻切換為‘懸浮窗’播放刽酱;
4、PIP適用于什么環(huán)境呢瞧捌?
(1)iOS9以上
(2)AVKit棵里、AVFoundation、WebKit類服務(wù)視頻播放
(3)被棄用的 MPMoviePlayerViewController 或 MPMoviePlayerController抱歉姐呐,建議換播放框架吧
設(shè)置AVAudioSession屬性以支持后臺(tái)播放殿怜,并在以下位置啟用后臺(tái)播放IMASettings:
- (void)viewDidLoad {
[super viewDidLoad];
self.playButton.layer.zPosition = MAXFLOAT;
[[AVAudioSession sharedInstance] setActive:YES error:nil];
[[AVAudioSession sharedInstance]
setCategory: AVAudioSessionCategoryPlayback
error:nil];
[self setupAdsLoader];
[self setUpContentPlayer];
}
- (void)setupAdsLoader {
IMASettings *settings = [[IMASettings alloc] init];
settings.enableBackgroundPlayback = YES;
self.adsLoader = [[IMAAdsLoader alloc] initWithSettings:settings];
self.adsLoader.delegate = self;
}
為了支持PictureinPicture,Apple添加了AVPictureInPictureController 和 AVPictureinPictureControllerDelegate類。就其本身而言曙砂,IMA補(bǔ)充道 IMAPictureInPictureProxy头谜。要在項(xiàng)目中包含這些類,將以下語(yǔ)句添加到代碼中:
...
@interface VideoViewController () <AVPictureInPictureControllerDelegate,
IMAAdsLoaderDelegate,
IMAAdsManagerDelegate,
UIAlertViewDelegate>
...
// PiP objects.
@property(nonatomic, strong) IMAPictureInPictureProxy *pictureInPictureProxy;
@property(nonatomic, strong) AVPictureInPictureController *pictureInPictureController;
...
@end
- (void)setUpContentPlayer {
...
self.pictureInPictureProxy =
[[IMAPictureInPictureProxy alloc] initWithAVPictureInPictureControllerDelegate:self];
self.pictureInPictureController =
[[AVPictureInPictureController alloc] initWithPlayerLayer:self.contentPlayerLayer];
self.pictureInPictureController.delegate = self.pictureInPictureProxy;
}
修改廣告請(qǐng)求
還有一個(gè)新對(duì)象要?jiǎng)?chuàng)建:IMAAVPlayerVideoDisplay鸠澈。這將傳遞給您的IMAAdsRequest構(gòu)造函數(shù)柱告,并允許SDK在圖片模式下播放視頻時(shí)將廣告插入PiP窗口:
- (void)requestAdsWithTag:(NSString *)adTagUrl {
[self logMessage:@"Requesting ads"];
// Create an ad request with our ad tag, display container, and optional user context.
IMAAdsRequest *request = [[IMAAdsRequest alloc]
initWithAdTagUrl:adTagUrl
adDisplayContainer:[self createAdDisplayContainer]
avPlayerVideoDisplay:[[IMAAVPlayerVideoDisplay alloc] initWithAVPlayer:self.contentPlayer]
pictureInPictureProxy:self.pictureInPictureProxy
userContext:nil];
[self.adsLoader requestAdsWithRequest:request];
}
啟動(dòng)廣告
在畫(huà)中畫(huà)模式下無(wú)法啟動(dòng) IMA SDK廣告。因此款侵,您需要確保僅[adsManager start] 在視頻處于標(biāo)準(zhǔn)播放模式時(shí)進(jìn)行呼叫:
...
- (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdEvent:(IMAAdEvent *)event {
[self logMessage:@"AdsManager event (%s).", AdEventNames[event.type]];
// When the SDK notified us that ads have been loaded, play them.
switch (event.type) {
case kIMAAdEvent_LOADED:
if (![self.pictureInPictureController isPictureInPictureActive]) {
[adsManager start];
}
break;
...
default:
break;
}
}
進(jìn)入畫(huà)中畫(huà)模式
如果你使用的是AVPlayer沒(méi)有AVPlayerViewController末荐,你需要添加自己的畫(huà)中畫(huà)按鈕。我們?cè)诟呒?jí)示例中實(shí)現(xiàn)了一個(gè) 如下:
- (IBAction)onPipButtonClicked:(id)sender {
if ([self.pictureInPictureController isPictureInPictureActive]) {
[self.pictureInPictureController stopPictureInPicture];
} else {
[self.pictureInPictureController startPictureInPicture];
}
}
常問(wèn)問(wèn)題
如果視頻處于畫(huà)中畫(huà)模式新锈,如何啟動(dòng)廣告甲脏?
- 視頻處于畫(huà)中畫(huà)模式時(shí)無(wú)法啟動(dòng)廣告; 它們只能在標(biāo)準(zhǔn)播放模式下啟動(dòng)。
我現(xiàn)有的畫(huà)中畫(huà)集成需要設(shè)置self.pictureInPictureController.delegate 為我自己的類妹笆。如何在畫(huà)中畫(huà)中實(shí)施IMA廣告并仍然是代表块请?
- IMA SDK還需要接收AVPictureinPictureControllerDelegate 消息以在畫(huà)中畫(huà)模式下啟用廣告播放。這就是我們要求您將委托設(shè)置為AVPictureinPictureController實(shí)例的原因 IMAPictureInPicturyProxy拳缠。此代理對(duì)象會(huì)將所有AVPictureinPictureControllerDelegate消息轉(zhuǎn)發(fā) 到您的應(yīng)用绅喉,但也會(huì)將呼叫轉(zhuǎn)發(fā)給IMA以啟用畫(huà)中畫(huà)支持茶敏。請(qǐng)注意禁荒,您還必須維護(hù)AVPlayerLayer的本地句柄痊班。
?
?
建立廣告單元(Ad Manager)
廣告后臺(tái)管理平臺(tái)
網(wǎng)址: https://admanager.google.com
1. ? 登錄 Google Ad Manager。
?
2. ? 新建移動(dòng)應(yīng)用
- 依次點(diǎn)擊<廣告資源> 接著點(diǎn)擊 <移動(dòng)應(yīng)用> 接著點(diǎn)擊 <新建移動(dòng)應(yīng)用>哲鸳。
?
?
2. ? 依次點(diǎn)擊<廣告資源> 接著點(diǎn)擊 <廣告單元>臣疑。
?
3. ? 您可以創(chuàng)建包含至多 5 級(jí)組織層次結(jié)構(gòu)的廣告單元(在 Google Ad Manager 中,您只能創(chuàng)建包含至多 2 級(jí)組織層次結(jié)構(gòu)的廣告單元)徙菠。在顯示現(xiàn)有廣告單元的對(duì)話框中:
?
- 選擇您希望新廣告單元顯示在哪個(gè)廣告單元的層次結(jié)構(gòu)中讯沈。
- 如果您未選擇廣告單元,則新廣告單元將位于頂級(jí)婿奔。
?
4. ? 點(diǎn)擊新建廣告單元缺狠,然后選擇:
?
- 比“…”低一級(jí)问慎,以在所選廣告單元下創(chuàng)建一個(gè)廣告單元。
- 當(dāng)前級(jí)別挤茄,以創(chuàng)建一個(gè)在層次結(jié)構(gòu)中與所選廣告單元處于同一級(jí)別的廣告單元如叼。
?
5. ? 輸入代碼以用于在關(guān)聯(lián)的廣告代碼中標(biāo)識(shí)該廣告單元。此代碼一經(jīng)確定便無(wú)法更改穷劈。
- 創(chuàng)建一個(gè)易于識(shí)別的代碼(例如薇正,News_International_BoxATF 或 Leaderboard_BTF)。
- 您只能在不同的廣告單元級(jí)別重復(fù)使用代碼(例如囚衔,您可以在 mysite_economy_home 和 mysite_weather_home 重復(fù)使用 home)。
?
6. ? 為該廣告單元輸入名稱和說(shuō)明 (Optional) 雕沿。最好在名稱中包含與廣告單元位置相關(guān)的信息练湿。
?
7. ? 設(shè)置要與該廣告單元關(guān)聯(lián)的尺寸 (Optional) ,以幫助 Google Ad Manager 過(guò)濾出要向廣告投放人員顯示的廣告單元列表审轮。此列表不會(huì)影響廣告投放肥哎。
?
- 選擇固定尺寸,以指定您希望該廣告單元投放的廣告素材的尺寸列表疾渣。其中包括頁(yè)外尺寸篡诽,采用此類尺寸的廣告素材(例如彈出式廣告素材、浮動(dòng)訂單項(xiàng)廣告素材和插頁(yè)式廣告素材)無(wú)法在傳統(tǒng)橫幅空間或?yàn)g覽器窗口內(nèi)展示榴捡。
- 如果廣告單元適用于移動(dòng)應(yīng)用杈女,而且您希望廣告單元具有固定的高度且與屏幕同寬,請(qǐng)選擇智能橫幅吊圾。
想向您的廣告聯(lián)盟添加新尺寸达椰?
新建一個(gè)廣告單元并添加新尺寸,或者將新尺寸添加到分配給現(xiàn)有廣告單元的尺寸列表中项乒。只要在至少 1 個(gè)廣告單元或訂單項(xiàng)中定義了一個(gè)尺寸啰劲,就可以在廣告聯(lián)盟中的別處使用該尺寸。
?
8. ?(不適用于 Ad Exchange 代碼)定義目標(biāo)窗口以設(shè)定相應(yīng)廣告的點(diǎn)擊后到達(dá)網(wǎng)址鏈接的目標(biāo)屬性檀何,從而告知瀏覽器在何處打開(kāi)該廣告的著陸頁(yè)蝇裤。
?
- _top:著陸頁(yè)會(huì)在整個(gè)窗口中加載(不受任何框架集的約束)。
- _blank:著陸頁(yè)會(huì)在未命名的新窗口中打開(kāi)频鉴。
如果選擇此選項(xiàng)栓辜,著陸頁(yè)將會(huì)在廣告資源部分的“廣告聯(lián)盟設(shè)置”中設(shè)置的默認(rèn)目標(biāo)窗口中打開(kāi)。如果廣告單元位于移動(dòng)應(yīng)用中砚殿,則系統(tǒng)會(huì)忽略目標(biāo)窗口啃憎。對(duì)于 Android 和 iOS 應(yīng)用,廣告會(huì)在未命名的新瀏覽器窗口中加載似炎。
?
9. ?(高級(jí)辛萍,不適用于 Ad Exchange 代碼)根據(jù)需要為該廣告單元添加可選的功能和設(shè)置悯姊。
?
- 展示位置:點(diǎn)擊一個(gè)或多個(gè)展示位置名稱旁邊的包含,以將其與您的新廣告單元關(guān)聯(lián)贩毕。
- 特殊廣告單元:廣告投放人員必須明確定位該廣告單元悯许,才能使訂單項(xiàng)順利投放。
僅在 Google Ad Manager 360 中提供辉阶。 - 廣告單元頻次上限:點(diǎn)擊添加標(biāo)簽規(guī)則先壕,以限制向用戶展示定義了相同標(biāo)簽的廣告素材的次數(shù)。
- 刷新率:對(duì)于移動(dòng)應(yīng)用廣告資源谆甜,設(shè)置刷新率可確定新廣告展示的生成頻率垃僚。如果您選擇刷新率(秒),則 Google Ad Manager 會(huì)自動(dòng)填充“60”這個(gè)值规辱,不過(guò)您也可將其更改為 30-120 秒之間的任意值谆棺。
- 標(biāo)簽:為該廣告單元添加標(biāo)簽,以便系統(tǒng)在向該廣告單元投放廣告素材時(shí)可以應(yīng)用廣告素材封裝容器罕袋。
- 小組:如果您的廣告聯(lián)盟使用小組改淑,請(qǐng)關(guān)聯(lián)該廣告單元以限定訪問(wèn)權(quán)限。
點(diǎn)擊保存浴讯。