Pakiety IMA SDK ułatwiają integrację reklam multimedialnych z witrynami i aplikacjami. Pakiety IMA SDK mogą wysyłać żądania reklam z dowolnego serwera reklam zgodnych z VAST i zarządzać ich odtwarzaniem w aplikacjach. Dzięki pakietom IMA DAI SDK aplikacje wysyłają żądania strumienia w przypadku reklam i treści wideo – VOD lub treści na żywo. Pakiet SDK zwraca wtedy połączony strumień wideo, dzięki czemu nie musisz zarządzać przełączaniem między reklamami wideo a treściami wideo w aplikacji.
Z tego przewodnika dowiesz się, jak zintegrować pakiet IMA SDK z prostym odtwarzaczem wideo. Jeśli chcesz wyświetlić integrację lub wykonać związane z nią instrukcje, pobierz BasicExample z GitHuba.
Omówienie IMA DAI
Implementacja IMA DAI obejmuje 4 główne komponenty SDK, które opisujemy w tym przewodniku:
IMAAdDisplayContainer
: obiekt kontenera znajdujący się na górze elementu odtwarzania filmu i zawierający elementy interfejsu reklamy.IMAAdsLoader
: obiekt, który wysyła żądania strumieni i obsługuje zdarzenia aktywowane przez obiekty odpowiedzi żądania strumienia. Utwórz tylko 1 instancję programu ładującego reklamy, którego możesz używać wielokrotnie w całym cyklu życia aplikacji.IMAStreamRequest
–IMAVODStreamRequest
lubIMALiveStreamRequest
: obiekt definiujący żądanie strumienia. Żądania strumienia mogą dotyczyć filmów na żądanie lub transmisji na żywo. Żądania określają identyfikator treści, a także klucz interfejsu API lub token uwierzytelniania i inne parametry.IMAStreamManager
: obiekt, który obsługuje strumienie dynamicznego wstawiania reklam i interakcje z backendem DAI. Menedżer strumieni obsługuje też pingi śledzące oraz przekazuje zdarzenia strumieniowania i reklam do wydawcy.
Wymagania wstępne
Zanim zaczniesz, będziesz mieć:
- Xcode 13 lub nowsza wersja
- CocoaPods (preferowane), Menedżer pakietów Swift lub pobrana kopia pakietu IMA SDK na iOS
1. Utwórz nowy projekt Xcode
W Xcode utwórz nowy projekt na iOS w klasyfikacji Objective-C. Jako nazwy projektu użyj BasicExample.
2. Dodaj pakiet IMA SDK do projektu Xcode
Zainstaluj pakiet SDK za pomocą CocoaPods (opcja preferowana).
CocoaPods to menedżer zależności dla projektów Xcode. Jest to zalecana metoda instalowania pakietu IMA SDK. Więcej informacji na temat instalacji i używania CocoaPods znajdziesz w dokumentacji CocoaPods. Po zainstalowaniu pakietu CocoaPods zainstaluj pakiet IMA SDK:
W tym samym katalogu co plik BasicExample.xcodeproj utwórz plik tekstowy o nazwie Podfile i dodaj tę konfigurację:
source 'https://github.com/CocoaPods/Specs.git' platform :ios, '14' target "BasicExample" do pod 'GoogleAds-IMA-iOS-SDK', '~> 3.19.1' end
W katalogu zawierającym plik Podfile uruchom polecenie
pod install --repo-update
.Sprawdź, czy instalacja się powiodła, otwierając plik BasicExample.xcworkspace i potwierdzając, że zawiera on 2 projekty: BasicExample i Pods (zależności zainstalowane przez CocoaPods).
Instalowanie pakietu SDK za pomocą menedżera pakietów Swift
Pakiet Interactive Media Ads SDK obsługuje Menedżera pakietów Swift od wersji 3.18.4. Aby zaimportować pakiet Swift, wykonaj poniższe czynności.
Zainstaluj w Xcode pakiet IMA SDK Swift, wybierając kolejno Plik > Dodaj pakiety....
W wyświetlonym oknie wyszukaj repozytorium pakietu IMA SDK Swift na GitHubie:
https://github.com/googleads/swift-package-manager-google-interactive-media-ads-ios
Wybierz wersję pakietu IMA SDK Swift, której chcesz użyć. W przypadku nowych projektów zalecamy używanie trybu Up to Next Major Version (Do następnej wersji głównej).
Gdy skończysz, Xcode rozpozna zależności pakietów i pobierze je w tle. Więcej informacji o dodawaniu zależności pakietów znajdziesz w artykule Apple.
Ręcznie pobierz i zainstaluj pakiet SDK.
Jeśli nie chcesz korzystać z Menedżera pakietów Swift ani CocoaPods, możesz pobrać pakiet IMA SDK i ręcznie dodać go 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 aktywowania 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 atramentów na potrzeby interakcji IMA
Po dodaniu pakietu IMA SDK do projektu zaimportuj go i dodaj na nim ataki na potrzeby głównych punktów interakcji 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
5. Implementowanie pakietu IMAAdsLoader
Następnie utwórz instancję IMAAdsLoader
i dołącz widok kontenera reklamy do hierarchii widoków.
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 prośby o transmisję
Utwórz kilka stałych do przechowywania informacji o strumieniu, a następnie zaimplementuj funkcję żądania strumienia w celu wykonania żądania.
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 uruchamiania IMAAdsLoader
i IMAStreamManager
służą do obsługi inicjowania, błędów i zmian w stanie strumienia. Te zdarzenia są wywoływane przez protokoły IMAAdsLoaderDelegate
i IMAStreamManagerDelegate
.
Wykrywaj zdarzenie wczytania reklam i zainicjuj strumień. Jeśli nie uda się wczytać reklamy, 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
Delegat menedżera strumienia może obsługiwać kilka zdarzeń, ale w podstawowych implementacjach najważniejsze jest rejestrowanie zdarzeń, zapobieganie czynnościom związanym z wyszukiwaniem 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. Wysyłajesz żądanie i wyświetlasz reklamy za pomocą pakietu IMA SDK. Informacje o bardziej zaawansowanych funkcjach pakietu SDK znajdziesz w innych przewodnikach i przykładach na GitHubie.
Dalsze kroki
Aby zmaksymalizować przychody z reklam na platformie iOS, poproś o zgodę na używanie identyfikatora IDFA do przejrzystości i śledzenia aplikacji.