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

GoogleAds-IMA-iOS-SDK

(谷歌纯视频广告SDK介绍 - iOS)

开发
  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才能浏览.
  • 如果只是实现广告的一些简单功能, 看下文"SDK业务调用逻辑"介绍就可以了
  • GoogleAds-IMA-iOS-SDK只提供了视频广告功能, 如果要实现横幅广告/插页式广告/原生广告/激励广告可以使用Google-Mobile-Ads-SDK, 后边的文章会介绍
  • 小编还提供了一个SDK二次封装的git开源库介绍

 

SDK业务调用逻辑


01.png

02.png

03.png

基础类介绍


IMAAVPlayerContentPlayhead(一个内容播放跟踪类)

  • AVPlayer – 播放器
(可以设置播放器, 并且获取播放的时间)

IMAAdsLoader(一个视频请求加载类)

  • IMAAdsLoaderDelegate - 监听加载情况(返回IMAAdsLoadedData->设置IMAAdsManager)
  • IMASettings - 存储SDK范围的设置(ppid、language、enableBackgroundPlayback)

IMAAdsRequest(一个数据请求类)

  • adTagUrl – 视频请求完成地址
  • adWillAutoPlay – 自动播放
  • adWillPlayMuted – 静音播放
  • IMAAdDisplayContainer - 广告容器视图和广告插槽(adContainer、companionSlots)主要用于插随播广告

IMAAdsManager(一个广告管理类)

  • IMAAdsManagerDelegate – 广告响应事件,生命周期
  • adsRenderingSettings –> 呈现广告的属性集

 

添加随播广告


播放广告时,可以设置一些插播放广告

IMACompanionAdSlot(插放广告类)

  • view - 容器视图
  • width - 槽的宽度,以像素为单位
  • height - 槽的高度,以像素为单位
  • IMACompanionDelegate - 随播广告事件监听代理

// 新建随播广告
self.companionSlot = 
[[IMACompanionAdSlot alloc] initWithView:self.companionView
width:self.companionView.frame.size.width
height:self.companionView.frame.size.height];

// 在新建容器IMAAdDisplayContainer时加入随播广告
self.container =
[[IMAAdDisplayContainer alloc] initWithAdContainer:self.videoView
companionSlots:@[ self.companionSlot ]];

 

手动控制播放和暂停


这里主要讲手动控制广告播放和暂停的功能。
在默认实现中,SDK将在其预定时间自动播放。开发人员要控制播放功能,阻止SDK自动播放,你需要在IMAAdsManagerDelegate ->
(adsManager:didReceiveAdEvent:)方法中监听 AD_BREAK _READY 事件中处理手动播放


- (void)setUpAdsLoader {
  ...
  IMASettings settings = [[IMASettings alloc] init];
  // 设置手动控制广告播放和中断的功能
  settings.autoPlayAdBreaks = NO;
  self.adsLoader = [[IMAAdsLoader alloc] initWithSettings:settings];
  ...
}

