IMA SDK গুলি আপনার ওয়েবসাইট এবং অ্যাপগুলিতে মাল্টিমিডিয়া বিজ্ঞাপনগুলিকে একীভূত করা সহজ করে তোলে। IMA SDK গুলি যেকোনো VAST-সম্মত বিজ্ঞাপন সার্ভার থেকে বিজ্ঞাপনের অনুরোধ করতে পারে এবং আপনার অ্যাপগুলিতে বিজ্ঞাপন প্লেব্যাক পরিচালনা করতে পারে। IMA DAI SDK গুলির সাহায্যে, অ্যাপগুলি বিজ্ঞাপন এবং কন্টেন্ট ভিডিওর জন্য একটি স্ট্রিম অনুরোধ করে—হয় VOD অথবা লাইভ কন্টেন্ট। SDK তারপর একটি সম্মিলিত ভিডিও স্ট্রিম প্রদান করে, যাতে আপনাকে আপনার অ্যাপের মধ্যে বিজ্ঞাপন এবং কন্টেন্ট ভিডিওর মধ্যে স্যুইচ করার ব্যবস্থা করতে না হয়।
আপনার আগ্রহের DAI সমাধানটি নির্বাচন করুন।
পূর্ণাঙ্গ পরিষেবা DAI
এই নির্দেশিকাটি IMA DAI SDK কে একটি সাধারণ ভিডিও প্লেয়ার অ্যাপের সাথে কীভাবে একীভূত করতে হয় তা দেখায়। আপনি যদি একটি সম্পূর্ণ নমুনা একীভূতকরণ দেখতে বা অনুসরণ করতে চান, তাহলে GitHub থেকে BasicExample ডাউনলোড করুন।
IMA DAI ওভারভিউ
IMA DAI বাস্তবায়নে তিনটি প্রধান SDK উপাদান জড়িত, যেমনটি এই নির্দেশিকায় দেখানো হয়েছে:
-
IMAAdDisplayContainer: একটি কন্টেইনার অবজেক্ট যা ভিডিও প্লেব্যাক এলিমেন্টের উপরে থাকে এবং বিজ্ঞাপন UI এলিমেন্টগুলিকে ধারণ করে। -
IMAAdsLoader: এমন একটি অবজেক্ট যা স্ট্রিম অনুরোধ করে এবং স্ট্রিম অনুরোধ প্রতিক্রিয়া অবজেক্ট দ্বারা ট্রিগার হওয়া ইভেন্টগুলি পরিচালনা করে। আপনার কেবল একটি বিজ্ঞাপন লোডার চালু করা উচিত, যা অ্যাপ্লিকেশনের পুরো সময় জুড়ে পুনরায় ব্যবহার করা যেতে পারে। -
IMAStreamRequest– হয় একটিIMAVODStreamRequestঅথবা একটিIMALiveStreamRequest: একটি অবজেক্ট যা একটি স্ট্রিম অনুরোধকে সংজ্ঞায়িত করে। স্ট্রিম অনুরোধগুলি ভিডিও-অন-ডিমান্ড বা লাইভ স্ট্রিমের জন্য হতে পারে। লাইভ স্ট্রিম অনুরোধগুলি একটি সম্পদ কী নির্দিষ্ট করে, যখন VOD অনুরোধগুলি একটি CMS আইডি এবং ভিডিও আইডি নির্দিষ্ট করে। উভয় অনুরোধের ধরণে ঐচ্ছিকভাবে নির্দিষ্ট স্ট্রিমগুলি অ্যাক্সেস করার জন্য প্রয়োজনীয় একটি API কী এবং Google বিজ্ঞাপন ম্যানেজার সেটিংসে নির্দিষ্ট বিজ্ঞাপন শনাক্তকারী পরিচালনা করার জন্য IMA SDK-এর জন্য একটি Google বিজ্ঞাপন ম্যানেজার নেটওয়ার্ক কোড অন্তর্ভুক্ত থাকতে পারে। -
IMAStreamManager: একটি অবজেক্ট যা DAI ব্যাকএন্ডের সাথে গতিশীল বিজ্ঞাপন সন্নিবেশ স্ট্রিম এবং ইন্টারঅ্যাকশন পরিচালনা করে। স্ট্রিম ম্যানেজার ট্র্যাকিং পিংগুলিও পরিচালনা করে এবং স্ট্রিম এবং বিজ্ঞাপন ইভেন্টগুলি প্রকাশকের কাছে ফরোয়ার্ড করে।
পূর্বশর্ত
শুরু করার আগে, আপনার নিম্নলিখিতগুলি প্রয়োজন:
- এক্সকোড ১৩ বা তার পরবর্তী সংস্করণ
- সুইফট প্যাকেজ ম্যানেজার , কোকোপডস , অথবা টিভিওএসের জন্য আইএমএ ডিএআই এসডিকে -এর ডাউনলোড করা কপি
একটি নতুন Xcode প্রকল্প তৈরি করুন
In Xcode, create a new tvOS project using Objective-C. Use BasicExample as the project name.
Xcode প্রজেক্টে IMA DAI SDK যোগ করুন
IMA DAI SDK ইনস্টল করতে এই তিনটি পদ্ধতির যেকোনো একটি ব্যবহার করুন।
সুইফট প্যাকেজ ম্যানেজার ব্যবহার করে SDK ইনস্টল করুন
ইন্টারেক্টিভ মিডিয়া বিজ্ঞাপন SDK 4.8.2 সংস্করণ থেকে সুইফট প্যাকেজ ম্যানেজার সমর্থন করে। সুইফট প্যাকেজ আমদানি করতে এই পদক্ষেপগুলি অনুসরণ করুন।
Xcode-এ, File > Add Packages- এ নেভিগেট করে GoogleInteractiveMediaAds Swift প্যাকেজটি ইনস্টল করুন।
প্রদর্শিত প্রম্পটে, GoogleInteractiveMediaAds Swift Package GitHub সংগ্রহস্থলটি অনুসন্ধান করুন:
https://github.com/googleads/swift-package-manager-google-interactive-media-ads-tvosSelect the version of the GoogleInteractiveMediaAds Swift Package you want to use. For new projects, we recommend using the Up to Next Major Version .
আপনার কাজ শেষ হয়ে গেলে, Xcode আপনার প্যাকেজ নির্ভরতা সমাধান করে এবং ব্যাকগ্রাউন্ডে ডাউনলোড করে। প্যাকেজ নির্ভরতা কীভাবে যোগ করবেন সে সম্পর্কে আরও তথ্যের জন্য, Apple এর নিবন্ধটি দেখুন।
CocoaPods ব্যবহার করে SDK ইনস্টল করুন
CocoaPods হল Xcode প্রকল্পের জন্য একটি নির্ভরতা ব্যবস্থাপক এবং IMA DAI SDK ইনস্টল করার জন্য এটি প্রস্তাবিত পদ্ধতি। CocoaPods ইনস্টল বা ব্যবহার সম্পর্কে আরও তথ্যের জন্য, CocoaPods ডকুমেন্টেশন দেখুন। CocoaPods ইনস্টল হয়ে গেলে, IMA DAI SDK ইনস্টল করতে নিম্নলিখিত নির্দেশাবলী ব্যবহার করুন:
In the same directory as your BasicExample.xcodeproj file, create a text file called Podfile , and add the following configuration:
source 'https://github.com/CocoaPods/Specs.git' platform :tvos, '15' target "BasicExample" do pod 'GoogleAds-IMA-tvOS-SDK', '~> 4.16.0' endপডফাইল ধারণকারী ডিরেক্টরি থেকে, চালান:
pod install --repo-updateইনস্টলেশনটি সফল হয়েছে কিনা তা যাচাই করতে BasicExample.xcworkspace ফাইলটি খুলে নিশ্চিত করুন যে এতে দুটি প্রকল্প রয়েছে: BasicExample এবং Pods (CocoaPods দ্বারা ইনস্টল করা নির্ভরতা)।
SDK ম্যানুয়ালি ডাউনলোড এবং ইনস্টল করা
আপনি যদি Swift Package Manager বা CocoaPods ব্যবহার করতে না চান, তাহলে আপনি IMA DAI SDK ডাউনলোড করে ম্যানুয়ালি আপনার প্রোজেক্টে যোগ করতে পারেন।
IMA SDK আমদানি করুন
একটি ইম্পোর্ট স্টেটমেন্ট ব্যবহার করে IMA ফ্রেমওয়ার্ক যোগ করুন:
অবজেক্টিভ-সি
#import "ViewController.h"
#import <AVKit/AVKit.h>
@import GoogleInteractiveMediaAds;
সুইফট
import AVFoundation
import GoogleInteractiveMediaAds
import UIKit
একটি ভিডিও প্লেয়ার তৈরি করুন এবং IMA SDK ইন্টিগ্রেট করুন
নিম্নলিখিত উদাহরণটি IMA SDK আরম্ভ করে:
অবজেক্টিভ-সি
// 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];
}
সুইফট
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() DAI স্ট্রিমটি অনুরোধ করার জন্য requestStream() কে কল করে।
স্ট্রিম অনুরোধের প্যারামিটার নির্ধারণ করতে, এই উদাহরণে লাইভ স্ট্রিমের জন্য asset key , অথবা VOD স্ট্রিমের জন্য content source ID এবং video ID মতো ধ্রুবক ব্যবহার করা হয়েছে। উদাহরণটিতে IMA SDK পরিচালনা করার জন্য নিম্নলিখিত উপাদানগুলিও ব্যবহার করা হয়েছে:
-
adsLoader: Google Ad Manager-এ স্ট্রিম অনুরোধ পরিচালনা করে। আমরা অ্যাপের জীবনচক্রের জন্য একটি একক উদাহরণ ব্যবহার করার পরামর্শ দিচ্ছি। -
videoDisplay: একটিIMAVideoDisplayবাস্তবায়ন যা IMA কে AVPlayer ব্যবহার করে ভিডিও প্লেব্যাক নিয়ন্ত্রণ করতে এবং প্লেব্যাক ইভেন্টগুলি ট্র্যাক করতে দেয়। -
adDisplayContainer: বিজ্ঞাপন বিরতির সময় বিজ্ঞাপন UI উপাদান রেন্ডার করার জন্য এবং UI ফোকাস পরিচালনা করার জন্য ব্যবহৃত ভিউ পরিচালনা করে। -
streamManager: সম্মিলিত বিজ্ঞাপন এবং কন্টেন্ট স্ট্রিমের প্লেব্যাক পরিচালনা করে এবং এর প্রতিনিধি ব্যবহার করে বিজ্ঞাপন জীবনচক্র ইভেন্ট পাঠায়। -
playerViewController: IMA SDK দ্বারা পরিচালিত ভিডিও স্ট্রিম উপস্থাপনের জন্য tvOS প্লেয়ারটি ব্যবহৃত হত। -
adBreakActive: একটি বুলিয়ান ফ্ল্যাগ যা নির্দেশ করে যে কোনও বিজ্ঞাপন বিরতি চলছে কিনা, যা বিজ্ঞাপনের উপর নজর রাখা রোধ করতে এবং UI ফোকাস পরিচালনা করতে ব্যবহৃত হয়।
IMAAdsLoader বাস্তবায়ন করুন
এরপর, IMAAdsLoader ইনস্ট্যান্ট করুন এবং ভিউ হায়ারার্কির সাথে বিজ্ঞাপন কন্টেইনার ভিউ সংযুক্ত করুন।
অবজেক্টিভ-সি
- (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;
}
সুইফট
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
}
একটি স্ট্রিম অনুরোধ করুন
স্ট্রিম তথ্য ধরে রাখার জন্য কয়েকটি ধ্রুবক তৈরি করুন এবং তারপর অনুরোধটি করার জন্য স্ট্রিম অনুরোধ ফাংশনটি বাস্তবায়ন করুন।
অবজেক্টিভ-সি
- (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];
}
}
সুইফট
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 প্রোটোকলের মাধ্যমে ফায়ার করা হয়। বিজ্ঞাপন লোড করা ইভেন্টটি শুনুন এবং স্ট্রিমটি ইনিশিয়ালাইজ করুন। যদি কোনও বিজ্ঞাপন লোড না হয়, তাহলে পরিবর্তে একটি ব্যাকআপ স্ট্রিম চালান।
অবজেক্টিভ-সি
- (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];
}
সুইফট
@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()
}
লগিং এবং ত্রুটির ঘটনাগুলি পরিচালনা করুন
স্ট্রিম ম্যানেজার ডেলিগেট দ্বারা বেশ কিছু ইভেন্ট পরিচালনা করা যেতে পারে, তবে মৌলিক বাস্তবায়নের জন্য, সবচেয়ে গুরুত্বপূর্ণ ব্যবহার হল ইভেন্ট লগিং করা, বিজ্ঞাপন চালানোর সময় সিক অ্যাকশন প্রতিরোধ করা এবং ত্রুটিগুলি পরিচালনা করা।
অবজেক্টিভ-সি
#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];
}
সুইফট
// 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-এর অন্যান্য নির্দেশিকা বা নমুনাগুলি দেখুন।

