डीआई के लिए IMA SDK टूल सेट अप करना

प्लैटफ़ॉर्म चुनें: HTML5 Android iOS tvOS Cast Roku

IMA SDK की मदद से, अपनी वेबसाइटों और ऐप्लिकेशन में मल्टीमीडिया विज्ञापन आसानी से इंटिग्रेट किए जा सकते हैं. IMA SDK, VAST के साथ काम करने वाले किसी भी विज्ञापन सर्वर से विज्ञापनों का अनुरोध कर सकते हैं. साथ ही, आपके ऐप्लिकेशन में विज्ञापन चलाने की सुविधा को मैनेज कर सकते हैं. IMA DAI SDK की मदद से, ऐप्लिकेशन विज्ञापन और कॉन्टेंट वीडियो के लिए स्ट्रीम का अनुरोध करते हैं. यह कॉन्टेंट, वीओडी या लाइव कॉन्टेंट में से कोई भी हो सकता है. इसके बाद, SDK टूल एक साथ वीडियो स्ट्रीम दिखाता है, ताकि आपको अपने ऐप्लिकेशन में विज्ञापन और कॉन्टेंट वीडियो के बीच स्विच करने की ज़रूरत न पड़े.

वह DAI समाधान चुनें जिसमें आपकी दिलचस्पी है

डीएआई की पूरी सेवा

इस गाइड में, IMA DAI SDK को किसी सामान्य वीडियो प्लेयर ऐप्लिकेशन में इंटिग्रेट करने का तरीका बताया गया है. अगर आपको इंटिग्रेशन का पूरा सैंपल देखना है या साथ-साथ इंटिग्रेट करना है, तो GitHub से BasicExample डाउनलोड करें.

IMA DAI की खास जानकारी

IMA DAI को लागू करने के लिए, तीन मुख्य एसडीके कॉम्पोनेंट का इस्तेमाल किया जाता है. इनके बारे में इस गाइड में बताया गया है:

  • IMAAdDisplayContainer: यह एक कंटेनर ऑब्जेक्ट है, जो वीडियो चलाने वाले एलिमेंट के ऊपर दिखता है. इसमें विज्ञापन के यूज़र इंटरफ़ेस (यूआई) वाले एलिमेंट शामिल होते हैं.
  • IMAAdsLoader: यह ऐसा ऑब्जेक्ट है जो स्ट्रीम का अनुरोध करता है और स्ट्रीम के अनुरोध के रिस्पॉन्स ऑब्जेक्ट से ट्रिगर होने वाले इवेंट को मैनेज करता है. आपको सिर्फ़ एक विज्ञापन लोडर को इंस्टैंशिएट करना चाहिए. इसका इस्तेमाल पूरे ऐप्लिकेशन में किया जा सकता है.
  • IMAStreamRequest – either a IMAVODStreamRequest or a IMALiveStreamRequest: An object that defines a stream request. स्ट्रीम करने के अनुरोध, वीडियो-ऑन-डिमांड या लाइव स्ट्रीम के लिए किए जा सकते हैं. लाइव स्ट्रीम के अनुरोधों में ऐसेट कुंजी के बारे में बताया जाता है. वहीं, वीओडी के अनुरोधों में सीएमएस आईडी और वीडियो आईडी के बारे में बताया जाता है. दोनों तरह के अनुरोधों में, एपीआई कुंजी शामिल की जा सकती है. इसकी ज़रूरत, तय की गई स्ट्रीम को ऐक्सेस करने के लिए होती है. साथ ही, इसमें Google Ad Manager नेटवर्क कोड भी शामिल किया जा सकता है, ताकि IMA SDK, Google Ad Manager की सेटिंग में बताए गए विज्ञापन आइडेंटिफ़ायर को मैनेज कर सके.
  • IMAStreamManager: यह एक ऐसा ऑब्जेक्ट है जो डाइनैमिक ऐड इंसर्शन वाली स्ट्रीम और डीएआई बैकएंड के साथ इंटरैक्शन को मैनेज करता है. स्ट्रीम मैनेजर, ट्रैकिंग पिंग को भी मैनेज करता है. साथ ही, स्ट्रीम और विज्ञापन इवेंट को पब्लिशर को भेजता है.

ज़रूरी शर्तें

शुरू करने से पहले, आपके पास ये चीज़ें होनी चाहिए:

नया Xcode प्रोजेक्ट बनाना

