تُسهِّل أدوات تطوير البرامج لإعلانات الوسائط التفاعلية عملية دمج إعلانات الوسائط المتعددة في مواقعك الإلكترونية وتطبيقاتك. يمكن لحزمة تطوير البرامج لإعلانات الوسائط التفاعلية طلب إعلانات من أي خادم إعلانات متوافق مع VAST وإدارة تشغيل الإعلانات في تطبيقاتك. وباستخدام حزم تطوير البرامج من جهة العميل لإعلانات الوسائط التفاعلية يمكنك التحكّم في تشغيل فيديو المحتوى، بينما تعالج حزمة تطوير البرامج (SDK) تشغيل الإعلان. يتم تشغيل الإعلانات في مشغّل فيديو منفصلاً في أعلى مشغّل الفيديو الخاص بمحتوى التطبيق
يوضح هذا الدليل كيفية دمج حزمة تطوير البرامج لإعلانات الوسائط التفاعلية في مشغّل فيديو بسيط. التطبيق. إذا كنت ترغب في عرض أو متابعة عينة مكتملة التكامل، قم بتنزيل BasicExample من GitHub.
نظرة عامة على إعلانات الوسائط التفاعلية من جهة العميل
ويتضمّن تنفيذ إعلانات الوسائط التفاعلية من جهة العميل أربعة مكوّنات رئيسية لحزمة تطوير البرامج (SDK) هي هو موضح في هذا الدليل:
IMAAdDisplayContainer
: عنصر حاوية يتم عرض الإعلانات فيهIMAAdsLoader
: كائن يطلب الإعلانات ويتعامل مع الأحداث الواردة من الإعلانات ويطلب الردود يجب عليك فقط إنشاء مثيل برنامج تحميل إعلانات واحد، والذي يمكن إعادة استخدامه طوال عمر التطبيق.IMAAdsRequest
: كائن يحدّد طلب الإعلانات تحدد طلبات الإعلانات عنوان URL لعلامة إعلانات نموذج عرض إعلانات الفيديو (VAST) إلى جانب مَعلمات إضافية، مثل سمات الإعلاناتIMAAdsManager
: كائن يحتوي على الاستجابة لطلب الإعلانات، ويتحكم في تشغيل الإعلان، ويراقب الإعلان الأحداث التي تم تنشيطها بواسطة حزمة تطوير البرامج (SDK).
المتطلبات الأساسية
قبل البدء، تحتاج إلى ما يلي:
- Xcode 13 أو أحدث
- CocoaPods (الخيار المفضّل) أو Swift Package Manager أو نسخة تم تنزيلها من حزمة تطوير البرامج لإعلانات الوسائط التفاعلية لنظام التشغيل iOS
1. إنشاء مشروع Xcode جديد
في Xcode، أنشئ مشروع iOS جديدًا باستخدام Objective-C أو Swift. استخدام BasicExample كاسم للمشروع.
2. إضافة حزمة تطوير البرامج لإعلانات الوسائط التفاعلية إلى مشروع Xcode
تثبيت حزمة تطوير البرامج (SDK) باستخدام CocoaPods (إجراء يُنصَح به)
إنّ CocoaPods هو مدير تبعية لمشاريع Xcode، ويُنصح باستخدامه لتثبيت حزمة تطوير البرامج لإعلانات الوسائط التفاعلية. لمزيد من المعلومات حول تثبيت أو استخدام يُرجى الاطّلاع على مستندات CocoaPods. بمجرد تثبيت CocoaPods، اتّبِع التعليمات التالية لتثبيت حزمة تطوير البرامج لإعلانات الوسائط التفاعلية:
في الدليل نفسه الذي يحتوي عليه الملف BasicExample.xcodeproj، أنشئ نصًا باسم Podfile، وإضافة الإعداد التالي:
source 'https://github.com/CocoaPods/Specs.git' platform :ios, '14' target "BasicExample" do pod 'GoogleAds-IMA-iOS-SDK', '~> 3.23.0' end
من الدليل الذي يحتوي على Podfile، شغِّل
pod install --repo-update
تحقق من أن التثبيت ناجح من خلال فتح BasicExample.xcworkspace والتأكّد من أنه يحتوي على مشروعَين: BasicExample وPods (التبعيات التي تم تثبيتها من خلال CocoaPods).
تثبيت حزمة تطوير البرامج (SDK) باستخدام أداة "إدارة الحِزم" (Swift)
حزمة تطوير البرامج لإعلانات الوسائط التفاعلية تتوافق مع حزمة Swift المدير بدءًا من الإصدار 3.18.4. اتّبِع الخطوات أدناه لاستيراد حزمة Swift.
في Xcode، ثبِّت حزمة Swift لحزمة تطوير البرامج لإعلانات الوسائط التفاعلية من خلال الانتقال إلى ملف > إضافة حِزم....
في رسالة المطالبة التي تظهر، ابحث عن حزمة Swift SDK لإعلانات الوسائط التفاعلية في GitHub المستودع:
https://github.com/googleads/swift-package-manager-google-interactive-media-ads-ios
اختر إصدار حزمة Swift لحزمة تطوير البرامج لإعلانات الوسائط التفاعلية الذي تريد استخدامه. بالنسبة إلى المشاريع الجديدة، ننصح باستخدام الإصدار الرئيسي التالي.
بمجرد الانتهاء، يحل Xcode تبعيات الحزمة وينزِّلها في الخلفية. لمزيد من المعلومات حول كيفية إضافة حزمة والتبعيات، انظر مقالة Apple.
تنزيل حزمة SDK وتثبيتها يدويًا
إذا لم تكن تريد استخدام مدير حزم Swift أو 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 our 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.
الخطوات التالية
لزيادة أرباح الإعلانات على نظام iOS الأساسي، يجب طلب إذن "التتبّع وشفافية التطبيقات" لاستخدام معرّف المعلِنين (IDFA).