IMA SDK'ları, multimedya reklamlarını web sitelerinize ve uygulamalarınıza entegre etmenizi kolaylaştırır. IMA SDK'ları herhangi birinden reklam iste VAST uyumlu reklam sunucusu oluşturup uygulamalarınızda reklam oynatmayı yönetin. IMA istemci taraflı SDK'larla SDK, reklam oynatmayı işlerken içerik videosunun oynatılmasını siz kontrol edersiniz. Reklamlar: uygulamanın içerik video oynatıcısının üzerine yerleştirilmiş ayrı bir video oynatıcı.
Bu kılavuzda, IMA SDK'nın basit bir video oynatıcıya nasıl entegre edileceği gösterilmektedir uygulamasını indirin. Tamamlanmış bir örneği görüntülemek veya takip etmek isterseniz entegrasyon için Şuradan BasicExample: GitHub.
IMA istemci tarafına genel bakış
IMA istemci tarafını uygulamak için dört ana SDK bileşeni içerir. görebilirsiniz:
IMAAdDisplayContainer
: Reklamların oluşturulduğu kapsayıcı nesne.IMAAdsLoader
: Reklam isteyen ve reklam isteği yanıtlarından gelen etkinlikleri işleyen nesne. Yalnızca uygulamanın ömrü boyunca yeniden kullanılabilecek bir reklam yükleyicisi örneklendirir.IMAAdsRequest
: Reklam isteğini tanımlayan bir nesne. Reklam istekleri, VAST reklam etiketi URL'sinin yanı sıra ek parametreleri (ör. reklam boyutları) kullanabilirsiniz.IMAAdsManager
: Reklam isteğinin yanıtını içeren, reklam oynatmayı kontrol eden ve reklamı dinleyen bir nesne etkinliklerdir.
Ön koşullar
Başlamadan önce aşağıdakilere ihtiyacınız vardır:
- Xcode 13 veya sonraki sürümler
- CocoaPods (tercih edilir), Swift Package Manager veya bir indirilmiş kopyasını tvOS için IMA SDK'sı
1. Yeni bir Xcode projesi oluşturma
Xcode'da Objective-C veya Swift'i kullanarak yeni bir tvOS projesi oluşturun. Tekliflerinizi otomatikleştirmek ve optimize etmek için BasicExample seçeneğini belirleyin.
2. IMA SDK'yı Xcode projesine ekleme
SDK'yı CocoaPods kullanarak yükleme (tercih edilir)
CocoaPods, Xcode projeleri için bir bağımlılık yöneticisidir ve yöntemini kullanabilirsiniz. Yükleme veya kullanma hakkında daha fazla bilgi için CocoaPods için CocoaPods belgelerini inceleyin. Planınızı CocoaPods yüklüyse IMA SDK'yı yüklemek için aşağıdaki talimatları uygulayın:
BasicExample.xcodeproj dosyanızla aynı dizinde bir metin oluşturun. Podfile adlı dosyayı açın ve aşağıdaki yapılandırmayı ekleyin:
source 'https://github.com/CocoaPods/Specs.git' platform :tvos, '14' target "BasicExample" do pod 'GoogleAds-IMA-tvOS-SDK', '~> 4.13.0' end
Podfile dosyasını içeren dizinde
pod install --repo-update
komutunu çalıştırın.Yükleme işleminin başarılı olduğunu doğrulamak için BasicExample.xcworkspace dosyasını açın ve iki proje içerdiğini onaylayın: BasicExample ve Pods (CocoaPods tarafından yüklenen bağımlılıklar).
Swift Package Manager'ı kullanarak SDK'yı yükleme
Interactive Media Ads SDK'sı Swift Package'ı destekler. Yönetici'yi kullanabilirsiniz. Şunu izleyin: adımları uygulayın.
Xcode'da şuraya giderek IMA SDK Swift Paketi'ni yükleyin: Dosya > Paket Ekle...
Görüntülenen istemde, IMA SDK Swift Paketi GitHub'ı arayın depo:
https://github.com/googleads/swift-package-manager-google-interactive-media-ads-tvos
Kullanmak istediğiniz IMA SDK Swift Paketi sürümünü seçin. Yeni projeler için Bir Sonraki Ana Sürüm'ü kullanmanızı öneririz.
İşiniz bittikten sonra Xcode, paket bağımlılıklarınızı çözer ve arka planda indirir. Paket ekleme hakkında daha fazla bilgi için görmek için Apple'ın makalesi
SDK'yı manuel olarak indirme ve yükleme
CocoaPods'u kullanmak istemiyorsanız IMA SDK'sını indirip manuel olarak yükleyebilirsiniz. projenize ekleyin.
3. Basit bir video oynatıcı oluşturma
İlk olarak, temel bir video oynatıcı uygulayın. Bu oynatıcı başlangıçta IMA SDK'dır ve oynatmayı tetikleyecek herhangi bir yöntem içermemektedir.
ViewController.m
Objective-C
#import "ViewController.h" #import <AVKit/AVKit.h> NSString *const kContentURLString = @"https://storage.googleapis.com/interactive-media-ads/media/stock.mp4"; @interface ViewController () @property(nonatomic) AVPlayerViewController *contentPlayerViewController; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = UIColor.blackColor; [self setupContentPlayer]; } - (void)setupContentPlayer { // Create a content video player. NSURL *contentURL = [NSURL URLWithString:kContentURLString]; AVPlayer *player = [AVPlayer playerWithURL:contentURL]; self.contentPlayerViewController = [[AVPlayerViewController alloc] init]; self.contentPlayerViewController.player = player; self.contentPlayerViewController.view.frame = self.view.bounds; // Attach content video player to view hierarchy. [self showContentPlayer]; } // Add the content video player as a child view controller. - (void)showContentPlayer { [self addChildViewController:self.contentPlayerViewController]; self.contentPlayerViewController.view.frame = self.view.bounds; [self.view insertSubview:self.contentPlayerViewController.view atIndex:0]; [self.contentPlayerViewController didMoveToParentViewController:self]; } // Remove and detach the content video player. - (void)hideContentPlayer { // The whole controller needs to be detached so that it doesn't capture events from the remote. [self.contentPlayerViewController willMoveToParentViewController:nil]; [self.contentPlayerViewController.view removeFromSuperview]; [self.contentPlayerViewController removeFromParentViewController]; } @end
Swift
import AVFoundation import UIKit class ViewController: UIViewController { static let ContentURLString = "https://storage.googleapis.com/interactive-media-ads/media/stock.mp4" var playerViewController: AVPlayerViewController! override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.black; setUpContentPlayer() } func setUpContentPlayer() { // Load AVPlayer with path to your content. let contentURL! = URL(string: ViewController.ContentURLString) let player = AVPlayer(url: contentURL) playerViewController = AVPlayerViewController() playerViewController.player = player showContentPlayer() } func showContentPlayer() { self.addChild(playerViewController) playerViewController.view.frame = self.view.bounds self.view.insertSubview(playerViewController.view, at: 0) playerViewController.didMove(toParent:self) } func hideContentPlayer() { // The whole controller needs to be detached so that it doesn't capture events from the remote. playerViewController.willMove(toParent:nil) playerViewController.view.removeFromSuperview() playerViewController.removeFromParent() } }
4. IMA SDK'sını içe aktarma
Ardından, mevcut yapılandırmanın altında bir içe aktarma ifadesi kullanarak IMA çerçevesini içe aktarılmalıdır.
ViewController.m
Objective-C
#import "ViewController.h" #import <AVKit/AVKit.h> #import <GoogleInteractiveMediaAds/GoogleInteractiveMediaAds.h> NSString *const kContentURLString = @"https://storage.googleapis.com/interactive-media-ads/media/stock.mp4";
Swift
import AVFoundation import GoogleInteractiveMediaAds import UIKit class ViewController: UIViewController { static let ContentURLString = "https://storage.googleapis.com/interactive-media-ads/media/stock.mp4"
5. İçerik video yer imleci izleyicisini ve yayın sonu gözlemleyicisini uygulayın
Videonun ortasında gösterilen reklamların oynatılabilmesi için IMA SDK'nın mevcut konumu izlemesi gerekir
emin olun. Bunu yapmak için şunu uygulayan bir sınıf oluşturun:
IMAContentPlayhead
Bu örnekte gösterildiği gibi bir AVPlayer
kullanıyorsanız
SDK, bunu sizin için yapan IMAAVPlayerContentPlayhead
sınıfını sağlar.
AVPlayer
kullanmıyorsanız şurada IMAContentPlayhead
uygulamanız gerekir:
bir kursa başlayabilirsiniz.
Ayrıca, içeriğinizin oynatılabilmesi için bunu SDK'ya bildirmeniz gerekir.
Videodan sonra gösterilen reklamlar. Bu işlem,contentComplete
IMAAdsLoader
, AVPlayerItemDidPlayToEndTimeNotification
kullanılıyor.
ViewController.m
Objective-C
... @interface ViewController () @property(nonatomic) IMAAVPlayerContentPlayhead *contentPlayhead; @property(nonatomic) AVPlayerViewController *contentPlayerViewController; @end ... - (void)setupContentPlayer { // Create a content video player. NSURL *contentURL = [NSURL URLWithString:kContentURLString]; AVPlayer *player = [AVPlayer playerWithURL:contentURL]; self.contentPlayerViewController = [[AVPlayerViewController alloc] init]; self.contentPlayerViewController.player = player; self.contentPlayerViewController.view.frame = self.view.bounds; self.contentPlayhead = [[IMAAVPlayerContentPlayhead alloc] initWithAVPlayer:self.contentPlayerViewController.player]; // Track end of content. AVPlayerItem *contentPlayerItem = self.contentPlayerViewController.player.currentItem; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(contentDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:contentPlayerItem]; // Attach content video player to view hierarchy. [self showContentPlayer]; } ... - (void)contentDidFinishPlaying:(NSNotification *)notification {} - (void)dealloc { [NSNotificationCenter.defaultCenter removeObserver:self]; } @end
Swift
... class ViewController: UIViewController { static let ContentURLString = "https://storage.googleapis.com/interactive-media-ads/media/stock.mp4" var contentPlayhead: IMAAVPlayerContentPlayhead? var playerViewController: AVPlayerViewController! deinit { NotificationCenter.default.removeObserver(self) } ... func setUpContentPlayer() { // Load AVPlayer with path to your content. let contentURL! = URL(string: ViewController.ContentURLString) let player = AVPlayer(url: contentURL) playerViewController = AVPlayerViewController() playerViewController.player = player // Set up your content playhead and contentComplete callback. contentPlayhead = IMAAVPlayerContentPlayhead(avPlayer: player) NotificationCenter.default.addObserver( self, selector: #selector(ViewController.contentDidFinishPlaying(_:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem); showContentPlayer() } ... @objc func contentDidFinishPlaying(_ notification: Notification) { adsLoader.contentComplete() } }
6. Reklam yükleyiciyi başlatma ve reklam isteğinde bulunma
Reklam grubu istemek için bir IMAAdsLoader
örneği oluşturmanız gerekir.
Bu yükleyici, birIMAAdsRequest
belirtilen reklam etiketi URL'sini kullanın.
En iyi uygulama olarak, tüm cihaz için IMAAdsLoader
öğesinin yalnızca bir örneğini koruyun
en iyi yoludur. Ek reklam istekleri yapmak için yeni bir
IMAAdsRequest
nesnesini yeniden kullanın, ancak aynı IMAAdsLoader
öğesini yeniden kullanın. Daha fazla
IMA SDK hakkında SSS bölümüne bakın.
ViewController.m
Objective-C
... NSString *const kContentURLString = @"https://storage.googleapis.com/interactive-media-ads/media/stock.mp4"; NSString *const kAdTagURLString = @"https://pubads.g.doubleclick.net/gampad/ads?" @"iu=/21775744923/external/vmap_ad_samples&sz=640x480&" @"cust_params=sample_ar%3Dpremidpostlongpod&" @"ciu_szs=300x250&gdfp_req=1&ad_rule=1&output=vmap&unviewed_position_start=1&" @"env=vp&impl=s&cmsid=496&vid=short_onecue&correlator="; @interface ViewController () @property(nonatomic) IMAAdsLoader *adsLoader; @property(nonatomic) IMAAVPlayerContentPlayhead *contentPlayhead; @property(nonatomic) AVPlayerViewController *contentPlayerViewController; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = UIColor.blackColor; [self setupContentPlayer]; [self setupAdsLoader]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self requestAds]; } - (void)setupAdsLoader { self.adsLoader = [[IMAAdsLoader alloc] init]; } - (void)requestAds { // Pass the main view as the container for ad display. IMAAdDisplayContainer *adDisplayContainer = [[IMAAdDisplayContainer alloc] initWithAdContainer:self.view]; IMAAdsRequest *request = [[IMAAdsRequest alloc] initWithAdTagUrl:kAdTagURLString adDisplayContainer:adDisplayContainer contentPlayhead:self.contentPlayhead userContext:nil]; [self.adsLoader requestAdsWithRequest:request]; } ... - (void)contentDidFinishPlaying:(NSNotification *)notification { // Notify the SDK that the postrolls should be played. [self.adsLoader contentComplete]; } ... @end
Swift
... class ViewController: UIViewController { static let ContentURLString = "https://storage.googleapis.com/interactive-media-ads/media/stock.mp4" static let AdTagURLString = "https://pubads.g.doubleclick.net/gampad/ads?iu=/21775744923/external/single_ad_samples&sz=640x480&cust_params=sample_ct%3Dlinear&ciu_szs=300x250%2C728x90&gdfp_req=1&output=vast&unviewed_position_start=1&env=vp&impl=s&correlator=" var adsLoader: IMAAdsLoader! var contentPlayhead: IMAAVPlayerContentPlayhead? var playerViewController: AVPlayerViewController! ... override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.black; setUpContentPlayer() setUpAdsLoader() } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated); requestAds() } ... func setUpAdsLoader() { adsLoader = IMAAdsLoader(settings: nil) } func requestAds() { // Create ad display container for ad rendering. let adDisplayContainer = IMAAdDisplayContainer(adContainer: self.view) // Create an ad request with your ad tag, display container, and optional user context. let request = IMAAdsRequest( adTagUrl: ViewController.AdTagURLString, adDisplayContainer: adDisplayContainer, contentPlayhead: contentPlayhead, userContext: nil) adsLoader.requestAds(with: request) } @objc func contentDidFinishPlaying(_ notification: Notification) { adsLoader.contentComplete() } }
7. Reklam yükleyici yetkisi ayarlama
Başarılı bir yükleme etkinliğinde, IMAAdsLoader
adsLoadedWithData
yöntemini çağırır
yöntemini kullanarak IMAAdsManager
öğesinin bir örneğini iletir. Siz
Ardından reklam yöneticisini başlatabilir ve bu işlem, reklamları tanımlandığı gibi
yanıta göre oluşturulur.
Ayrıca, yükleme işlemi sırasında oluşabilecek hataları bahsedeceğim. Reklamlar yüklenmezse medya oynatmanın reklamlar, kullanıcı deneyimini etkilemeyecek şekilde.
ViewController.m
Objective-C
... @interface ViewController () <IMAAdsLoaderDelegate> @property(nonatomic) IMAAdsLoader *adsLoader; @property(nonatomic) IMAAdsManager *adsManager; @property(nonatomic) IMAAVPlayerContentPlayhead *contentPlayhead; @property(nonatomic) AVPlayerViewController *contentPlayerViewController; @end @implementation ViewController ... - (void)setupAdsLoader { self.adsLoader = [[IMAAdsLoader alloc] init]; self.adsLoader.delegate = self; } ... #pragma mark - IMAAdsLoaderDelegate - (void)adsLoader:(IMAAdsLoader *)loader adsLoadedWithData:(IMAAdsLoadedData *)adsLoadedData { // Initialize and listen to the ads manager loaded for this request. self.adsManager = adsLoadedData.adsManager; [self.adsManager initializeWithAdsRenderingSettings:nil]; } - (void)adsLoader:(IMAAdsLoader *)loader failedWithErrorData:(IMAAdLoadingErrorData *)adErrorData { // Fall back to playing content. NSLog(@"Error loading ads: %@", adErrorData.adError.message); [self.contentPlayerViewController.player play]; } @end
Swift
... class ViewController: UIViewController, IMAAdsLoaderDelegate { ... var adsLoader: IMAAdsLoader! var adsManager: IMAAdsManager! var contentPlayhead: IMAAVPlayerContentPlayhead? var playerViewController: AVPlayerViewController! ... func setUpAdsLoader() { adsLoader = IMAAdsLoader(settings: nil) adsLoader.delegate = self } ... // MARK: - IMAAdsLoaderDelegate func adsLoader(_ loader: IMAAdsLoader!, adsLoadedWith adsLoadedData: IMAAdsLoadedData!) { adsManager = adsLoadedData.adsManager adsManager.initialize(with: nil) } func adsLoader(_ loader: IMAAdsLoader!, failedWith adErrorData: IMAAdLoadingErrorData!) { print("Error loading ads: " + adErrorData.adError.message) showContentPlayer() playerViewController.player?.play() } }
8. Reklam yöneticisi yetkilendirmesi oluşturma
Son olarak, etkinlikleri ve durum değişikliklerini yönetmek için reklam yöneticisinin
sahip olmalıdır. IMAAdManagerDelegate
, reklam etkinliklerini ve hataları ele almak için yöntemlere sahiptir.
ve video içeriğinizi oynatmaya ve duraklatmaya
yönelik yöntemlerin yanı sıra.
Oynatma başlatılıyor
didReceiveAdEvent
yönteminin işlenebileceği birçok etkinlik vardır.
Ancak bu temel örnekte, LOADED
etkinliğini kullanarak reklamlara
yöneticisini kullanabilirsiniz.
ViewController.m
Objective-C
@interface ViewController () <IMAAdsLoaderDelegate, IMAAdsManagerDelegate> ... - (void)adsLoader:(IMAAdsLoader *)loader adsLoadedWithData:(IMAAdsLoadedData *)adsLoadedData { // Initialize and listen to the ads manager loaded for this request. self.adsManager = adsLoadedData.adsManager; self.adsManager.delegate = self; [self.adsManager initializeWithAdsRenderingSettings:nil]; } ... #pragma mark - IMAAdsManagerDelegate - (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdEvent:(IMAAdEvent *)event { // Play each ad once it has loaded. if (event.type == kIMAAdEvent_LOADED) { [adsManager start]; } } ...
Swift
... class ViewController: UIViewController, IMAAdsLoaderDelegate, IMAAdsManagerDelegate { ... func adsLoader(_ loader: IMAAdsLoader!, adsLoadedWith adsLoadedData: IMAAdsLoadedData!) { // Grab the instance of the IMAAdsManager and set yourself as the delegate. adsManager = adsLoadedData.adsManager adsManager.delegate = self adsManager.initialize(with: nil) } ... // MARK: - IMAAdsManagerDelegate func adsManager(_ adsManager: IMAAdsManager!, didReceive event: IMAAdEvent!) { // Play each ad once it has been loaded if event.type == IMAAdEventType.LOADED { adsManager.start() } } ...
Hataları işleme
Reklam hataları için de bir işleyici ekleyin. Önceki örnekte olduğu gibi bir hata oluşursa içeriği oynatmaya devam edin.
ViewController.m
Objective-C
... - (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdError:(IMAAdError *)error { // Fall back to playing content. NSLog(@"AdsManager error: %@", error.message); [self showContentPlayer]; [self.contentPlayerViewController.player play]; } @end
Swift
... func adsManager(_ adsManager: IMAAdsManager!, didReceive error: IMAAdError!) { // Fall back to playing content print("AdsManager error: " + error.message) showContentPlayer() playerViewController.player?.play() }
Oynatma ve duraklatma etkinliklerini tetikleme
Uygulamanız gereken son iki delege yöntemi, oynatmayı tetiklemek ve IMA SDK tarafından istendiğinde temel video içeriğindeki etkinlikleri duraklatma. İstendiğinde duraklatma ve oynatmanın tetiklenmesi, kullanıcının bazı bölümleri kaçırmasını önler web sitesinin içeriğinin çoğu tarafından görüntülenemez.
ViewController.m
Objective-C
... - (void)adsManagerDidRequestContentPause:(IMAAdsManager *)adsManager { // Pause the content for the SDK to play ads. [self.contentPlayerViewController.player pause]; [self hideContentPlayer]; } - (void)adsManagerDidRequestContentResume:(IMAAdsManager *)adsManager { // Resume the content since the SDK is done playing ads (at least for now). [self showContentPlayer]; [self.contentPlayerViewController.player play]; } @end
Swift
... func adsManagerDidRequestContentPause(_ adsManager: IMAAdsManager!) { // Pause the content for the SDK to play ads. playerViewController.player?.pause() hideContentPlayer() } func adsManagerDidRequestContentResume(_ adsManager: IMAAdsManager!) { // Resume the content since the SDK is done playing ads (at least for now). showContentPlayer() playerViewController.player?.play() } }
İşte bu kadar. Artık IMA SDK ile reklam istiyor ve görüntülüyorsunuz. Öğrenmek için hakkında daha fazla bilgi edinmek için diğer kılavuzlara veya GitHub'daki örnekler.
Sonraki Adımlar
tvOS platformunda reklam gelirini en üst düzeye çıkarmak isterseniz IDFA kullanmak üzere Uygulama Şeffaflığı ve İzleme izni isteyin.