Xcode में, Objective-C का इस्तेमाल करके नया tvOS प्रोजेक्ट बनाएं. प्रोजेक्ट के नाम के तौर पर BasicExample का इस्तेमाल करें.

Xcode प्रोजेक्ट में IMA DAI SDK जोड़ना

IMA DAI SDK इंस्टॉल करने के लिए, इनमें से किसी एक तरीके का इस्तेमाल करें.

Swift Package Manager का इस्तेमाल करके एसडीके इंस्टॉल करना

Interactive Media Ads SDK, Swift Package Manager के साथ काम करता है. इसके लिए, SDK का वर्शन 4.8.2 या उसके बाद का होना ज़रूरी है. Swift पैकेज इंपोर्ट करने के लिए, यह तरीका अपनाएं.

  1. Xcode में, GoogleInteractiveMediaAds Swift Package इंस्टॉल करें. इसके लिए, File > Add Packages पर जाएं.

  2. दिखने वाले प्रॉम्प्ट में, GoogleInteractiveMediaAds Swift Package GitHub रिपॉज़िटरी खोजें:

    https://github.com/googleads/swift-package-manager-google-interactive-media-ads-tvos
    
  3. GoogleInteractiveMediaAds Swift Package का वह वर्शन चुनें जिसे आपको इस्तेमाल करना है. नए प्रोजेक्ट के लिए, हमारा सुझाव है कि अगले मुख्य वर्शन तक का इस्तेमाल करें.

इसके बाद, Xcode आपके पैकेज की डिपेंडेंसी से जुड़ी समस्या को हल करता है और उन्हें बैकग्राउंड में डाउनलोड करता है. पैकेज डिपेंडेंसी जोड़ने के तरीके के बारे में ज़्यादा जानने के लिए, Apple का लेख पढ़ें.

CocoaPods का इस्तेमाल करके एसडीके इंस्टॉल करना

CocoaPods, Xcode प्रोजेक्ट के लिए डिपेंडेंसी मैनेजर है. IMA DAI SDK टूल को इंस्टॉल करने के लिए, इस तरीके का इस्तेमाल करने का सुझाव दिया जाता है. CocoaPods को इंस्टॉल करने या इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, CocoaPods का दस्तावेज़ देखें. CocoaPods इंस्टॉल करने के बाद, IMA DAI SDK इंस्टॉल करने के लिए यहां दिया गया तरीका अपनाएं:

  1. अपनी BasicExample.xcodeproj फ़ाइल वाली डायरेक्ट्री में, Podfile नाम की टेक्स्ट फ़ाइल बनाएं और यह कॉन्फ़िगरेशन जोड़ें:

    source 'https://github.com/CocoaPods/Specs.git'
    platform :tvos, '15'
    target "BasicExample" do
      pod 'GoogleAds-IMA-tvOS-SDK', '~> 4.16.0'
    end
    
  2. Podfile वाले डायरेक्ट्री से, यह कमांड चलाएं:

    pod install --repo-update
  3. BasicExample.xcworkspace फ़ाइल खोलकर पुष्टि करें कि इंस्टॉलेशन पूरा हो गया है. साथ ही, यह भी पुष्टि करें कि इसमें दो प्रोजेक्ट शामिल हैं: BasicExample और Pods (CocoaPods से इंस्टॉल की गई डिपेंडेंसी).

एसडीके को मैन्युअल तरीके से डाउनलोड और इंस्टॉल करना

अगर आपको Swift Package Manager या CocoaPods का इस्तेमाल नहीं करना है, तो IMA DAI SDK डाउनलोड करें और उसे अपने प्रोजेक्ट में मैन्युअल तरीके से जोड़ें.

IMA SDK इंपोर्ट करना

इंपोर्ट स्टेटमेंट का इस्तेमाल करके, IMA फ़्रेमवर्क जोड़ें:

Objective-C

#import "ViewController.h"
#import <AVKit/AVKit.h>

@import GoogleInteractiveMediaAds;

Swift

import AVFoundation
import GoogleInteractiveMediaAds
import UIKit

वीडियो प्लेयर बनाना और IMA SDK टूल को इंटिग्रेट करना

यहां दिए गए उदाहरण में, IMA SDK को शुरू करने का तरीका बताया गया है:

Objective-C

