GoogleAds-IMA-iOS-SDK
(谷歌纯视频广告SDK介绍 - iOS)
开发
- 开发环境: Xcode 7
- 运行条件: iOS(9.0+)
- 管理平台: admanger帐号。 https://admanager.google.com
- 官网文档地址:
https://developers.google.com/interactive-media-ads/docs/sdks/ios/
注意:
- 管理平台,官网文档都需要vpn才能浏览.
- 如果只是实现广告的一些简单功能, 看下文"SDK业务调用逻辑"介绍就可以了
- GoogleAds-IMA-iOS-SDK只提供了视频广告功能, 如果要实现横幅广告/插页式广告/原生广告/激励广告可以使用Google-Mobile-Ads-SDK, 后边的文章会介绍
- 小编还提供了一个SDK二次封装的git开源库和介绍
SDK业务调用逻辑
基础类介绍
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 ()
...
// 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. 新建移动应用
- 依次点击<广告资源> 接着点击 <移动应用> 接着点击 <新建移动应用>。
2. 依次点击<广告资源> 接着点击 <广告单元>。
3. 您可以创建包含至多 5 级组织层次结构的广告单元(在 Google Ad Manager 中,您只能创建包含至多 2 级组织层次结构的广告单元)。在显示现有广告单元的对话框中:
- 选择您希望新广告单元显示在哪个广告单元的层次结构中。
- 如果您未选择广告单元,则新广告单元将位于顶级。
4. 点击新建广告单元,然后选择:
- 比“…”低一级,以在所选广告单元下创建一个广告单元。
- 当前级别,以创建一个在层次结构中与所选广告单元处于同一级别的广告单元。
5. 输入代码以用于在关联的广告代码中标识该广告单元。此代码一经确定便无法更改。
- 创建一个易于识别的代码(例如,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 秒之间的任意值。
- 标签:为该广告单元添加标签,以便系统在向该广告单元投放广告素材时可以应用广告素材封装容器。
- 小组:如果您的广告联盟使用小组,请关联该广告单元以限定访问权限。
点击保存。