Começar a usar o SDK de DAI do IMA

Com os SDKs do IMA, é fácil integrar anúncios multimídia aos seus sites e apps. Os SDKs do IMA podem solicitar anúncios de qualquer de anúncios compatíveis com VAST e gerencie a reprodução de anúncios nos seus apps. Com os SDKs de DAI do IMA, os apps criam uma solicitação de streaming para anúncio e conteúdo de vídeo, seja VOD ou conteúdo ao vivo. Em seguida, o SDK retorna uma stream de vídeo combinado, para que você não precise alternar entre anúncios e conteúdo em vídeo no seu app.

Selecione a solução de DAI do seu interesse

DAI de serviço completo

Este guia demonstra como integrar o SDK de DAI do IMA a um player de vídeo simples app. Se você quiser visualizar ou acompanhar um exemplo completo faça o download do BasicExample do GitHub.

Visão geral da DAI do IMA

A implementação da DAI do IMA envolve três componentes principais do SDK, conforme demonstrado neste guia:

  • IMAAdDisplayContainer: Um objeto contêiner que fica em cima do elemento de reprodução de vídeo e hospeda os elementos da interface do anúncio.
  • IMAAdsLoader: Um objeto que solicita streams e processa eventos acionados por objetos de resposta de solicitação de stream. Você deve criar apenas uma instância do carregador de anúncios, que pode ser reutilizado durante a vida útil do para o aplicativo.
  • IMAStreamRequest: um IMAVODStreamRequest ou um IMALiveStreamRequest: Um objeto que define uma solicitação de stream. As solicitações de transmissão podem ser para vídeo on demand ou ao vivo córregos. As solicitações especificam um ID de conteúdo, bem como uma chave de API ou um token de autenticação e outros parâmetros.
  • IMAStreamManager: Um objeto que processa fluxos de Inserção de anúncios dinâmicos e interações com o back-end da DAI. A O gerenciador de streams também lida com pings de rastreamento e encaminha eventos de anúncios e streams para editor.

Pré-requisitos

Antes de começar, os seguintes itens são necessários:

Criar um novo projeto do Xcode

No Xcode, crie um novo projeto tvOS usando Objective-C. Use BasicExample como o nome do projeto.

Adicionar o SDK de DAI do IMA ao projeto do Xcode

Use um destes três métodos para instalar o SDK de DAI do IMA.

Instalar o SDK usando CocoaPods (preferencial)