// Live stream asset key, VOD content source and video IDs, and backup content URL.
static NSString *const kAssetKey = @"c-rArva4ShKVIAkNfy6HUQ";
static NSString *const kContentSourceID = @"2548831";
static NSString *const kVideoID = @"tears-of-steel";
static NSString *const kNetworkCode = @"21775744923";
static NSString *const kBackupStreamURLString =
    @"http://googleimadev-vh.akamaihd.net/i/big_buck_bunny/bbb-,480p,720p,1080p,.mov.csmil/"
    @"master.m3u8";
static const StreamType kDefaultStreamType = StreamTypeLive;

@interface ViewController () <IMAAdsLoaderDelegate,
                              IMAStreamManagerDelegate,
                              AVPlayerViewControllerDelegate>
@property(nonatomic) IMAAdsLoader *adsLoader;
@property(nonatomic) IMAAdDisplayContainer *adDisplayContainer;
@property(nonatomic) UIView *adContainerView;
@property(nonatomic) id<IMAVideoDisplay> videoDisplay;
@property(nonatomic) IMAStreamManager *streamManager;
@property(nonatomic) AVPlayerViewController *playerViewController;
@property(nonatomic, getter=isAdBreakActive) BOOL adBreakActive;
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  self.view.backgroundColor = [UIColor blackColor];
  self.streamType = kDefaultStreamType;
  [self setupAdsLoader];
  [self setupPlayer];
  [self setupAdContainer];
}

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  [self requestStream];
}

- (void)setupPlayer {
  // Create a stream video player.
  AVPlayer *player = [[AVPlayer alloc] init];
  self.playerViewController = [[AVPlayerViewController alloc] init];
  self.playerViewController.player = player;

  // Attach video player to view hierarchy.
  [self addChildViewController:self.playerViewController];
  [self.view addSubview:self.playerViewController.view];
  self.playerViewController.view.frame = self.view.bounds;
  [self.playerViewController didMoveToParentViewController:self];
}

Swift

class ViewController:
  UIViewController,
  IMAAdsLoaderDelegate,
  IMAStreamManagerDelegate,
  AVPlayerViewControllerDelegate
{
  // Live stream asset key, VOD content source and video IDs, Google Ad Manager network code, and
  // backup content URL.
  static let assetKey = "c-rArva4ShKVIAkNfy6HUQ"
  static let contentSourceID = "2548831"
  static let videoID = "tears-of-steel"
  static let networkCode = "21775744923"
  static let backupStreamURLString =
    "http://googleimadev-vh.akamaihd.net/i/big_buck_bunny/bbb-,480p,720p,1080p,.mov.csmil/master.m3u8"

  var adsLoader: IMAAdsLoader?
  var videoDisplay: IMAAVPlayerVideoDisplay!
  var adDisplayContainer: IMAAdDisplayContainer?
  var adContainerView: UIView?
  private var streamManager: IMAStreamManager?
  private var contentPlayhead: IMAAVPlayerContentPlayhead?
  private var playerViewController: AVPlayerViewController!
  private var userSeekTime = 0.0
  private var adBreakActive = false

  private enum StreamType {
    case live
    /// Video on demand.
    case vod
  }

  /// Set the stream type here.
  private let currentStreamType: StreamType = .live

  deinit {
    NotificationCenter.default.removeObserver(self)
  }

  override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = UIColor.black

    setupAdsLoader()
    setupPlayer()
    setupAdContainer()
  }

  override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    requestStream()
  }

  func setupPlayer() {
    let player = AVPlayer()
    let playerViewController = AVPlayerViewController()
    playerViewController.delegate = self
    playerViewController.player = player

    // Set up our content playhead and contentComplete callback.
    contentPlayhead = IMAAVPlayerContentPlayhead(avPlayer: player)
    NotificationCenter.default.addObserver(
      self,
      selector: #selector(ViewController.contentDidFinishPlaying(_:)),
      name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
      object: player.currentItem)

    self.addChild(playerViewController)
    playerViewController.view.frame = self.view.bounds
    self.view.insertSubview(playerViewController.view, at: 0)
    playerViewController.didMove(toParent: self)
    self.playerViewController = playerViewController
  }

viewDidLoad() में, setupAdsLoader() IMAAdsLoader बनाता है, setupPlayer() AVPlayerViewController बनाता है, और setupAdContainer() विज्ञापन दिखाने के लिए UIView तैयार करता है. व्यू दिखने पर, viewDidAppear() कॉल requestStream() करके, डीएआई स्ट्रीम का अनुरोध करता है.

