Pierwsze kroki

Pakiety IMA SDK ułatwiają integrację reklam multimedialnych w witrynach i aplikacjach. Pakiety IMA SDK mogą żądać reklam z dowolnego serwera reklam zgodnego z VAST i zarządzać odtwarzaniem reklam w aplikacjach. W przypadku pakietów IMA DAI SDK aplikacje wysyłają żądania strumienia reklam i treści wideo – VOD lub na żywo. SDK będzie wtedy wyświetlać obraz z połączonych strumieni wideo, dzięki czemu nie będzie trzeba przełączać się między reklamami i treściami wideo w aplikacji.

Z tego przewodnika dowiesz się, jak zintegrować pakiet IMA SDK z prostą aplikacją odtwarzacza wideo. Jeśli chcesz wyświetlić lub kontynuować przykładową integrację, pobierz BasicExample z GitHuba.

Omówienie DAI DAI

Implementacja IMA DAI obejmuje 4 główne komponenty pakietu SDK, które omówiliśmy w tym przewodniku:

  • IMAAdDisplayContainer: obiekt kontenera umieszczony nad elementem odtwarzania wideo i zawierający elementy interfejsu reklamy.
  • IMAAdsLoader: obiekt, który wysyła żądania strumieni i obsługuje zdarzenia wywoływane przez obiekty odpowiedzi na żądanie strumienia. Trzeba utworzyć tylko jeden program wczytujący reklamy, którego można używać wielokrotnie w trakcie działania aplikacji.
  • IMAStreamRequest IMAVODStreamRequest lub IMALiveStreamRequest: obiekt definiujący żądanie strumienia. Żądania strumieni mogą obejmować żądania wideo lub transmisje na żywo. Żądania określają identyfikator treści, klucz interfejsu API lub token uwierzytelniania i inne parametry.
  • IMAStreamManager: obiekt obsługujący strumienie reklam dynamicznych i interakcje z backendem DAI. Menedżer strumieniowania obsługuje też pingi śledzenia i przekazuje wydawcy oraz zdarzenia strumienia i reklamy.

Wymagania wstępne

Zanim zaczniesz, musisz mieć:

1. Utwórz nowy projekt Xcode

Utwórz w Xcode nowy projekt na iOS, korzystając z celu C. Użyj nazwy BasicExample jako nazwy projektu.

2. Dodawanie pakietu IMA SDK do projektu Xcode

Instalowanie pakietu SDK za pomocą CocoaPods (zalecane)

CocoaPods to menedżer zależności projektów Xcode i zalecana metoda instalacji pakietu IMA SDK. Więcej informacji na temat instalowania i używania CocoaPods znajdziesz w dokumentacji CocoaPods. Po zainstalowaniu CocoaPods IMA SDK możesz wykonać te czynności:

  1. W tym samym katalogu, w którym znajduje się plik BasicExample.xcodeproj, utwórz plik tekstowy o nazwie Podfile i dodaj do niego tę konfigurację:

    source 'https://github.com/CocoaPods/Specs.git'
    platform :ios, '10'
    target "BasicExample" do
      pod 'GoogleAds-IMA-iOS-SDK', '~> 3.11.4'
    end
    
  2. W katalogu zawierającym plik Podfile uruchom polecenie pod install --repo-update

  3. Sprawdź, czy instalacja się powiodła. Otwórz plik BasicExample.xcworkspace i upewnij się, że zawiera on 2 projekty: BasicExample i Pods (zależności zainstalowane przez CocoaPods).

Ręczne pobieranie i instalowanie pakietu SDK

Jeśli nie chcesz używać CocoaPods, możesz pobrać pakiet IMA SDK i dodać go ręcznie do projektu.

3. Utwórz prosty odtwarzacz wideo

Najpierw zaimplementuj podstawowy odtwarzacz wideo. Początkowo ten odtwarzacz nie korzysta z pakietu IMA SDK i nie zawiera jeszcze żadnej metody uruchomienia odtwarzania.

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

4. Importowanie pakietu SDK i dodawanie niego w przypadku interakcji IMA

Po dodaniu pakietu IMA SDK do projektu zaimportuj pakiet SDK i dodaj pakiety zasad do głównych punktów interakcji w tej usłudze.

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

5. Zaimplementuj pakiet IMAAdsLoader

Następnie utwórz instancję IMAAdsLoader i dołącz widok kontenera reklamy do hierarchii widoków danych.

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

6. Wysyłanie żądania strumienia

Utwórz kilka stałych informacji o strumieniu i zastosuj funkcję żądania strumienia, aby wysłać żądanie.

ViewController.m

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

static NSString *const kAssetKey = @"sN_IYUG8STe1ZzhIIE_ksA";
static NSString *const kContentSourceID = @"2528370";
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];
}
...

7. Obsługa zdarzeń strumienia

Zdarzenia pożaru IMAAdsLoader i IMAStreamManager, które są używane do obsługi inicjowania, błędów i zmian w stanie strumienia. Te zdarzenia są uruchamiane przez protokoły IMAAdsLoaderDelegate i IMAStreamManagerDelegate. Wykrywaj zdarzenie wczytywania reklam i inicjuj strumień. Jeśli reklama się nie wczyta, odtwórz strumień zapasowy.

ViewController.m

...
static NSString *const kAssetKey = @"sN_IYUG8STe1ZzhIIE_ksA";
static NSString *const kContentSourceID = @"2528370";
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

8. Obsługa zdarzeń logowania i błędów

Istnieje kilka zdarzeń, które może obsłużyć osoba, która przekazała menedżerowi strumienia. Jednak w podstawowych implementacjach najważniejsze jest rejestrowanie zdarzeń, zapobieganie problemom w wyszukiwaniu podczas odtwarzania reklam oraz obsługa błędów.

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

Znakomicie. Teraz wysyłasz żądanie i wyświetlasz reklamy za pomocą pakietu IMA SDK. Aby poznać bardziej zaawansowane funkcje pakietu SDK, zapoznaj się z innymi przewodnikami lub przykładami z GitHuba.

Następne kroki

Aby zmaksymalizować przychody z reklam na platformie iOS, poproś o zezwolenie na korzystanie z IDFA i przejrzystość aplikacji oraz śledzenie.