البدء

تُسهِّل أدوات تطوير البرامج لإعلانات الوسائط التفاعلية عملية دمج إعلانات الوسائط المتعددة في مواقعك الإلكترونية وتطبيقاتك. يمكن لحزمة تطوير البرامج لإعلانات الوسائط التفاعلية طلب إعلانات من أي خادم إعلانات متوافق مع VAST وإدارة تشغيل الإعلانات في تطبيقاتك. وباستخدام حزم تطوير البرامج من جهة العميل لإعلانات الوسائط التفاعلية يمكنك التحكّم في تشغيل فيديو المحتوى، بينما تعالج حزمة تطوير البرامج (SDK) تشغيل الإعلان. يتم تشغيل الإعلانات في مشغّل فيديو منفصلاً في أعلى مشغّل الفيديو الخاص بمحتوى التطبيق

يوضح هذا الدليل كيفية دمج حزمة تطوير البرامج لإعلانات الوسائط التفاعلية في مشغّل فيديو بسيط. التطبيق. إذا كنت ترغب في عرض أو متابعة عينة مكتملة التكامل، قم بتنزيل BasicExample من GitHub.

نظرة عامة على إعلانات الوسائط التفاعلية من جهة العميل

ويتضمّن تنفيذ إعلانات الوسائط التفاعلية من جهة العميل أربعة مكوّنات رئيسية لحزمة تطوير البرامج (SDK) هي هو موضح في هذا الدليل:

  • IMAAdDisplayContainer: عنصر حاوية يتم عرض الإعلانات فيه
  • IMAAdsLoader: كائن يطلب الإعلانات ويتعامل مع الأحداث الواردة من الإعلانات ويطلب الردود يجب عليك فقط إنشاء مثيل برنامج تحميل إعلانات واحد، والذي يمكن إعادة استخدامه طوال عمر التطبيق.
  • IMAAdsRequest: كائن يحدّد طلب الإعلانات تحدد طلبات الإعلانات عنوان URL لعلامة إعلانات نموذج عرض إعلانات الفيديو (VAST) إلى جانب مَعلمات إضافية، مثل سمات الإعلانات
  • IMAAdsManager: كائن يحتوي على الاستجابة لطلب الإعلانات، ويتحكم في تشغيل الإعلان، ويراقب الإعلان الأحداث التي تم تنشيطها بواسطة حزمة تطوير البرامج (SDK).

المتطلبات الأساسية

قبل البدء، تحتاج إلى ما يلي:

1. إنشاء مشروع Xcode جديد

في Xcode، أنشئ مشروع tvOS جديد باستخدام Objective-C أو Swift. استخدام BasicExample كاسم للمشروع.

2. إضافة حزمة تطوير البرامج لإعلانات الوسائط التفاعلية إلى مشروع Xcode

تثبيت حزمة تطوير البرامج (SDK) باستخدام CocoaPods (خيار مفضَّل)

إنّ CocoaPods هو مدير تبعية لمشاريع Xcode، ويُنصح باستخدامه لتثبيت حزمة تطوير البرامج لإعلانات الوسائط التفاعلية. لمزيد من المعلومات حول تثبيت أو استخدام يُرجى الاطّلاع على مستندات CocoaPods. بمجرد تثبيت CocoaPods، اتّبِع التعليمات التالية لتثبيت حزمة تطوير البرامج لإعلانات الوسائط التفاعلية:

  1. في الدليل نفسه الذي يحتوي عليه الملف BasicExample.xcodeproj، أنشئ نصًا باسم Podfile، وإضافة الإعداد التالي:

    source 'https://github.com/CocoaPods/Specs.git'
    platform :tvos, '14'
    target "BasicExample" do
      pod 'GoogleAds-IMA-tvOS-SDK', '~> 4.13.0'
    end
    
  2. من الدليل الذي يحتوي على Podfile، شغِّل pod install --repo-update

  3. تحقق من أن التثبيت ناجح من خلال فتح BasicExample.xcworkspace والتأكّد من أنه يحتوي على مشروعَين: BasicExample وPods (التبعيات التي تم تثبيتها من خلال CocoaPods).

تثبيت حزمة تطوير البرامج (SDK) باستخدام أداة "إدارة الحِزم" (Swift)

حزمة تطوير البرامج لإعلانات الوسائط التفاعلية تتوافق مع حزمة Swift Manager بدءًا من الإصدار 4.8.2. اتّبِع الخطوات أدناه لاستيراد حزمة Swift.

  1. في Xcode، ثبِّت حزمة Swift لحزمة تطوير البرامج لإعلانات الوسائط التفاعلية من خلال الانتقال إلى ملف > إضافة حِزم....

  2. في رسالة المطالبة التي تظهر، ابحث عن حزمة Swift SDK لإعلانات الوسائط التفاعلية في GitHub المستودع:

    https://github.com/googleads/swift-package-manager-google-interactive-media-ads-tvos
    
  3. اختر إصدار حزمة Swift لحزمة تطوير البرامج لإعلانات الوسائط التفاعلية الذي تريد استخدامه. بالنسبة إلى المشاريع الجديدة، ننصح باستخدام الإصدار الرئيسي التالي.

بمجرد الانتهاء، يحل Xcode تبعيات الحزمة وينزِّلها في الخلفية. لمزيد من المعلومات حول كيفية إضافة حزمة والتبعيات، انظر مقالة Apple.

تنزيل حزمة SDK وتثبيتها يدويًا

إذا لم تكن تريد استخدام CocoaPods، يمكنك تنزيل حزمة تطوير البرامج لإعلانات الوسائط التفاعلية يدويًا وإضافتها إلى مشروعك.