स्ट्रीम के अनुरोध के पैरामीटर तय करने के लिए, इस उदाहरण में कॉन्स्टेंट का इस्तेमाल किया गया है. जैसे, लाइव स्ट्रीम के लिए asset key या वीओडी स्ट्रीम के लिए content source ID और video ID. इस उदाहरण में, IMA SDK को मैनेज करने के लिए इन कॉम्पोनेंट का भी इस्तेमाल किया गया है:

  • adsLoader: यह कुकी, Google Ad Manager को स्ट्रीम के अनुरोध भेजती है. हमारा सुझाव है कि ऐप्लिकेशन के लाइफ़साइकल के लिए, एक ही इंस्टेंस का इस्तेमाल करें.
  • videoDisplay: यह IMAVideoDisplay को लागू करने का तरीका है. इससे IMA, AVPlayer का इस्तेमाल करके वीडियो चलाने की सुविधा को कंट्रोल कर सकता है. साथ ही, वीडियो चलाने से जुड़े इवेंट को ट्रैक कर सकता है.
  • adDisplayContainer: यह विज्ञापन के यूज़र इंटरफ़ेस (यूआई) एलिमेंट को रेंडर करने के लिए इस्तेमाल किए जाने वाले व्यू को मैनेज करता है. साथ ही, विज्ञापन ब्रेक के दौरान यूज़र इंटरफ़ेस (यूआई) को हैंडल करता है.
  • streamManager: यह विज्ञापन और कॉन्टेंट स्ट्रीम के कॉम्बिनेशन के प्लेबैक को मैनेज करता है. साथ ही, अपने डेलिगेट का इस्तेमाल करके विज्ञापन के लाइफ़साइकल इवेंट भेजता है.
  • playerViewController: IMA SDK मैनेज करता है कि वीडियो स्ट्रीम को दिखाने के लिए, tvOS प्लेयर का इस्तेमाल किया जाए.
  • adBreakActive: यह एक बूलियन फ़्लैग है. इससे पता चलता है कि विज्ञापन ब्रेक चल रहा है या नहीं. इसका इस्तेमाल, विज्ञापनों को स्किप करने से रोकने और यूज़र इंटरफ़ेस (यूआई) को मैनेज करने के लिए किया जाता है.

IMAAdsLoader को लागू करना

इसके बाद, IMAAdsLoader को इंस्टैंशिएट करें और विज्ञापन कंटेनर व्यू को व्यू हैरारकी से अटैच करें.

Objective-C

- (void)setupAdsLoader {
  self.adsLoader = [[IMAAdsLoader alloc] init];
  self.adsLoader.delegate = self;
}

- (void)setupAdContainer {
  // Attach the ad container to the view hierarchy on top of the player.
  self.adContainerView = [[UIView alloc] init];
  [self.view addSubview:self.adContainerView];
  self.adContainerView.frame = self.view.bounds;
  // Keep hidden initially, until an ad break.
  self.adContainerView.hidden = YES;
}

Swift

func setupAdsLoader() {
  let adsLoader = IMAAdsLoader(settings: nil)
  adsLoader.delegate = self
  self.adsLoader = adsLoader
}

func setupAdContainer() {
  // Attach the ad container to the view hierarchy on top of the player.
  let adContainerView = UIView()
  self.view.addSubview(adContainerView)
  adContainerView.frame = self.view.bounds
  // Keep hidden initially, until an ad break.
  adContainerView.isHidden = true
  self.adContainerView = adContainerView
}

स्ट्रीम करने का अनुरोध करना

स्ट्रीम की जानकारी सेव करने के लिए कुछ कॉन्स्टेंट बनाएं. इसके बाद, अनुरोध करने के लिए स्ट्रीम अनुरोध फ़ंक्शन लागू करें.

Objective-C

