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

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

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

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

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

Создать одноразовый номер

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

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

Включите зависимость для CTV PAL SDK в файл index.html . Загрузите тег сценария после тега сценария для 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>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 storageConsent = true;
let playbackStarted = false;

/**
 * A placeholder for the publisher's own method of obtaining user
 * consent, either by integrating with a CMP or based on other
 * methods the publisher chooses to handle storage consent.
 * @return {boolean} Whether storage consent has been given.
 */
function getConsentToStorage() {
  return storageConsent;
}

/**
 * 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 `allowStorage` is false, but can be
  // changed once the appropriate consent has been gathered.
  const consentSettings = new goog.ctv.pal.ConsentSettings();
  consentSettings.allowStorage = getConsentToStorage();

  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, добавьте в тег объявления параметр 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 через сторонние рекламные серверы.

Настройте запрос стороннего рекламного сервера к Менеджеру рекламы.

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

'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.