Чтобы посмотреть пример приложения, в котором PAL используется для создания одноразового кода, скачайте пример для Samsung Tizen из GitHub.
В этом руководстве рассказывается, как интегрировать PAL SDK в приложение Samsung Tizen, запросить ключ nonce и зарегистрировать показы объявлений.
Требования
Прежде чем начать работу с этим руководством, создайте базовое приложение Tizen. Для этого можно использовать Tizen IDE. Дополнительную информацию можно найти в видео о том, как начать работу с Tizen.
Как сгенерировать одноразовый код
Одноразовый код – это зашифрованная строка, созданная PAL с помощью NonceLoader.
PAL SDK требует, чтобы каждый новый запрос потока сопровождался новым сгенерированным однократно используемым номером. Однако nonce можно использовать повторно для нескольких запросов объявлений в рамках одного потока.
Создайте HTML-файл для приложения и добавьте в него зависимость webapis.js. Для работы PAL требуется эта зависимость. Дополнительную информацию можно найти в документации по Samsung WebApi.
Добавьте в файл index.html зависимость для CTV PAL SDK. Загрузите тег script после тега script для webapis.js. Пример приведен в файле index.html.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<script src="$WEBAPIS/webapis/webapis.js"></script>
<script src="//imasdk.googleapis.com/pal/sdkloader/pal_ctv.js"></script>
<script src="app.js"></script>
</head>
<body>
<header>
<hgroup>
<h1>Samsung Tizen app for PAL sdk</h1>
</hgroup>
</header>
<div id="placeholder-video"></div>
</body>
</html>
Для корректной работы сигналов спама PAL требуются определенные разрешения Tizen. Создайте файл config.xml со следующими декларациями прав:
"http://tizen.org/privilege/internet""http://tizen.org/privilege/system""http://tizen.org/privilege/telephony""http://tizen.org/privilege/tv.inputdevice""http://developer.samsung.com/privilege/network.public""http://developer.samsung.com/privilege/productinfo"
Ниже приведен пример фрагмента кода config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<widget xmlns:tizen="http://tizen.org/ns/widgets" xmlns="http://www.w3.org/ns/widgets" id="http://yourdomain/BasicProject" version="1.0.0" viewmodes="maximized">
<tizen:application id="PACKAGE_STRING.BasicProject" package="PACKAGE_STRING" required_version="2.3"/>
<content src="index.html"/>
<feature name="http://tizen.org/feature/screen.size.normal.1080.1920"/>
<icon src="icon.png"/>
<tizen:metadata key="http://tizen.org/metadata/app_ui_type/base_screen_resolution" value="extensive"/>
<name>BasicProject</name>
<tizen:privilege name="http://tizen.org/privilege/internet"/>
<tizen:privilege name="http://tizen.org/privilege/system"/>
<tizen:privilege name="http://tizen.org/privilege/telephony"/>
<tizen:privilege name='http://tizen.org/privilege/tv.inputdevice'/>
<tizen:privilege name="http://developer.samsung.com/privilege/network.public"/>
<tizen:privilege name="http://developer.samsung.com/privilege/productinfo"/>
<tizen:profile name="tv-samsung"/>
<tizen:setting screen-orientation="landscape" context-menu="enable" background-support="disable" encryption="disable" install-location="auto" hwkey-event="enable"/>
<access origin="*" subdomains="true"/>
</widget>
Затем создайте файл JavaScript, чтобы сгенерировать однократно используемый номер. На этом шаге выполняется рабочий процесс PAL, в рамках которого создается объект NonceLoader, создается объект NonceRequest, а затем запрашивается одноразовый код с помощью метода NonceLoader.loadNonceManager().
let videoElement;
let nonceLoader;
let managerPromise;
let nonceManager;
let playbackStarted = false;
/**
* Initializes the PAL loader.
*/
function init() {
const videoElement = document.getElementById('placeholder-video');
videoElement.addEventListener('mousedown', onVideoTouch);
videoElement.addEventListener('touchstart', onVideoTouch);
videoElement.addEventListener('play', function() {
if (!playbackStarted) {
sendPlaybackStart();
playbackStarted = true;
}
});
videoElement.addEventListener('ended', sendPlaybackEnd);
videoElement.addEventListener('error', function() {
// Handle video error.
sendPlaybackEnd();
});
// PAL automatically determines whether limited ads apply based on the TCF
// data found on the page. You can optionally use the `forceLimitedAds`
// parameter to manually enable limited ads regardless of the TCF data.
const consentSettings = new goog.pal.ConsentSettings();
nonceLoader = new goog.ctv.pal.NonceLoader(consentSettings);
generateNonce();
}
/**
* Generates a nonce with sample arguments and logs it to the console.
*
* The NonceRequest parameters set here are example parameters.
* You should set your parameters based on your own app characteristics.
*/
function generateNonce() {
const request = new goog.ctv.pal.NonceRequest();
request.adWillAutoPlay = true;
request.adWillPlayMuted = false;
request.continuousPlayback = false;
request.descriptionUrl = 'https://example.com';
request.iconsSupported = true;
request.playerType = 'Sample Player Type';
request.playerVersion = '1.0';
request.ppid = 'Sample PPID';
request.sessionId = 'Sample SID';
// Player support for VPAID 2.0, OMID 1.0, and SIMID 1.1
request.supportedApiFrameworks = '2,7,9';
request.url = 'https://developers.google.com/ad-manager/pal/ctv';
request.videoHeight = 480;
request.videoWidth = 640;
managerPromise = nonceLoader.loadNonceManager(request);
managerPromise
.then(function(manager) {
nonceManager = manager;
})
.catch((error) => {
// Handle nonce generating error.
});
}
window.addEventListener("load", function(event) {
init();
});
Как прикрепить одноразовый код к запросу объявления
Чтобы использовать сгенерированное одноразовое число, добавьте к тегу объявления параметр givn и значение одноразового числа, прежде чем отправлять запросы объявлений.
/**
* The ad tag for your ad request, for example:
* https://pubads.g.doubleclick.net/gampad/ads?sz=640x480&iu=/124319096/external/single_ad_samples&ciu_szs=300x250&impl=s&gdfp_req=1&env=vp&output=vast&unviewed_position_start=1&cust_params=deployment%3Ddevsite%26sample_ct%3Dlinear&correlator=
*
* For more sample ad tags, see https://developers.google.com/interactive-media-ads/docs/sdks/html5/client-side/tags
*/
const DEFAULT_AD_TAG = "Your ad tag";
...
managerPromise = nonceLoader.loadNonceManager(request);
managerPromise
.then(function(manager) {
nonceManager = manager;
// Append the nonce to the ad tag URL.
makeAdRequest(DEFAULT_AD_TAG + "&givn=" + nonceString);
})
Если вы запрашиваете и показываете объявления Google, то должны размещать значок и оверлей AdChoices.
Отслеживание событий воспроизведения
Наконец, вам нужно реализовать различные обработчики событий для проигрывателя. Для тестирования вы можете прикрепить их к событиям клика по кнопке, но в реальной реализации они будут активироваться соответствующими событиями проигрывателя:
/**
* Informs PAL that an ad click has occurred. How this function is
* called will vary depending on your ad implementation.
*/
function sendAdClick() {
if (nonceManager) {
nonceManager.sendAdClick();
}
}
/**
* Handles the user touching on the video element, passing it to PAL.
* @param {!TouchEvent|!MouseEvent} touchEvent
*/
function onVideoTouch(touchEvent) {
if (nonceManager) {
nonceManager.sendAdTouch(touchEvent);
}
}
/** Informs PAL that playback has started. */
function sendPlaybackStart() {
if (nonceManager) {
nonceManager.sendPlaybackStart();
}
}
/** Informs PAL that playback has ended. */
function sendPlaybackEnd() {
if (nonceManager) {
nonceManager.sendPlaybackEnd();
}
}
В вашем коде метод sendPlaybackStart должен вызываться в начале сеанса воспроизведения видео. Функцию sendPlaybackEnd следует вызывать после завершения сеанса воспроизведения видео. sendAdClick должен вызываться каждый раз, когда пользователь нажимает на объявление. Функция sendAdTouch должна вызываться при каждом взаимодействии с проигрывателем.
Как отправлять сигналы Google Менеджера рекламы через сторонние серверы объявлений (необязательно)
Настройте запрос стороннего сервера объявлений для Менеджера рекламы.
Настройте сторонний сервер объявлений так, чтобы он включал одноразовый код в запрос к Менеджеру рекламы. Вот пример тега объявления, настроенного на стороннем сервере объявлений:
'https://pubads.serverside.net/gampad/ads?givn=%%custom_key_for_google_nonce%%&...'
Подробнее о реализации на стороне сервера в Google Менеджере рекламы…
Менеджер рекламы ищет givn=, чтобы определить значение nonce. Сторонний сервер объявлений должен поддерживать собственный макрос, например %%custom_key_for_google_nonce%%, и заменять его параметром nonce, указанным на предыдущем шаге. Дополнительную информацию о том, как это сделать, можно найти в документации стороннего сервера объявлений.
Готово! Теперь параметр nonce должен передаваться из PAL SDK через ваши промежуточные серверы в Google Менеджер рекламы. Это позволяет повысить эффективность монетизации с помощью Google Менеджера рекламы.