- (void)requestStream {
  self.videoDisplay =
      [[IMAAVPlayerVideoDisplay alloc] initWithAVPlayer:self.playerViewController.player];
  self.adDisplayContainer = [[IMAAdDisplayContainer alloc] initWithAdContainer:self.adContainerView
                                                                viewController:self];

  // Use the streamType property to determine which request to create.
  IMAStreamRequest *request;

  switch (self.streamType) {
    case StreamTypeLive: {
      request = [[IMALiveStreamRequest alloc] initWithAssetKey:kAssetKey
                                                   networkCode:kNetworkCode
                                            adDisplayContainer:self.adDisplayContainer
                                                  videoDisplay:self.videoDisplay
                                                   userContext:nil];
      NSLog(@"IMA: Requesting Live Stream with Asset Key: %@.", kAssetKey);
      break;
    }
    case StreamTypeVOD: {
      request = [[IMAVODStreamRequest alloc] initWithContentSourceID:kContentSourceID
                                                             videoID:kVideoID
                                                         networkCode:kNetworkCode
                                                  adDisplayContainer:self.adDisplayContainer
                                                        videoDisplay:self.videoDisplay
                                                         userContext:nil];
      NSLog(@"IMA: Requesting VOD Stream with Video ID: %@.", kVideoID);
      break;
    }
  }

  if (request) {
    [self.adsLoader requestStreamWithRequest:request];
  } else {
    // Fallback or error handling if no request object was created
    NSLog(@"IMA Error: Could not create stream request for unknown type.");
    [self playBackupStream];
  }
}

Swift

func requestStream() {
  guard let playerViewController = self.playerViewController else { return }
  guard let adContainerView = self.adContainerView else { return }
  guard let adsLoader = self.adsLoader else { return }

  self.videoDisplay = IMAAVPlayerVideoDisplay(avPlayer: playerViewController.player!)
  let adDisplayContainer = IMAAdDisplayContainer(
    adContainer: adContainerView, viewController: self)
  self.adDisplayContainer = adDisplayContainer

  // Variable to hold the specific stream request object.
  let request: IMAStreamRequest

  switch self.currentStreamType {
  case .live:
    // Create a live stream request.
    request = IMALiveStreamRequest(
      assetKey: ViewController.assetKey,
      networkCode: ViewController.networkCode,
      adDisplayContainer: adDisplayContainer,
      videoDisplay: self.videoDisplay,
      pictureInPictureProxy: nil,
      userContext: nil)
    print("IMA: Requesting Live Stream with asset key \(ViewController.assetKey)")

  case .vod:
    // Create a VOD stream request.
    request = IMAVODStreamRequest(
      contentSourceID: ViewController.contentSourceID,
      videoID: ViewController.videoID,
      networkCode: ViewController.networkCode,
      adDisplayContainer: adDisplayContainer,
      videoDisplay: self.videoDisplay,
      pictureInPictureProxy: nil,
      userContext: nil)
    print(
      "IMA: Requesting VOD Stream with content source ID \(ViewController.contentSourceID) and "
        + "video ID \(ViewController.videoID)")
  }

  adsLoader.requestStream(with: request)
}

स्ट्रीम इवेंट मैनेज करना

IMAAdsLoader और IMAStreamManager, ऐसे इवेंट ट्रिगर करते हैं जिनका इस्तेमाल स्ट्रीम की स्थिति में बदलाव, गड़बड़ियों, और स्ट्रीम को शुरू करने के लिए किया जाता है. ये इवेंट, IMAAdsLoaderDelegate और IMAStreamManagerDelegate प्रोटोकॉल पर फ़ायर किए जाते हैं. विज्ञापन लोड होने के इवेंट को सुनें और स्ट्रीम शुरू करें. अगर कोई विज्ञापन लोड नहीं होता है, तो उसके बदले बैकअप स्ट्रीम चलाएं.

Objective-C

- (void)playBackupStream {
  NSURL *backupStreamURL = [NSURL URLWithString:kBackupStreamURLString];
  [self.videoDisplay loadStream:backupStreamURL withSubtitles:@[]];
  [self.videoDisplay play];
  [self startMediaSession];
}

- (void)startMediaSession {
  [[AVAudioSession sharedInstance] setActive:YES error:nil];
  [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
}

#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];
}

Swift

@objc func contentDidFinishPlaying(_ notification: Notification) {
  guard let adsLoader = self.adsLoader else { return }
  adsLoader.contentComplete()
}

func startMediaSession() {
  try? AVAudioSession.sharedInstance().setActive(true, options: [])
  try? AVAudioSession.sharedInstance().setCategory(.playback)
}

// MARK: - IMAAdsLoaderDelegate

func adsLoader(_ loader: IMAAdsLoader, adsLoadedWith adsLoadedData: IMAAdsLoadedData) {
  let streamManager = adsLoadedData.streamManager!
  streamManager.delegate = self
  streamManager.initialize(with: nil)
  self.streamManager = streamManager
}

