本指南将介绍如何使用 IMA SDK 实现您自己的自定义界面 。为此,您需要停用默认界面,设置一个新的 自定义界面,然后使用从 。本指南以 简单示例 。
向 DOM 添加界面元素
在编写任何 JavaScript 之前,修改 HTML 和样式表以添加 了解详情按钮、跳过广告按钮的新界面元素,以及 倒计时器:
index.html
<div id="mainContainer">
<div id="content">
<video id="contentElement">
<source src="https://storage.googleapis.com/gvabox/media/samples/stock.mp4"></source>
</video>
</div>
<div id="adContainer"></div>
<div id="customUi">
<div id="adClick" class="customUIButton">Click me!</div>
<div id="skipButton" class="customUIButton"></div>
<div id="adCountdown"></div>
</div>
</div>Style.css
...
#customUI {
display: none;
text-align: center;
width: 100%;
height: 100%;
}
.customUIButton {
position: absolute;
right: 0px;
background-color: red;
}
#adClick {
top: 0px;
width: 100px;
height: 50px;
line-height: 3em;
cursor: pointer;
}
#skipButton {
top: 213px;
width: 150px;
height: 35px;
line-height: 2em;
display: none;
}
#adCountdown {
position: absolute;
left: 0px;
bottom: 10px;
width: 120px;
height: 20px;
background-color: red;
}
...
您可以根据需要为界面设置不同的样式:上面的界面只是一个 示例。
停用内置界面
首先,告知 SDK 您希望其停用其内置界面。
ads.js
function onAdsManagerLoaded(adsManagerLoadedEvent) { const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.disableUi = true; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager( videoContent, adsRenderingSettings); ... }
在允许的情况下显示和隐藏自定义界面
某些 Google 广告(例如 AdSense 广告)不允许自定义用户界面,并且始终
呈现自己的界面在自定义界面 div 上方的样式表中,
默认处于隐藏状态仅在当前正在播放的广告隐藏了
设置界面,并在每个广告结束后隐藏自定义界面,以防后续广告出现异常
允许使用自定义界面:
ads.js
let mainContainerDiv, currentAd, customUiDiv; ... function setUpIMA() { customUiDiv = document.getElementById('customUi'); mainContainerDiv = document.getElementById('mainContainer'); mainContainerDiv.addEventListener('click', () => { // Need this to resume ads after clickthrough. adsManager.resume(); }); ... } function onAdsManagerLoaded(adsManagerLoadedEvent) { ... adsManager.addEventListener( google.ima.AdEvent.Type.SKIPPED, onAdEvent); } function onAdEvent(adEvent) { switch(adEvent.type) { ... case google.ima.AdEvent.Type.STARTED: currentAd = adEvent.getAd(); if (currentAd.isUiDisabled()) { showCustomUi(); } break; case google.ima.AdEvent.Type.COMPLETE: case google.ima.AdEvent.Type.SKIPPED: hideCustomUi(); break; } } function showCustomUi() { customUiDiv.style.display = 'block'; } function hideCustomUi() { customUiDiv.style.display = 'none'; }
向了解详情按钮添加逻辑
您需要连接的第一个界面组件是了解详情按钮。此元素 在用户点击它时通知 SDK:
ads.js
let clickDiv;
...
function setUpIma() {
...
clickDiv = document.getElementById('adClick');
clickDiv.addEventListener('click', (e) => {
// Prevent this from propagating to the customUi div. That would cause the ad to
// resume immediately after the user clicks it, and we want it to pause.
e.stopPropagation();
adsManager.clicked();
});
...
}为倒计时器添加逻辑
接下来,连接用于轮询剩余时间的倒计时器 。
ads.js
let countdownDiv, uiUpdateInterval; ... function setUpIma() { ... countdownDiv = document.getElementById('adCountdown'); ... } function showCustomUi() { uiUpdateInterval = setInterval(updateUi, 100); customUiDiv.style.display = 'block'; } function hideCustomUi() { if (uiUpdateInterval) { clearInterval(uiUpdateInterval); } customUiDiv.style.display = 'none'; } function updateUi() { updateCountdown(); } function updateCountdown() { let countdownText = 'Ad '; const adPodInfo = currentAd.getAdPodInfo(); const totalAds = adPodInfo.getTotalAds(); if (totalAds > 1) { const position = adPodInfo.getAdPosition(); countdownText += position + ' of ' + totalAds; } const remainingTime = Math.ceil(adsManager.getRemainingTime()); countdownText += ' (' + remainingTime + 's)'; countdownDiv.innerText = countdownText; }
向跳过广告按钮添加逻辑
最后,连接跳过广告按钮。只有以下账号才会显示此按钮: 可跳过的广告及其倒计时器必须达到 0 才能激活 让用户能够跳过广告。
ads.js
let skipDiv; // Set this infinitely high to fail early <=0 checks. let timeTillSkip = Number.POSITIVE_INFINITY; ... function setUpIma() { ... skipButton = document.getElementById('skipButton'); skipButton.addEventListener('click', (e) => { // Prevent this from propagating to the customUi div. That would cause the ad to // resume immediately after the user clicks it, and we want it to pause. e.stopPropagation(); if (timeTillSkip <= 0) { adsManager.skip(); } }); ... } function showCustomUi() { if (currentAd.isSkippable()) { skipButton.innerText = ''; skipButton.style.display = 'block'; } else { skipButton.style.display = 'none'; } ... } function updateUi() { updateCountdown(); if (currentAd.isSkippable()) { updateSkip(); } } function updateSkip() { const currentTime = currentAd.getDuration() - adsManager.getRemainingTime(); timeTillSkip = Math.ceil(currentAd.getSkipTimeOffset() - currentTime); if (timeTillSkip > 0) { skipButton.innerText = "Skip this ad in " + timeTillSkip + '...'; skipButton.style.cursor = 'default'; } else { skipButton.innerText = "Skip ad"; skipButton.style.cursor = 'pointer'; } }
问题排查
- 您是否有用于停用广告界面的示例代码?
- 您可以复制此 示例代码 并将其粘贴到您的 IMA 实现中。
- 我无法停用默认界面。
- 请检查并确保您已将
adsRenderingSettings.disableUi设置为true并将其传递给getAdsManager。检查并确认ad.isUiDisabled()返回true。此外,您必须在 Ad Manager 中启用相应广告联盟,才能停用 广告界面中。如果您启用了此设置,您的 VAST 将包含一个Extension,看起来 例如: 如果您仍然遇到问题,请与您的客户经理联系,以确认 。有些广告类型需要特定的界面;这些广告会返回<Extension type="uiSettings"> <UiHideable>1</UiHideable> </Extension>
<UiHideable>值为 0。如果遇到这种情况,您的广告投放管理团队 进行更改以确保这些类型的广告不会投放。