3- إنشاء مشغّل فيديو بسيط

أولاً، استخدِم مشغّل فيديو أساسيًا. في البداية، لا يستخدم هذا المشغل ملفات حزمة تطوير البرامج لإعلانات الوسائط التفاعلية لا تحتوي حتى الآن على أي طريقة لتشغيل التشغيل.

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. استيراد حزمة تطوير البرامج لإعلانات الوسائط التفاعلية

بعد ذلك، أضِف إطار عمل إعلانات الوسائط التفاعلية باستخدام عبارة استيراد أسفل إطار الواردات.

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- تنفيذ أداة تتبُّع رأس تشغيل المحتوى وميزة "مراقبة نهاية البث"

لتشغيل الإعلانات أثناء التشغيل، يجب أن تتتبّع حزمة تطوير البرامج لإعلانات الوسائط التفاعلية الموضع الحالي لمحتوى الفيديو ولإجراء ذلك، أنشئ فئة تنفذ IMAContentPlayhead إذا كنت تستخدم AVPlayer، كما هو موضح في هذا المثال، توفّر حزمة SDK الفئة IMAAVPlayerContentPlayhead التي تنفّذ هذا الإجراء نيابةً عنك. إذا كنت لا تستخدم AVPlayer، ستحتاج إلى تنفيذ IMAContentPlayhead على لفئة خاصة بك.

يجب أيضًا إعلام حزمة SDK عند انتهاء تشغيل المحتوى التابع لك لكي تستطيع عرض إعلانات ما بعد التشغيل ويتم ذلك من خلال الاتصال بـ contentComplete على IMAAdsLoader، باستخدام AVPlayerItemDidPlayToEndTimeNotification

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- إعداد أداة تحميل الإعلانات وتقديم طلب إعلانات

لطلب مجموعة من الإعلانات، يجب إنشاء مثيل IMAAdsLoader. يمكن استخدام أداة التحميل هذه لمعالجة عنصرَين (IMAAdsRequest) مرتبطَين بـ عنوان URL لعلامة الإعلان المحددة.

من بين أفضل الممارسات، ننصحك بالاحتفاظ بمثيل واحد من IMAAdsLoader فقط في العملية بأكملها. دورة حياة تطبيقك. لإرسال طلبات إعلان إضافية، أنشئ طلب إعلان جديدًا الكائن IMAAdsRequest، ولكن أعِد استخدام عنصر IMAAdsLoader نفسه. لمزيد من المعلومات، اطّلع على الأسئلة الشائعة حول حزمة تطوير البرامج لإعلانات الوسائط التفاعلية.

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. إعداد تفويض أداة تحميل الإعلانات

في حدث تحميل ناجح، تستدعي IMAAdsLoader السمة adsLoadedWithData. طريقة المفوَّض الذي تم تعيينه له، وتمريره مثيل IMAAdsManager. إِنْتَ ويمكن بعد ذلك إعداد أداة إدارة الإعلانات التي تحمِّل الإعلانات الفردية على النحو المحدّد من خلال الاستجابة لعنوان URL لعلامة الإعلان.

بالإضافة إلى ذلك، يجب الحرص على معالجة أي أخطاء قد تحدث أثناء التحميل. الدفع. إذا لم يتم تحميل الإعلانات، فتأكّد من أن تشغيل الوسائط مستمر بدون الإعلانات، حتى لا تتداخل مع تجربة المستخدم.

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. إعداد تفويض في "مدير الإعلانات"

أخيرًا، لإدارة الأحداث وتغييرات الحالة، يحتاج مدير الإعلانات إلى تفويض الخاصة بها. وتتوفّر في IMAAdManagerDelegate طرق للتعامل مع أحداث الإعلانات وأخطائها، بالإضافة إلى طرق لبدء التشغيل والإيقاف المؤقت لمحتوى الفيديو.

جارٍ بدء التشغيل

هناك الكثير من الأحداث التي يمكن استخدام طريقة didReceiveAdEvent للتعامل معها، ولكن في هذا المثال الأساسي، ما عليك سوى الاستماع إلى الحدث LOADED لإعلام الإعلانات لبدء تشغيل المحتوى والإعلانات.

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()
    }
  }

...
      

معالجة الأخطاء

يمكنك أيضًا إضافة معالج لأخطاء الإعلانات. في حالة حدوث خطأ، كما حدث في السابق استئناف تشغيل المحتوى.

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()
  }
      

تشغيل أحداث التشغيل والإيقاف المؤقت

يتم استخدام آخر طريقتين للتفويض تحتاج إلى تنفيذهما لتشغيل إيقاف الأحداث مؤقتًا على محتوى الفيديو الأساسي عندما تطلب "حزمة تطوير البرامج لإعلانات الوسائط التفاعلية" يؤدي تشغيل الإيقاف المؤقت والتشغيل عند طلب ذلك إلى منع المستخدم من فقد أجزاء محتوى الفيديو عند عرض الإعلانات

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()
  }
}
      

هذا كل شيء! أنت الآن تطلب الإعلانات وتعرضها باستخدام حزمة تطوير البرامج لإعلانات الوسائط التفاعلية. للتعلّم حول الميزات الإضافية لحزمة تطوير البرامج (SDK)، فيمكنك الاطلاع على الأدلة الأخرى أو النماذج على GitHub.

الخطوات التالية

لزيادة أرباح الإعلانات على منصة tvOS، اطلب إذن "شفافية التطبيقات" و"التتبُّع" لاستخدام معرّف المعلِنين (IDFA).