IMA SDK-এর মাধ্যমে আপনার ওয়েবসাইট এবং অ্যাপে মাল্টিমিডিয়া বিজ্ঞাপন যুক্ত করা সহজ। IMA SDK যেকোনো VAST-সম্মত অ্যাড সার্ভার থেকে বিজ্ঞাপনের জন্য অনুরোধ করতে পারে এবং আপনার অ্যাপে বিজ্ঞাপনের প্লেব্যাক পরিচালনা করতে পারে। IMA DAI SDK-এর সাহায্যে, অ্যাপগুলো বিজ্ঞাপন এবং কন্টেন্ট ভিডিও—উভয়ই VOD বা লাইভ কন্টেন্টের জন্য একটি স্ট্রিম অনুরোধ করে। এরপর SDK একটি সম্মিলিত ভিডিও স্ট্রিম ফেরত দেয়, ফলে আপনাকে আপনার অ্যাপের মধ্যে বিজ্ঞাপন এবং কন্টেন্ট ভিডিওর মধ্যে পরিবর্তন পরিচালনা করতে হয় না।
আপনার পছন্দের DAI সমাধানটি নির্বাচন করুন।
সম্পূর্ণ পরিষেবা DAI
এই নির্দেশিকায় একটি ভিডিও প্লেয়ার অ্যাপে IMA DAI SDK ইন্টিগ্রেট করার পদ্ধতি বর্ণনা করা হয়েছে। আপনি যদি একটি সম্পূর্ণ নমুনা ইন্টিগ্রেশন দেখতে বা অনুসরণ করতে চান, তাহলে GitHub থেকে BasicExample ডাউনলোড করুন।
আইএমএ ডিএআই ওভারভিউ
এই নির্দেশিকায় যেমন দেখানো হয়েছে, IMA DAI বাস্তবায়নে তিনটি প্রধান SDK উপাদান জড়িত:
-
IMAAdDisplayContainer: একটি কন্টেইনার অবজেক্ট যা ভিডিও প্লেব্যাক এলিমেন্টের উপরে থাকে এবং বিজ্ঞাপনের UI এলিমেন্টগুলোকে ধারণ করে। -
IMAAdsLoader: এমন একটি অবজেক্ট যা স্ট্রিমের জন্য অনুরোধ করে এবং স্ট্রিম রিকোয়েস্ট রেসপন্স অবজেক্ট দ্বারা ট্রিগার হওয়া ইভেন্টগুলো পরিচালনা করে। আপনার কেবল একটিই অ্যাডস লোডার ইনস্ট্যানশিয়েট করা উচিত, যা অ্যাপ্লিকেশনটির জীবনকাল জুড়ে পুনরায় ব্যবহার করা যায়। -
IMAStreamRequest– যা একটিIMAVODStreamRequestঅথবা একটিIMALiveStreamRequest: একটি অবজেক্ট যা একটি স্ট্রিম অনুরোধকে সংজ্ঞায়িত করে। স্ট্রিম অনুরোধগুলো ভিডিও-অন-ডিমান্ড অথবা লাইভ স্ট্রিমের জন্য হতে পারে। লাইভ স্ট্রিম অনুরোধে একটি অ্যাসেট কী নির্দিষ্ট করা থাকে, যেখানে VOD অনুরোধে একটি CMS ID এবং ভিডিও ID নির্দিষ্ট করা থাকে। উভয় ধরনের অনুরোধেই ঐচ্ছিকভাবে নির্দিষ্ট স্ট্রিমগুলো অ্যাক্সেস করার জন্য প্রয়োজনীয় একটি API কী এবং Google Ad Manager সেটিংসে নির্দিষ্ট করা বিজ্ঞাপন শনাক্তকারীগুলো পরিচালনা করার জন্য IMA SDK-এর একটি Google Ad Manager নেটওয়ার্ক কোড অন্তর্ভুক্ত থাকতে পারে। -
IMAStreamManager: একটি অবজেক্ট যা ডাইনামিক বিজ্ঞাপন সন্নিবেশ স্ট্রিম এবং DAI ব্যাকএন্ডের সাথে মিথস্ক্রিয়া পরিচালনা করে। স্ট্রিম ম্যানেজার ট্র্যাকিং পিংও পরিচালনা করে এবং স্ট্রিম ও বিজ্ঞাপন ইভেন্টগুলো পাবলিশারের কাছে ফরোয়ার্ড করে।
পূর্বশর্ত
শুরু করার আগে আপনার নিম্নলিখিত জিনিসগুলো প্রয়োজন হবে:
- Xcode 13 বা তার পরবর্তী সংস্করণ
- IMA SDK ইনস্টল করার পদ্ধতি:
- সুইফট প্যাকেজ ম্যানেজার (পছন্দনীয়)
- কোকোপড
- tvOS-এর জন্য IMA SDK- এর একটি ডাউনলোড কপি
একটি নতুন Xcode প্রজেক্ট তৈরি করুন
Xcode-এ Objective-C ব্যবহার করে একটি নতুন tvOS প্রজেক্ট তৈরি করুন। প্রজেক্টের নাম হিসেবে BasicExample ব্যবহার করুন।
Xcode প্রজেক্টে IMA DAI SDK যোগ করুন
IMA SDK ইনস্টল করতে, আপনার পছন্দের পদ্ধতিটি বেছে নিন।
সুপারিশকৃত: সুইফট প্যাকেজ ম্যানেজার ব্যবহার করে SDK ইনস্টল করুন।
ইন্টারেক্টিভ মিডিয়া অ্যাডস এসডিকে সংস্করণ ৪.৮.২ থেকে সুইফট প্যাকেজ ম্যানেজার সমর্থন করে। সুইফট প্যাকেজটি ইম্পোর্ট করতে এই ধাপগুলো অনুসরণ করুন।
Xcode-এ, File > Add Packages- এ গিয়ে GoogleInteractiveMediaAds Swift Package-টি ইনস্টল করুন।
প্রদর্শিত প্রম্পটে, GoogleInteractiveMediaAds Swift Package GitHub রিপোজিটরিটি খুঁজুন:
https://github.com/googleads/swift-package-manager-google-interactive-media-ads-tvosআপনি GoogleInteractiveMediaAds Swift Package-এর যে সংস্করণটি ব্যবহার করতে চান, তা নির্বাচন করুন। নতুন প্রোজেক্টের জন্য, আমরা Up to Next Major Version ব্যবহার করার পরামর্শ দিই।
আপনার কাজ শেষ হলে, Xcode আপনার প্যাকেজ নির্ভরতাগুলো সমাধান করে এবং ব্যাকগ্রাউন্ডে সেগুলো ডাউনলোড করে নেয়। প্যাকেজ নির্ভরতা কীভাবে যোগ করতে হয়, সে সম্পর্কে আরও বিস্তারিত জানতে Apple-এর নিবন্ধটি দেখুন।
CocoaPods ব্যবহার করে SDK ইনস্টল করুন
CocoaPods হলো Xcode প্রোজেক্টের জন্য একটি ডিপেন্ডেন্সি ম্যানেজার এবং IMA DAI SDK ইনস্টল করার জন্য এটিই প্রস্তাবিত পদ্ধতি। CocoaPods ইনস্টল বা ব্যবহার করার বিষয়ে আরও তথ্যের জন্য, CocoaPods ডকুমেন্টেশন দেখুন। CocoaPods ইনস্টল হয়ে গেলে, IMA DAI SDK ইনস্টল করার জন্য নিম্নলিখিত নির্দেশাবলী ব্যবহার করুন:
আপনার BasicExample.xcodeproj ফাইলটি যে ডিরেক্টরিতে আছে, সেই একই ডিরেক্টরিতে Podfile নামে একটি টেক্সট ফাইল তৈরি করুন এবং নিম্নলিখিত কনফিগারেশনটি যোগ করুন:
source 'https://github.com/CocoaPods/Specs.git' platform :tvos, '15' project 'BasicExample.xcodeproj' target "BasicExample" do pod 'GoogleAds-IMA-tvOS-SDK', '~> 4.16.0' endযে ডিরেক্টরিতে Podfile রয়েছে, সেখান থেকে চালান:
pod install --repo-updateBasicExample.xcworkspace ফাইলটি খুলে এবং এতে BasicExample ও Pods (CocoaPods দ্বারা ইনস্টল করা ডিপেন্ডেন্সি) নামে দুটি প্রজেক্ট রয়েছে কিনা তা নিশ্চিত করে ইনস্টলেশন সফল হয়েছে কিনা যাচাই করুন।
ম্যানুয়ালি SDK ডাউনলোড এবং ইনস্টল করা
আপনি যদি সুইফট প্যাকেজ ম্যানেজার ব্যবহার করতে না চান, তাহলে IMA 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: গুগল অ্যাড ম্যানেজারের স্ট্রিম রিকোয়েস্টগুলো পরিচালনা করে। আমরা অ্যাপটির লাইফসাইকেলের জন্য এর একটিমাত্র ইনস্ট্যান্স ব্যবহার করার পরামর্শ দিই। -
videoDisplay:IMAVideoDisplayএকটি বাস্তবায়ন, যা IMA-কে AVPlayer ব্যবহার করে ভিডিও প্লেব্যাক নিয়ন্ত্রণ করতে এবং প্লেব্যাক ইভেন্ট ট্র্যাক করতে সক্ষম করে। -
adDisplayContainer: বিজ্ঞাপনের UI উপাদানগুলো রেন্ডার করতে এবং বিজ্ঞাপন বিরতির সময় UI ফোকাস পরিচালনা করতে ব্যবহৃত ভিউটি নিয়ন্ত্রণ করে। -
streamManager: সম্মিলিত বিজ্ঞাপন এবং কন্টেন্ট স্ট্রিমের প্লেব্যাক পরিচালনা করে এবং এর ডেলিগেট ব্যবহার করে বিজ্ঞাপনের লাইফসাইকেল ইভেন্ট পাঠায়। -
playerViewController: IMA SDK দ্বারা পরিচালিত ভিডিও স্ট্রিমটি প্রদর্শন করতে ব্যবহৃত tvOS প্লেয়ার। -
adBreakActive: একটি বুলিয়ান ফ্ল্যাগ যা নির্দেশ করে কোনো বিজ্ঞাপন বিরতি চলছে কিনা। এটি বিজ্ঞাপনের উপর দিয়ে স্ক্রল হওয়া (seeking) প্রতিরোধ করতে এবং 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 প্রোটোকলের মাধ্যমে ফায়ার হয়। একটি 'ads loaded' ইভেন্টের জন্য অপেক্ষা করুন এবং স্ট্রিমটি শুরু করুন। যদি কোনো বিজ্ঞাপন লোড হতে ব্যর্থ হয়, তবে তার পরিবর্তে একটি ব্যাকআপ স্ট্রিম চালান।
উদ্দেশ্য-সি
- (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-এ থাকা নমুনাগুলো দেখুন।

