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
lubIMALiveStreamRequest
: 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ć:
- Xcode 9.2 lub nowsza wersja
- CocoaPods (preferowane) lub pobrana kopia pakietu IMA SDK na iOS,
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:
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
W katalogu zawierającym plik Podfile uruchom polecenie
pod install --repo-update
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.