Mit IMA SDKs können Sie Multimedia-Anzeigen ganz einfach in Ihre Websites und Apps einbinden. IMA SDKs können Anzeigen von jedem VAST-kompatiblen Ad-Server anfordern und die Anzeigenwiedergabe in Ihren Apps verwalten. Mit IMA-SDKs für die dynamische Anzeigenbereitstellung stellen Apps eine Streamanfrage für Anzeigen- und Contentvideos – VOD- oder Livecontent. Das SDK gibt dann einen kombinierten Videostream zurück, damit Sie nicht mehr zwischen Anzeigen- und Contentvideos in Ihrer App wechseln müssen.
In diesem Leitfaden wird gezeigt, wie Sie das IMA SDK in eine einfache Videoplayer-App einbinden. Wenn Sie sich eine abgeschlossene Beispielintegration ansehen oder sie verfolgen möchten, laden Sie das BasicExample von GitHub herunter.
IMA-Plattform für die dynamische Anzeigenbereitstellung
Die Implementierung der IMA DAI umfasst vier SDK-Hauptkomponenten:
IMAAdDisplayContainer
: Ein Containerobjekt, das über dem Videowiedergabeelement platziert ist und die UI-Elemente der Anzeige enthält.IMAAdsLoader
: Ein Objekt, das Streams anfordert und Ereignisse verarbeitet, die von Antwortobjekten für Streamanfragen ausgelöst werden. Sie sollten nur einen Anzeigen-Loader instanziieren, der während der gesamten Lebensdauer der Anwendung wiederverwendet werden kann.IMAStreamRequest
– entweder einIMAVODStreamRequest
- oder einIMALiveStreamRequest
-Objekt: Ein Objekt, das eine Streamanfrage definiert. Streamanfragen können für Video-on-Demand- oder Livestreams erfolgen. Anfragen geben eine Content-ID sowie einen API-Schlüssel oder ein Authentifizierungstoken und andere Parameter an.IMAStreamManager
: Ein Objekt, das dynamische Anzeigenbereitstellungsstreams und Interaktionen mit dem Back-End für die dynamische Anzeigenbereitstellung verarbeitet. Der Stream-Manager verarbeitet außerdem Tracking-Pings und leitet Stream- und Anzeigenereignisse an den Publisher weiter.
Vorbereitung
Für den Start ist Folgendes erforderlich:
- Xcode 9.2 oder höher
- CocoaPods (bevorzugt) oder eine heruntergeladene Kopie des IMA SDKs für iOS
1. Neues Xcode-Projekt erstellen
Erstellen Sie in Xcode ein neues iOS-Projekt mit Objective-C. Verwenden Sie BasicExample als Projektnamen.
2. IMA SDK zum Xcode-Projekt hinzufügen
SDK mit CocoaPods installieren (bevorzugt)
CocoaPods ist ein Abhängigkeitsmanager für Xcode-Projekte und wird für die Installation des IMA SDKs empfohlen. Weitere Informationen zur Installation oder Verwendung von CocoaPods finden Sie in der CocoaPods-Dokumentation. Nachdem Sie CocoaPods installiert haben, folgen Sie dieser Anleitung, um das IMA SDK zu installieren:
Erstellen Sie im Verzeichnis mit der Datei BasicExample.xcodeproj eine Textdatei namens Podfile und fügen Sie die folgende Konfiguration hinzu:
source 'https://github.com/CocoaPods/Specs.git' platform :ios, '10' target "BasicExample" do pod 'GoogleAds-IMA-iOS-SDK', '~> 3.11.4' end
Führen Sie in dem Verzeichnis, das die Podfile enthält,
pod install --repo-update
ausÖffnen Sie die Datei BasicExample.xcworkspace und prüfen Sie, ob sie installiert wurde. Sie muss zwei Projekte enthalten: BasicExample und Pods (die von CocoaPods installierten Abhängigkeiten).
SDK manuell herunterladen und installieren
Wenn Sie CocoaPods nicht verwenden möchten, können Sie das IMA SDK herunterladen und Ihrem Projekt manuell hinzufügen.
3. Einfachen Videoplayer erstellen
Implementieren Sie zuerst einen einfachen Videoplayer. Anfangs verwendet dieser Player das IMA SDK nicht und enthält noch keine Methode zum Auslösen der Wiedergabe.
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. SDK importieren und Stubs für IMA-Interaktion hinzufügen
Nachdem Sie das IMA SDK in Ihr Projekt eingefügt haben, importieren Sie das SDK und fügen Sie Stubs für die primären IMA-Interaktionen hinzu.
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. IMAAdsLoader implementieren
Als Nächstes instanziieren Sie IMAAdsLoader
und hängen die Anzeigencontaineransicht an die Ansichtshierarchie an.
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. Streamanfrage senden
Erstellen Sie einige Konstanten, um die Streaminformationen zu speichern, und implementieren Sie dann die Streamanfragefunktion für die Anfrage.
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. Stream-Ereignisse verarbeiten
Die IMAAdsLoader
- und IMAStreamManager
-Auslösungsereignisse werden zur Verarbeitung von Initialisierungen, Fehlern und Änderungen im Streamstatus verwendet. Diese Ereignisse werden über die Protokolle IMAAdsLoaderDelegate
und IMAStreamManagerDelegate
ausgelöst.
Warten Sie auf ein Ereignis, bei dem Anzeigen geladen wurden, und initialisieren Sie den Stream. Wenn eine Anzeige nicht geladen werden kann, spielen Sie stattdessen einen Reservestream ab.
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. Logging und Fehlerereignisse verarbeiten
Es gibt mehrere Ereignisse, die vom Bevollmächtigten des Stream-Managers verarbeitet werden können. Bei grundlegenden Implementierungen ist es jedoch am wichtigsten, das Ereignis-Logging durchzuführen, Suchaktionen während der Wiedergabe von Anzeigen zu verhindern und Fehler zu beheben.
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
Fertig! Mit dem IMA SDK werden jetzt Anzeigen angefordert und ausgeliefert. Informationen zu erweiterten SDK-Features finden Sie in den anderen Leitfäden oder in den Beispielen auf GitHub.
Nächste Schritte
Wenn Sie den Werbeumsatz auf der iOS-Plattform maximieren möchten, fordern Sie die Berechtigung „App-Transparenz und Tracking“ zur Verwendung von IDFA an.