O CocoaPods é um gerenciador de dependências para projetos Xcode e é recomendado para instalar o SDK de DAI do IMA. Para mais informações sobre como instalar ou usar CocoaPods, consulte a documentação do CocoaPods. Uma vez que você tiver o CocoaPods instalado, use as instruções a seguir para instalar o SDK de DAI do IMA:

  1. No mesmo diretório do arquivo BasicExample.xcodeproj, crie um arquivo de texto chamado Podfile e adicione a seguinte configuração:

    source 'https://github.com/CocoaPods/Specs.git'
    platform :tvos, '14'
    target "BasicExample" do
      pod 'GoogleAds-IMA-tvOS-SDK', '~> 4.13.0'
    end
    
  2. No diretório que contém o Podfile, execute o seguinte:

    pod install --repo-update`
    
  3. Para verificar se a instalação foi bem-sucedida, abra o BasicExample.xcworkspace e confirmando que ele contém dois projetos: BasicExample e Pods (as dependências instaladas pelo (CocoaPods).

Instalar o SDK usando o Gerenciador de pacotes do Swift

O SDK do Interactive Media Ads oferece suporte ao pacote Swift Manager a partir da versão 4.8.2. Siga estas para importar o pacote Swift.

  1. No Xcode, instale o pacote GoogleInteractiveMediaAds Swift navegando até Arquivo > Adicionar pacotes.

  2. No prompt exibido, pesquise o arquivo Swift do GoogleInteractiveMediaAds Repositório do pacote no GitHub:

    https://github.com/googleads/swift-package-manager-google-interactive-media-ads-tvos
    
  3. Selecione a versão do pacote Swift do GoogleInteractiveMediaAds que você quer usar. Para novos projetos, recomendamos usar a Up to Next Major Version.

Quando terminar, o Xcode resolve as dependências do pacote e faz o download delas em segundo plano. Para mais detalhes sobre como adicionar dependências de pacote, consulte da Apple artigo.

Como fazer o download e a instalação manual do SDK

Se não quiser usar o Swift Package Manager ou o CocoaPods, faça o download do o SDK de DAI do IMA e adicione-o manualmente ao seu projeto.

Criar um player de vídeo simples

Primeiro, implemente um player de vídeo básico. Inicialmente, este player não usa a SDK de DAI do IMA nem contém métodos para acionar a reprodução.

ViewController.m

#import "ViewController.h"

#import <AVKit/AVKit.h>

@interface ViewController ()
@property(nonatomic) AVPlayerViewController *playerViewController;
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  self.view.backgroundColor = [UIColor blackColor];

  // Create a stream video player.
  AVPlayer *player = [[AVPlayer alloc] init];
  self.playerViewController = [[AVPlayerViewController alloc] init];
  self.playerViewController.player = player;

  // Attach the video player to the view hierarchy.
  [self addChildViewController:self.playerViewController];
  self.playerViewController.view.frame = self.view.bounds;
  [self.view addSubview:self.playerViewController.view];
  [self.playerViewController didMoveToParentViewController:self];
}

@end

Importar o SDK e adicionar stubs para interação com o IMA

Depois de adicionar o SDK de DAI do IMA ao projeto, importe o SDK e adicione stubs para os pontos principais de interação com o IMA.

ViewController.m

#import "ViewController.h"

#import <AVKit/AVKit.h>
#import <GoogleInteractiveMediaAds/GoogleInteractiveMediaAds.h>

@interface ViewController ()
@property(nonatomic) IMAAdsLoader *adsLoader;
@property(nonatomic) UIView *adContainerView;
@property(nonatomic) IMAStreamManager *streamManager;
@property(nonatomic) AVPlayerViewController *playerViewController;
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  self.view.backgroundColor = [UIColor blackColor];

  [self setupAdsLoader];

  // Create a stream video player.
  AVPlayer *player = [[AVPlayer alloc] init];
  self.playerViewController = [[AVPlayerViewController alloc] init];
  self.playerViewController.player = player;

  // Attach the video player to the view hierarchy.
  [self addChildViewController:self.playerViewController];
  self.playerViewController.view.frame = self.view.bounds;
  [self.view addSubview:self.playerViewController.view];
  [self.playerViewController didMoveToParentViewController:self];

  [self attachAdContainer];
}

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  [self requestStream];
}

- (void)setupAdsLoader {}

- (void)attachAdContainer {}

- (void)requestStream {}

@end

Implementar o IMAAdsLoader

Em seguida, instancie o IMAAdsLoader e anexe a visualização do contêiner do anúncio ao hierarquia de visualização.

ViewController.m

- (void)setupAdsLoader {
  self.adsLoader = [[IMAAdsLoader alloc] init];
  self.adsLoader.delegate = self;
}

- (void)attachAdContainer {
  self.adContainerView = [[UIView alloc] init];
  [self.view addSubview:self.adContainerView];
  self.adContainerView.frame = self.view.bounds;
}

Fazer uma solicitação de stream

Crie algumas constantes para conter as informações do stream e implemente a função de solicitação de stream para fazer a solicitação.

ViewController.m

#import <GoogleInteractiveMediaAds/GoogleInteractiveMediaAds.h>

static NSString *const kAssetKey = @"sN_IYUG8STe1ZzhIIE_ksA";
static NSString *const kContentSourceID = @"2548831";
static NSString *const kVideoID = @"tears-of-steel";

@interface ViewController ()
...

- (void)requestStream {
  IMAAVPlayerVideoDisplay *videoDisplay =
      [[IMAAVPlayerVideoDisplay alloc] initWithAVPlayer:self.playerViewController.player];
  IMAAdDisplayContainer *adDisplayContainer =
      [[IMAAdDisplayContainer alloc] initWithAdContainer:self.adContainerView];
  IMALiveStreamRequest *request = [[IMALiveStreamRequest alloc] initWithAssetKey:kAssetKey
                                                              adDisplayContainer:adDisplayContainer
                                                                    videoDisplay:videoDisplay];
  // VOD request. Comment out the IMALiveStreamRequest above and uncomment this IMAVODStreamRequest
  // to switch from a livestream to a VOD stream.
  // IMAVODStreamRequest *request =
  //     [[IMAVODStreamRequest alloc] initWithContentSourceId:kContentSourceID
  //                                                  videoId:kVideoID
  //                                       adDisplayContainer:adDisplayContainer
  //                                             videoDisplay:videoDisplay];
  [self.adsLoader requestStreamWithRequest:request];
}

Processar eventos de stream

Os eventos de disparo IMAAdsLoader e IMAStreamManager que são usados para processar erros e mudanças no estado do stream. Esses eventos são disparados os protocolos IMAAdsLoaderDelegate e IMAStreamManagerDelegate. Ouvir um evento carregado de anúncios e inicializar o stream. Se um anúncio não carregar, reproduza uma stream de backup.

ViewController.m

static NSString *const kAssetKey = @"sN_IYUG8STe1ZzhIIE_ksA";
static NSString *const kContentSourceID = @"2548831";
static NSString *const kVideoID = @"tears-of-steel";
static NSString *const kBackupStreamURLString =
    @"https://storage.googleapis.com/interactive-media-ads/media/bbb.m3u8";

@interface ViewController () <IMAAdsLoaderDelegate, IMAStreamManagerDelegate>

...
  [self.adsLoader requestStreamWithRequest:request];
}

- (void)playBackupStream {
  NSURL *backupStreamURL = [NSURL URLWithString:kBackupStreamURLString];
  AVPlayerItem *backupStreamItem = [AVPlayerItem playerItemWithURL:backupStreamURL];
  [self.playerViewController.player replaceCurrentItemWithPlayerItem:backupStreamItem];
  [self.playerViewController.player play];
}

#pragma mark - IMAAdsLoaderDelegate

- (void)adsLoader:(IMAAdsLoader *)loader adsLoadedWithData:(IMAAdsLoadedData *)adsLoadedData {
  // Initialize and listen to stream manager's events.
  self.streamManager = adsLoadedData.streamManager;
  self.streamManager.delegate = self;
  [self.streamManager initializeWithAdsRenderingSettings:nil];
  NSLog(@"Stream created with: %@.", self.streamManager.streamId);
}

- (void)adsLoader:(IMAAdsLoader *)loader failedWithErrorData:(IMAAdLoadingErrorData *)adErrorData {
  // Fall back to playing the backup stream.
  NSLog(@"Error loading ads: %@", adErrorData.adError.message);
  [self playBackupStream];
}

#pragma mark - IMAStreamManagerDelegate

- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdEvent:(IMAAdEvent *)event {}

- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdError:(IMAAdError *)error {}

- (void)streamManager:(IMAStreamManager *)streamManager
  adDidProgressToTime:(NSTimeInterval)time
           adDuration:(NSTimeInterval)adDuration
           adPosition:(NSInteger)adPosition
             totalAds:(NSInteger)totalAds
      adBreakDuration:(NSTimeInterval)adBreakDuration {}

@end

Processar eventos de geração de registros e erros

Há vários eventos que podem ser tratados pelo delegado do gerenciador de streams, mas em implementações básicas, os usos mais importantes são a geração de registros de eventos, para evitar ações de busca durante a reprodução de anúncios e para tratar erros.

ViewController.m

#pragma mark - IMAStreamManagerDelegate

- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdEvent:(IMAAdEvent *)event {
  NSLog(@"StreamManager event (%@).", event.typeString);
  switch (event.type) {
    case kIMAAdEvent_STARTED: {
      // Log extended data.
      NSString *extendedAdPodInfo = [[NSString alloc]
          initWithFormat:@"Showing ad %zd/%zd, bumper: %@, title: %@, description: %@, contentType:"
                         @"%@, pod index: %zd, time offset: %lf, max duration: %lf.",
                         event.ad.adPodInfo.adPosition, event.ad.adPodInfo.totalAds,
                         event.ad.adPodInfo.isBumper ? @"YES" : @"NO", event.ad.adTitle,
                         event.ad.adDescription, event.ad.contentType, event.ad.adPodInfo.podIndex,
                         event.ad.adPodInfo.timeOffset, event.ad.adPodInfo.maxDuration];

      NSLog(@"%@", extendedAdPodInfo);
      break;
    }
    case kIMAAdEvent_AD_BREAK_STARTED: {
      // Prevent user seek through when an ad starts and show the ad controls.
      self.adContainerView.hidden = NO;
      break;
    }
    case kIMAAdEvent_AD_BREAK_ENDED: {
      // Allow user seek through after an ad ends and hide the ad controls.
      self.adContainerView.hidden = YES;
      break;
    }
    default:
      break;
  }
}

- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdError:(IMAAdError *)error {
  // Fall back to playing the backup stream.
  NSLog(@"StreamManager error: %@", error.message);
  [self playBackupStream];
}

@end

Pronto! Agora você está solicitando e exibindo anúncios com o SDK de DAI do IMA. Para saber sobre recursos mais avançados do SDK, consulte os outros guias ou a no GitHub.