Начните работу с Samsung Tizen

Чтобы увидеть пример приложения, использующего PAL для генерации nonce, загрузите пример CTV Samsung Tizen с GitHub .

В этом руководстве показано, как интегрировать PAL SDK в приложение Samsung Tizen, запросить одноразовый код (nonce) и зарегистрировать показы рекламы.

Предварительные требования

Прежде чем приступить к этому руководству, вам необходимо создать базовое приложение Tizen. Для настройки приложения можно использовать среду разработки Tizen IDE. Более подробную информацию о начале работы с Tizen можно найти в этом видео.

Сгенерировать одноразовый код (nonce)

«Nonce» — это одна зашифрованная строка, сгенерированная PAL с помощью NonceLoader . SDK PAL требует, чтобы каждый новый запрос потока сопровождался вновь сгенерированным nonce. Однако nonce могут использоваться повторно для нескольких запросов рекламы в рамках одного потока.

Создайте HTML-файл для вашего приложения. Включите зависимость webapis.js в этот HTML-файл. Для работы PAL эта зависимость необходима. Для получения дополнительной информации см. документацию Samsung WebApi .

Добавьте зависимость для CTV PAL SDK в файл index.html . Загрузите тег <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-файл для генерации nonce. Этот шаг включает в себя рабочий процесс PAL, включающий создание NonceLoader , создание NonceRequest и последующий запрос nonce с помощью 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();
  });

  // The default value for the `allowStorage` parameter is false. You must
  // set this value to true to let PAL determine whether limited ads applies
  // based on the TCF data. You can optionlly use the `forceLimitedAds`
  // parameter to enable limited ads regardless of the TCF data.
  const consentSettings = new goog.pal.ConsentSettings();
  consentSettings.allowStorage = true;

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

Прикрепите свой nonce к запросу на показ рекламы.

Чтобы использовать сгенерированный nonce, перед отправкой запросов к рекламному тегу добавьте к нему givn параметр и значение nonce.

  /**
   * 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);
        
      })

Отслеживание событий воспроизведения

Наконец, вам необходимо реализовать различные обработчики событий для вашего плеера. В целях тестирования вы можете привязать их к событиям нажатия кнопок, но в реальной реализации они будут запускаться соответствующими событиями плеера:

/**
 * 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 Ad Manager через сторонние рекламные серверы.

Настройте запрос стороннего рекламного сервера к Ad Manager.

Настройте сторонний рекламный сервер таким образом, чтобы он включал nonce в запрос к Ad Manager. Вот пример рекламного тега, настроенного на стороннем рекламном сервере:

'https://pubads.serverside.net/gampad/ads?givn=%%custom_key_for_google_nonce%%&...'

Для получения более подробной информации см. руководство по реализации на стороне сервера Google Ad Manager .

Менеджер рекламы ищет параметр givn= для идентификации значения nonce. Сторонний рекламный сервер должен поддерживать собственный макрос, например %%custom_key_for_google_nonce%% , и заменить его параметром запроса nonce, который вы указали на предыдущем шаге. Более подробная информация о том, как это сделать, должна быть доступна в документации стороннего рекламного сервера.

Вот и всё! Теперь параметр nonce должен передаваться из PAL SDK через ваши промежуточные серверы, а затем в Google Ad Manager. Это позволит улучшить монетизацию через Google Ad Manager.