Introdução ao Tizen (Samsung)

Para conferir um app de exemplo que usa PAL para gerar um valor de uso único, faça o download da smart TV (Tizen) exemplo de GitHub.

Este guia incorpora o SDK da PAL em um aplicativo Samsung (Tizen), solicita e registrar impressões de anúncios.

Pré-requisitos

Antes de começar este guia, você precisa criar um app básico do Tizen. É possível usar o Tizen IDE para configurar o app. Assista a este vídeo sobre como começar a usar o Tizen para mais informações.

Gerar um valor de uso único

Um "nonce" é uma única string criptografada gerada pelo PAL usando o NonceLoader. O SDK da PAL exige que cada nova solicitação de fluxo seja acompanhada por um novo o valor de uso único gerado. No entanto, os valores de uso único podem ser reutilizados para várias solicitações de anúncios no mesmo stream.

Crie um arquivo HTML para o app. Inclua a dependência webapis.js no arquivo HTML. A PAL precisa dessa dependência para funcionar. Para mais informações, consulte as Documentação da Samsung WebApi.

Inclua uma dependência para o SDK de PAL de smart TV no seu arquivo index.html. Carregue tag script após a tag de script de webapis.js. Consulte o seguinte: index.html para um exemplo.

<!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>

Os sinais de spam PAL exigem certos privilégios Tizen para funcionar corretamente. Crie um arquivo config.xml com as seguintes declarações de privilégio:

  • "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"

Confira o snippet de código abaixo para um exemplo de arquivo 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>

Em seguida, crie um arquivo JavaScript para gerar um valor de uso único. Esta etapa inclui o fluxo de trabalho do PAL para criar um NonceLoader, criar um NonceRequest e, em seguida, solicitar um valor de uso único usando 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();
});

Anexar o valor de uso único à solicitação de anúncio

Para utilizar o valor de uso único gerado, anexe sua tag de anúncio com um parâmetro givn e as valor de uso único antes de fazer as solicitações de anúncios.

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

Rastrear eventos de reprodução

Por fim, você precisa implementar vários manipuladores de eventos para o player. Para fins de teste, é possível anexar esses eventos a eventos de clique do botão, mas, em uma implementação real, eles seriam acionados pelos eventos de jogador adequados:

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

Na sua implementação, sendPlaybackStart precisa ser chamado assim que o vídeo iniciar a sessão de reprodução. sendPlaybackEnd deve ser chamado assim que seu vídeo a sessão de reprodução de vídeo seja encerrada. O sendAdClick precisa ser chamado toda vez que o espectador clica em um anúncio. sendAdTouch precisa ser chamado em todas as interações de toque. com o jogador.

(Opcional) Enviar indicadores do Google Ad Manager por servidores de anúncios de terceiros

Configure a solicitação do servidor de anúncios de terceiros para o Ad Manager.

Configure o servidor de anúncios de terceiros para incluir o valor de uso único na solicitação do servidor para o Ad Manager. Confira um exemplo de tag de anúncio configurada no servidor de anúncios de terceiros:

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

Para mais detalhes, consulte a Implementação do lado do servidor do Google Ad Manager guia.

O Ad Manager procura por givn= para identificar o valor de uso único. O servidor de anúncios de terceiros precisa oferecer suporte a uma macro própria, como %%custom_key_for_google_nonce%%, e substituí-la pelo parâmetro de consulta de valor único fornecido na etapa anterior. Mais informações sobre como fazer isso estão disponíveis na documentação do servidor de anúncios de terceiros.

Pronto! Agora você tem o parâmetro de valor de uso único propagado do SDK da PAL. por meio dos servidores intermediários e depois para o Google Ad Manager. Isso permite uma melhor monetização pelo Google Ad Manager.