Cómo comenzar a usar el SDK de IMA de DAI

Los SDK de IMA facilitan la integración de anuncios multimedia en sus sitios web y aplicaciones. Los SDK de IMA pueden solicitar anuncios de cualquier servidor de anuncios compatible con VAST y administra la reproducción de anuncios en tus apps. Con los SDK de IMA de DAI, las aplicaciones solicitud de transmisión para anuncios y videos de contenido, ya sea VOD o contenido en vivo. Luego, el SDK muestra un una transmisión de video por Internet combinada, de modo que no tenga que administrar el cambio entre el video del anuncio y el de contenido dentro de la app.

Selecciona la solución de DAI que te interesa

DAI de servicio completo

En esta guía, se muestra cómo integrar el SDK de IMA de DAI en un reproductor de video simple . Si quieres ver o seguir una muestra completa integración, descarga el BasicExample de GitHub.

Descripción general de IMA de DAI

La implementación de la DAI de IMA incluye tres componentes principales del SDK, como se demuestra en este guía:

  • IMAAdDisplayContainer Es un objeto contenedor que se ubica encima del elemento de reproducción de video y aloja los elementos de la IU del anuncio.
  • IMAAdsLoader Un objeto que solicita transmisiones y controla eventos activados por objetos de respuesta a solicitudes de transmisión. Solo deberías crear una instancia de un cargador de anuncios, que puede reutilizarse durante el ciclo de vida de la y mantener la integridad de su aplicación.
  • IMAStreamRequest: Ya sea un IMAVODStreamRequest o un IMALiveStreamRequest: Un objeto que define una solicitud de transmisión. Las solicitudes de transmisión pueden ser de video on demand o en vivo. transmisiones continuas. Las solicitudes especifican un ID de contenido, así como una clave de API o un token de autenticación y otros parámetros.
  • IMAStreamManager Es un objeto que administra interacciones y transmisiones de inserción de anuncios dinámicos con el backend de DAI. El Además, administra el seguimiento de los pings y reenvía la transmisión y los eventos de anuncios al publicador.

Requisitos previos

Antes de comenzar, necesitas lo siguiente:

Crea un nuevo proyecto de Xcode

En Xcode, crea un proyecto de tvOS nuevo con Objective-C. Usa BasicExample como el nombre del proyecto.

Agrega el SDK de IMA de DAI al proyecto de Xcode

Use uno de estos tres métodos para instalar el SDK de IMA de DAI.

Instala el SDK con CocoaPods (opción preferida).

CocoaPods es un administrador de dependencias para proyectos de Xcode y es el para instalar el SDK de IMA de DAI. Para obtener más información sobre la instalación o el uso CocoaPods, consulta la documentación de CocoaPods. Una vez que si tiene instalado CocoaPods, use las siguientes instrucciones para instalar el SDK de IMA de DAI:

  1. En el mismo directorio en que está el archivo BasicExample.xcodeproj, crea un texto llamado Podfile y agrega la siguiente configuración:

    source 'https://github.com/CocoaPods/Specs.git'
    platform :tvos, '14'
    target "BasicExample" do
      pod 'GoogleAds-IMA-tvOS-SDK', '~> 4.13.0'
    end
    
  2. Desde el directorio que contiene el Podfile, ejecuta lo siguiente:

    pod install --repo-update`
    
  3. Verifica que la instalación se haya realizado correctamente. Para ello, abre la BasicExample.xcworkspace y confirmando que contiene dos proyectos: BasicExample y Pods (las dependencias que instala CocoaPods).

Instala el SDK con Swift Package Manager

El SDK de anuncios multimedia interactivos admite Swift Package Manager a partir de la versión 4.8.2. Seguir pasos para importar el paquete de Swift.

  1. En Xcode, navegue a GoogleInteractiveMediaAds Swift Package. Archivo > Agregar paquetes.

  2. En el mensaje que aparece, busca GoogleInteractiveMediaAds Swift Empaqueta el repositorio de GitHub:

    https://github.com/googleads/swift-package-manager-google-interactive-media-ads-tvos
    
  3. Selecciona la versión del paquete Swift de GoogleInteractiveMediaAds que deseas usar. Para nuevos proyectos, te recomendamos usar Up to Next Major Version.

Cuando termines, Xcode resuelve las dependencias de tus paquetes y las descarga segundo plano. Para conocer más detalles sobre cómo agregar dependencias de paquetes, consulta Apple artículo.

Cómo descargar e instalar el SDK de forma manual

Si no quieres usar Swift Package Manager o CocoaPods, puedes descargar el SDK de IMA de DAI y agregarlo a tu proyecto de forma manual.

Cómo crear un reproductor de video simple

Primero, implementa un reproductor de video básico. En un principio, este jugador no usa el El SDK de IMA de DAI no contiene ningún método para activar la reproducción.

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

Importa el SDK y agrega stubs para la interacción de IMA

Después de agregar el SDK de IMA de DAI a su proyecto, importe el SDK y agregue stubs para los principales puntos de interacción con 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

Cómo implementar IMAAdsLoader

A continuación, crea una instancia de IMAAdsLoader y adjunta la vista del contenedor de anuncios a la jerarquía de vistas.

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

Cómo realizar una solicitud de transmisión

Crea algunas constantes para conservar la información de la transmisión y, luego, implementa la de solicitud de flujo para realizar la solicitud.

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];
}

Cómo controlar eventos de transmisión

Los eventos de activación IMAAdsLoader y IMAStreamManager que se usan para controlar la inicialización, los errores y los cambios en el estado de transmisión. Estos eventos se activan los protocolos IMAAdsLoaderDelegate y IMAStreamManagerDelegate Escuchar un evento cargado de anuncios e inicializa la transmisión. Si un anuncio no se carga, reproduce un transmisión de copia de seguridad.

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

Controla los eventos de registro y errores

El delegado del administrador de transmisiones puede controlar varios eventos, pero Para implementaciones básicas, los usos más importantes son el registro de eventos para evitar acciones de búsqueda mientras se reproducen los anuncios y manejar errores.

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

Eso es todo. Ahora está solicitando y mostrando anuncios con el SDK de IMA de DAI. Para aprender sobre funciones de SDK más avanzadas, consulta las otras guías o la muestras en GitHub.