- (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdEvent:(IMAAdEvent *)event {
  ...
  switch (event.type) {
    // 监听AD_BREAK_READY事件
    case kIMAAdEvent_AD_BREAK_READY:
      // 开始播放广告
      [adsManager start];
      break;
    ...
  }
}

 

配置app内部浏览器


浏览器打开的位置: 用户点击广告并进入该广告的目标网页的过程。SDK默认使用Safari打开,这里介绍如何配置APP内部打开目标网站,以及如何监听与访问该页面的用户相关的事件。

  • IMAAdsRenderingSettings - 影响广告呈现方式的属性集

IMAAdsRenderingSettings设置内部浏览器


- (void)createAdsRenderingSettings {
  self.adsRenderingSettings = [[IMAAdsRenderingSettings alloc] init];
  self.adsRenderingSettings.webOpenerDelegate = self;
  self.adsRenderingSettings.webOpenerPresentingController = self;
}

配置IMAAdsRenderingSettings实例后,可以将其传递给IMAAdsManager初始化方法:


[self.adsManager initializeWithAdsRenderingSettings: adsRenderingSettings];

IMA SDK提供IMAWebOpenerDelegate,以便在用户即将查看或刚刚关闭点击页面时进行通信。

// 外部浏览器将打开
- (void)webOpenerWillOpenExternalBrowser:(NSObject *)webOpener { }

//  应用内浏览器将打开
- (void)webOpenerWillOpenInAppBrowser:(NSObject *)webOpener { }

// 应用内浏览器已经打开了
- (void)webOpenerDidOpenInAppBrowser:(NSObject *)webOpener { }

// 应用内浏览器将关闭
- (void)webOpenerWillCloseInAppBrowser:(NSObject *)webOpener { }

// 应用内浏览器已经关闭
- (void)webOpenerDidCloseInAppBrowser:(NSObject *)webOpener { }

 

Picture in Picture(画中画)

画中画就是悬浮窗视频效果


1、PIP模式是基于AVPlayerLayer的,画面在‘原视图’和‘悬浮窗’之间切换,实质是‘原视图’的layer取出,缩小,放到悬浮窗的layer上;

2、‘悬浮窗’在新的iOS9 SDK中,有一个NB的名字:AVPictureInPictureController,目前它是不支持自定义操作的,统一有三个按钮,‘还原’,‘暂停’,‘关闭’;

3、PIP什么时候用呢?就我而言,两个地方:
(1)home键回到后台时,视频用‘悬浮窗’播放
(2)点击视频播放器上某一个PIP按钮,视频切换为‘悬浮窗’播放;

4、PIP适用于什么环境呢?
(1)iOS9以上
(2)AVKit、AVFoundation、WebKit类服务视频播放
(3)被弃用的 MPMoviePlayerViewController 或 MPMoviePlayerController抱歉,建议换播放框架吧


设置AVAudioSession属性以支持后台播放,并在以下位置启用后台播放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补充道 IMAPictureInPictureProxy。要在项目中包含这些类,将以下语句添加到代码中:


...
@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;
}

修改广告请求

还有一个新对象要创建:IMAAVPlayerVideoDisplay。这将传递给您的IMAAdsRequest构造函数,并允许SDK在图片模式下播放视频时将广告插入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];
}

启动广告

在画中画模式下无法启动 IMA SDK广告。因此,您需要确保仅[adsManager start] 在视频处于标准播放模式时进行呼叫:


...
- (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;
  }
}

进入画中画模式

如果你使用的是AVPlayer没有AVPlayerViewController,你需要添加自己的画中画按钮。我们在高级示例中实现了一个 如下:


- (IBAction)onPipButtonClicked:(id)sender {
  if ([self.pictureInPictureController isPictureInPictureActive]) {
    [self.pictureInPictureController stopPictureInPicture];
  } else {
    [self.pictureInPictureController startPictureInPicture];
  }
}

常问问题
如果视频处于画中画模式,如何启动广告?
  • 视频处于画中画模式时无法启动广告; 它们只能在标准播放模式下启动。
我现有的画中画集成需要设置self.pictureInPictureController.delegate 为我自己的类。如何在画中画中实施IMA广告并仍然是代表?
  • IMA SDK还需要接收AVPictureinPictureControllerDelegate 消息以在画中画模式下启用广告播放。这就是我们要求您将委托设置为AVPictureinPictureController实例的原因 IMAPictureInPicturyProxy。此代理对象会将所有AVPictureinPictureControllerDelegate消息转发 到您的应用,但也会将呼叫转发给IMA以启用画中画支持。请注意,您还必须维护AVPlayerLayer的本地句柄。

 

 

建立广告单元(Ad Manager)

广告后台管理平台


网址: https://admanager.google.com

1.   登录 Google Ad Manager。

 