func adsLoader(_ loader: IMAAdsLoader, failedWith adErrorData: IMAAdLoadingErrorData) {
  print("Error loading ads: \(adErrorData.adError.message)")
  let streamUrl = URL(string: ViewController.backupStreamURLString)
  self.videoDisplay.loadStream(streamUrl!, withSubtitles: [])
  self.videoDisplay.play()
  playerViewController.player?.play()
}

लॉगिंग और गड़बड़ी वाले इवेंट मैनेज करना

स्ट्रीम मैनेजर डेलिगेट कई इवेंट मैनेज कर सकता है. हालांकि, बुनियादी तौर पर लागू करने के लिए, इसके सबसे अहम इस्तेमाल ये हैं: इवेंट लॉगिंग करना, विज्ञापन चलने के दौरान वीडियो को आगे-पीछे करने की कार्रवाइयों को रोकना, और गड़बड़ियों को ठीक करना.

Objective-C

#pragma mark - IMAStreamManagerDelegate

- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdEvent:(IMAAdEvent *)event {
  NSLog(@"StreamManager event (%@).", event.typeString);
  switch (event.type) {
    case kIMAAdEvent_STREAM_STARTED: {
      [self startMediaSession];
      break;
    }
    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: {
      self.adContainerView.hidden = NO;
      // Trigger an update to send focus to the ad display container.
      self.adBreakActive = YES;
      [self setNeedsFocusUpdate];
      break;
    }
    case kIMAAdEvent_AD_BREAK_ENDED: {
      self.adContainerView.hidden = YES;
      // Trigger an update to send focus to the content player.
      self.adBreakActive = NO;
      [self setNeedsFocusUpdate];
      break;
    }
    case kIMAAdEvent_ICON_FALLBACK_IMAGE_CLOSED: {
      // Resume playback after the user has closed the dialog.
      [self.videoDisplay play];
      break;
    }
    default:
      break;
  }
}

- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdError:(IMAAdError *)error {
  // Fall back to playing the backup stream.
  NSLog(@"StreamManager error: %@", error.message);
  [self playBackupStream];
}

Swift

// MARK: - IMAStreamManagerDelegate
func streamManager(_ streamManager: IMAStreamManager, didReceive event: IMAAdEvent) {
  print("StreamManager event \(event.typeString).")
  switch event.type {
  case IMAAdEventType.STREAM_STARTED:
    self.startMediaSession()
  case IMAAdEventType.STARTED:
    // Log extended data.
    if let ad = event.ad {
      let extendedAdPodInfo = String(
        format: "Showing ad %zd/%zd, bumper: %@, title: %@, "
          + "description: %@, contentType:%@, pod index: %zd, "
          + "time offset: %lf, max duration: %lf.",
        ad.adPodInfo.adPosition,
        ad.adPodInfo.totalAds,
        ad.adPodInfo.isBumper ? "YES" : "NO",
        ad.adTitle,
        ad.adDescription,
        ad.contentType,
        ad.adPodInfo.podIndex,
        ad.adPodInfo.timeOffset,
        ad.adPodInfo.maxDuration)

      print("\(extendedAdPodInfo)")
    }
    break
  case IMAAdEventType.AD_BREAK_STARTED:
    if let adContainerView = self.adContainerView {
      adContainerView.isHidden = false
    }
    // Trigger an update to send focus to the ad display container.
    adBreakActive = true
    setNeedsFocusUpdate()
    break
  case IMAAdEventType.AD_BREAK_ENDED:
    if let adContainerView = self.adContainerView {
      adContainerView.isHidden = true
    }
    // Trigger an update to send focus to the content player.
    adBreakActive = false
    setNeedsFocusUpdate()
    break
  case IMAAdEventType.ICON_FALLBACK_IMAGE_CLOSED:
    // Resume playback after the user has closed the dialog.
    self.videoDisplay.play()
    break
  default:
    break
  }
}

func streamManager(_ streamManager: IMAStreamManager, didReceive error: IMAAdError) {
  print("StreamManager error: \(error.message ?? "Unknown Error")")
}

हो गया! अब IMA DAI SDK की मदद से, विज्ञापनों का अनुरोध किया जा रहा है और उन्हें दिखाया जा रहा है. SDK की अन्य बेहतर सुविधाओं के बारे में जानने के लिए, अन्य गाइड देखें या GitHub पर मौजूद सैंपल देखें.