2.   新建移动应用
  • 依次点击<广告资源> 接着点击 <移动应用> 接着点击 <新建移动应用>。

 

01.png

 

02.png
2.   依次点击<广告资源> 接着点击 <广告单元>。

 

3.   您可以创建包含至多 5 级组织层次结构的广告单元(在 Google Ad Manager 中,您只能创建包含至多 2 级组织层次结构的广告单元)。在显示现有广告单元的对话框中:

 

  • 选择您希望新广告单元显示在哪个广告单元的层次结构中。
  • 如果您未选择广告单元,则新广告单元将位于顶级。

 

4.   点击新建广告单元,然后选择:

 

  • 比“…”低一级,以在所选广告单元下创建一个广告单元。
  • 当前级别,以创建一个在层次结构中与所选广告单元处于同一级别的广告单元。
03.png

 

5.   输入代码以用于在关联的广告代码中标识该广告单元。此代码一经确定便无法更改。
04.png
05.png
  • 创建一个易于识别的代码(例如,News_International_BoxATF 或 Leaderboard_BTF)。
  • 您只能在不同的广告单元级别重复使用代码(例如,您可以在 mysite_economy_home 和 mysite_weather_home 重复使用 home)。

 

6.   为该广告单元输入名称和说明 (Optional) 。最好在名称中包含与广告单元位置相关的信息。

 

7.   设置要与该广告单元关联的尺寸 (Optional) ,以帮助 Google Ad Manager 过滤出要向广告投放人员显示的广告单元列表。此列表不会影响广告投放。

 

  • 选择固定尺寸,以指定您希望该广告单元投放的广告素材的尺寸列表。其中包括页外尺寸,采用此类尺寸的广告素材(例如弹出式广告素材、浮动订单项广告素材和插页式广告素材)无法在传统横幅空间或浏览器窗口内展示。
  • 如果广告单元适用于移动应用,而且您希望广告单元具有固定的高度且与屏幕同宽,请选择智能横幅。

想向您的广告联盟添加新尺寸?
新建一个广告单元并添加新尺寸,或者将新尺寸添加到分配给现有广告单元的尺寸列表中。只要在至少 1 个广告单元或订单项中定义了一个尺寸,就可以在广告联盟中的别处使用该尺寸。

 

8.  (不适用于 Ad Exchange 代码)定义目标窗口以设定相应广告的点击后到达网址链接的目标属性,从而告知浏览器在何处打开该广告的着陆页。

 

  • _top:着陆页会在整个窗口中加载(不受任何框架集的约束)。
  • _blank:着陆页会在未命名的新窗口中打开。

如果选择此选项,着陆页将会在广告资源部分的“广告联盟设置”中设置的默认目标窗口中打开。如果广告单元位于移动应用中,则系统会忽略目标窗口。对于 Android 和 iOS 应用,广告会在未命名的新浏览器窗口中加载。

 

9.  (高级,不适用于 Ad Exchange 代码)根据需要为该广告单元添加可选的功能和设置。

 

  • 展示位置:点击一个或多个展示位置名称旁边的包含,以将其与您的新广告单元关联。
  • 特殊广告单元:广告投放人员必须明确定位该广告单元,才能使订单项顺利投放。
    仅在 Google Ad Manager 360 中提供。
  • 广告单元频次上限:点击添加标签规则,以限制向用户展示定义了相同标签的广告素材的次数。
  • 刷新率:对于移动应用广告资源,设置刷新率可确定新广告展示的生成频率。如果您选择刷新率(秒),则 Google Ad Manager 会自动填充“60”这个值,不过您也可将其更改为 30-120 秒之间的任意值。
  • 标签:为该广告单元添加标签,以便系统在向该广告单元投放广告素材时可以应用广告素材封装容器。
  • 小组:如果您的广告联盟使用小组,请关联该广告单元以限定访问权限。
    点击保存。

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

推荐阅读更多精彩内容