المتطلبات الأساسية
أكمِل إعداد الأحداث المخصّصة.
طلب إعلان مدمج مع المحتوى
عند الوصول إلى عنصر الحدث المخصّص في سلسلة توسّط العرض الإعلاني بدون انقطاع،
يتم استدعاءthe loadNativeAd:adConfiguration:completionHandler:
method إلى اسم الفئة الذي قدّمته عند
إنشاء حدث مخصّص. في هذه الحالة، تكون هذه الطريقة في SampleCustomEvent
، والتي تستدعي
the loadNativeAd:adConfiguration:completionHandler:
method في SampleCustomEventNative
.
لطلب إعلان مدمج مع المحتوى، يُرجى إنشاء أو تعديل فئة تنفِّذ GADMediationAdapter
وloadNativeAd:adConfiguration:completionHandler:
. في حال توفّر فئة تضيف GADMediationAdapter
، يمكنك تنفيذ loadNativeAd:adConfiguration:completionHandler:
في تلك الفئة. بالإضافة إلى ذلك، يمكنك إنشاء
فئة جديدة لتنفيذ علامة GADMediationNativeAd
.
في مثال الحدث المخصّص،
SampleCustomEvent
تنفّذ
the GADMediationAdapter
interface ثم تفوض إلى
SampleCustomEventNative
.
Swift
import GoogleMobileAds class SampleCustomEvent: NSObject, GADMediationAdapter { fileprivate var nativeAd: SampleCustomEventNativeAd? func loadNativeAd( for adConfiguration: GADMediationNativeAdConfiguration, completionHandler: @escaping GADMediationNativeAdLoadCompletionHandler ) { self.nativeAd = SampleCustomEventNativeAd() self.nativeAd?.loadNativeAd( for: adConfiguration, completionHandler: completionHandler) } }
Objective-C
#import "SampleCustomEvent.h" @implementation SampleCustomEvent SampleCustomEventNativeAd *sampleNativeAd; - (void)loadNativeAdForAdConfiguration: (GADMediationNativeAdConfiguration *)adConfiguration completionHandler: (GADMediationNativeAdLoadCompletionHandler) completionHandler { sampleNative = [[SampleCustomEventNativeAd alloc] init]; [sampleNative loadNativeAdForAdConfiguration:adConfiguration completionHandler:completionHandler]; }
"SampleCustomEventNative
" مسؤول عن المهام التالية:
جارٍ تحميل الإعلان المدمج مع المحتوى
تنفيذ
GADMediationNativeAd
protocolتلقّي طلبات معاودة الاتصال بأحداث الإعلانات وإعداد تقارير عنها في "حزمة تطوير البرامج (SDK) لإعلانات Google على الأجهزة الجوّالة"
يتم تضمين المعلمة الاختيارية المحددة في Ad Manager واجهة المستخدم
في إعداد الإعلان.
يمكن الوصول إلى المَعلمة من خلال
adConfiguration.credentials.settings[@"parameter"]
. عادةً ما تكون هذه المَعلمة
معرّف وحدة إعلانية تطلبه حزمة تطوير البرامج (SDK) لشبكة الإعلانات عند
تحديد كائن إعلان.
Swift
class SampleCustomEventNativeAd: NSObject, GADMediationNativeAd { /// The Sample Ad Network native ad. var nativeAd: SampleNativeAd? /// The ad event delegate to forward ad rendering events to the Google Mobile /// Ads SDK. var delegate: GADMediationNativeAdEventDelegate? /// Completion handler called after ad load var completionHandler: GADMediationNativeLoadCompletionHandler? func loadNativeAd( for adConfiguration: GADMediationNativeAdConfiguration, completionHandler: @escaping GADMediationNativeLoadCompletionHandler ) { let adLoader = SampleNativeAdLoader() let sampleRequest = SampleNativeAdRequest() // The Google Mobile Ads SDK requires the image assets to be downloaded // automatically unless the publisher specifies otherwise by using the // GADNativeAdImageAdLoaderOptions object's disableImageLoading property. If // your network doesn't have an option like this and instead only ever // returns URLs for images (rather than the images themselves), your adapter // should download image assets on behalf of the publisher. This should be // done after receiving the native ad object from your network's SDK, and // before calling the connector's adapter:didReceiveMediatedNativeAd: method. sampleRequest.shouldDownloadImages = true sampleRequest.preferredImageOrientation = NativeAdImageOrientation.any sampleRequest.shouldRequestMultipleImages = false let options = adConfiguration.options for loaderOptions: GADAdLoaderOptions in options { if let imageOptions = loaderOptions as? GADNativeAdImageAdLoaderOptions { sampleRequest.shouldRequestMultipleImages = imageOptions.shouldRequestMultipleImages // If the GADNativeAdImageAdLoaderOptions' disableImageLoading property is // YES, the adapter should send just the URLs for the images. sampleRequest.shouldDownloadImages = !imageOptions.disableImageLoading } else if let mediaOptions = loaderOptions as? GADNativeAdMediaAdLoaderOptions { switch mediaOptions.mediaAspectRatio { case GADMediaAspectRatio.landscape: sampleRequest.preferredImageOrientation = NativeAdImageOrientation.landscape case GADMediaAspectRatio.portrait: sampleRequest.preferredImageOrientation = NativeAdImageOrientation.portrait default: sampleRequest.preferredImageOrientation = NativeAdImageOrientation.any } } } // This custom event uses the server parameter to carry an ad unit ID, which // is the most common use case. adLoader.delegate = self adLoader.adUnitID = adConfiguration.credentials.settings["parameter"] as? String self.completionHandler = completionHandler adLoader.fetchAd(sampleRequest) } }
Objective-C
#import "SampleCustomEventNativeAd.h" @interface SampleCustomEventNativeAd () <SampleNativeAdDelegate, GADMediationNativeAd> { /// The sample native ad. SampleNativeAd *_nativeAd; /// The completion handler to call when the ad loading succeeds or fails. GADMediationNativeLoadCompletionHandler _loadCompletionHandler; /// The ad event delegate to forward ad rendering events to the Google Mobile /// Ads SDK. id<GADMediationNativeAdEventDelegate> _adEventDelegate; } @end - (void)loadNativeAdForAdConfiguration: (GADMediationNativeAdConfiguration *)adConfiguration completionHandler:(GADMediationNativeLoadCompletionHandler) completionHandler { __block atomic_flag completionHandlerCalled = ATOMIC_FLAG_INIT; __block GADMediationNativeLoadCompletionHandler originalCompletionHandler = [completionHandler copy]; _loadCompletionHandler = ^id<GADMediationNativeAdEventDelegate>( _Nullable id<GADMediationNativeAd> ad, NSError *_Nullable error) { // Only allow completion handler to be called once. if (atomic_flag_test_and_set(&completionHandlerCalled)) { return nil; } id<GADMediationNativeAdEventDelegate> delegate = nil; if (originalCompletionHandler) { // Call original handler and hold on to its return value. delegate = originalCompletionHandler(ad, error); } // Release reference to handler. Objects retained by the handler will also // be released. originalCompletionHandler = nil; return delegate; }; SampleNativeAdLoader *adLoader = [[SampleNativeAdLoader alloc] init]; SampleNativeAdRequest *sampleRequest = [[SampleNativeAdRequest alloc] init]; // The Google Mobile Ads SDK requires the image assets to be downloaded // automatically unless the publisher specifies otherwise by using the // GADNativeAdImageAdLoaderOptions object's disableImageLoading property. If // your network doesn't have an option like this and instead only ever returns // URLs for images (rather than the images themselves), your adapter should // download image assets on behalf of the publisher. This should be done after // receiving the native ad object from your network's SDK, and before calling // the connector's adapter:didReceiveMediatedNativeAd: method. sampleRequest.shouldDownloadImages = YES; sampleRequest.preferredImageOrientation = NativeAdImageOrientationAny; sampleRequest.shouldRequestMultipleImages = NO; sampleRequest.testMode = adConfiguration.isTestRequest; for (GADAdLoaderOptions *loaderOptions in adConfiguration.options) { if ([loaderOptions isKindOfClass:[GADNativeAdImageAdLoaderOptions class]]) { GADNativeAdImageAdLoaderOptions *imageOptions = (GADNativeAdImageAdLoaderOptions *)loaderOptions; sampleRequest.shouldRequestMultipleImages = imageOptions.shouldRequestMultipleImages; // If the GADNativeAdImageAdLoaderOptions' disableImageLoading property is // YES, the adapter should send just the URLs for the images. sampleRequest.shouldDownloadImages = !imageOptions.disableImageLoading; } else if ([loaderOptions isKindOfClass:[GADNativeAdMediaAdLoaderOptions class]]) { GADNativeAdMediaAdLoaderOptions *mediaOptions = (GADNativeAdMediaAdLoaderOptions *)loaderOptions; switch (mediaOptions.mediaAspectRatio) { case GADMediaAspectRatioLandscape: sampleRequest.preferredImageOrientation = NativeAdImageOrientationLandscape; break; case GADMediaAspectRatioPortrait: sampleRequest.preferredImageOrientation = NativeAdImageOrientationPortrait; break; default: sampleRequest.preferredImageOrientation = NativeAdImageOrientationAny; break; } } else if ([loaderOptions isKindOfClass:[GADNativeAdViewAdOptions class]]) { _nativeAdViewAdOptions = (GADNativeAdViewAdOptions *)loaderOptions; } } // This custom event uses the server parameter to carry an ad unit ID, which // is the most common use case. NSString *adUnit = adConfiguration.credentials.settings[@"parameter"]; adLoader.adUnitID = adUnit; adLoader.delegate = self; [adLoader fetchAd:sampleRequest]; }
سواء تم استرجاع الإعلان بنجاح أو واجه خطأً، يمكنك طلب GADMediationNativeAdLoadCompletionHandler
. في حال النجاح، استخدِم الفئة التي تنفِّذ GADMediationNativeAd
مع استخدام القيمة nil
لمَعلمة الخطأ. وفي حال تعذُّر إتمام العملية، يمكنك عرض الخطأ الذي واجهته.
عادةً ما يتم تنفيذ هذه الطرق داخل عمليات معاودة الاتصال من حزمة تطوير البرامج (SDK) التابعة لجهة خارجية التي ينفِّذها المحوِّل. في هذا المثال، تحتوي عيّنة SDK
على SampleNativeAdDelegate
مع استدعاءات ذات صلة:
Swift
func adLoader( _ adLoader: SampleNativeAdLoader, didReceive nativeAd: SampleNativeAd ) { extraAssets = [ SampleCustomEventConstantsSwift.awesomenessKey: nativeAd.degreeOfAwesomeness ?? "" ] if let image = nativeAd.image { images = [GADNativeAdImage(image: image)] } else { let imageUrl = URL(fileURLWithPath: nativeAd.imageURL) images = [GADNativeAdImage(url: imageUrl, scale: nativeAd.imageScale)] } if let mappedIcon = nativeAd.icon { icon = GADNativeAdImage(image: mappedIcon) } else { let iconURL = URL(fileURLWithPath: nativeAd.iconURL) icon = GADNativeAdImage(url: iconURL, scale: nativeAd.iconScale) } adChoicesView = SampleAdInfoView() self.nativeAd = nativeAd if let handler = completionHandler { delegate = handler(self, nil) } } func adLoader( _ adLoader: SampleNativeAdLoader, didFailToLoadAdWith errorCode: SampleErrorCode ) { let error = SampleCustomEventUtilsSwift.SampleCustomEventErrorWithCodeAndDescription( code: SampleCustomEventErrorCodeSwift .SampleCustomEventErrorAdLoadFailureCallback, description: "Sample SDK returned an ad load failure callback with error code: \(errorCode)" ) if let handler = completionHandler { delegate = handler(nil, error) } }
Objective-C
- (void)adLoader:(SampleNativeAdLoader *)adLoader didReceiveNativeAd:(SampleNativeAd *)nativeAd { if (nativeAd.image) { _images = @[ [[GADNativeAdImage alloc] initWithImage:nativeAd.image] ]; } else { NSURL *imageURL = [[NSURL alloc] initFileURLWithPath:nativeAd.imageURL]; _images = @[ [[GADNativeAdImage alloc] initWithURL:imageURL scale:nativeAd.imageScale] ]; } if (nativeAd.icon) { _icon = [[GADNativeAdImage alloc] initWithImage:nativeAd.icon]; } else { NSURL *iconURL = [[NSURL alloc] initFileURLWithPath:nativeAd.iconURL]; _icon = [[GADNativeAdImage alloc] initWithURL:iconURL scale:nativeAd.iconScale]; } // The sample SDK provides an AdChoices view (SampleAdInfoView). If your SDK // provides image and click through URLs for its AdChoices icon instead of an // actual UIView, the adapter is responsible for downloading the icon image // and creating the AdChoices icon view. _adChoicesView = [[SampleAdInfoView alloc] init]; _nativeAd = nativeAd; _adEventDelegate = _loadCompletionHandler(self, nil); } - (void)adLoader:(SampleNativeAdLoader *)adLoader didFailToLoadAdWithErrorCode:(SampleErrorCode)errorCode { NSError *error = SampleCustomEventErrorWithCodeAndDescription( SampleCustomEventErrorAdLoadFailureCallback, [NSString stringWithFormat:@"Sample SDK returned an ad load failure " @"callback with error code: %@", errorCode]); _adEventDelegate = _loadCompletionHandler(nil, error); }
تعيين الإعلانات المدمجة مع المحتوى
تحتوي حِزم SDK المختلفة على أشكال فريدة خاصة بها للإعلانات المدمجة مع المحتوى. على سبيل المثال، قد يعرض أحدهما كائنات تحتوي على حقل "title"، بينما قد يحتوي عنصر آخر على "headline". بالإضافة إلى ذلك، يمكن أن تختلف الطرق المستخدمة لتتبع مرات الظهور ومعالجة النقرات من حزمة SDK إلى أخرى.
لحل هذه المشاكل، عندما يتلقّى حدث مخصّص عنصر إعلان مدمج مع المحتوى من حزمة تطوير البرامج (SDK) المستندة إلى التوسّط، يجب أن يستخدم فئة تنفِّذ GADMediationNativeAd
، مثل SampleCustomEventNativeAd
، من أجل "ربط" كائن الإعلان المدمج مع المحتوى في حزمة تطوير البرامج (SDK) المعتمَدة على التوسّط بحيث يتطابق مع الواجهة المتوقعة من حزمة "SDK لإعلانات Google على الأجهزة الجوّالة".
نلقي الآن نظرة فاحصة على تفاصيل تنفيذ
SampleCustomEventNativeAd
.
تخزين تعييناتك
من المتوقّع أن ينفِّذ GADMediationNativeAd
بعض الخصائص التي يتم ربطها من خصائص حزمة تطوير البرامج (SDK) الأخرى:
Swift
var nativeAd: SampleNativeAd? var headline: String? { return nativeAd?.headline } var images: [GADNativeAdImage]? var body: String? { return nativeAd?.body } var icon: GADNativeAdImage? var callToAction: String? { return nativeAd?.callToAction } var starRating: NSDecimalNumber? { return nativeAd?.starRating } var store: String? { return nativeAd?.store } var price: String? { return nativeAd?.price } var advertiser: String? { return nativeAd?.advertiser } var extraAssets: [String: Any]? { return [ SampleCustomEventConstantsSwift.awesomenessKey: nativeAd?.degreeOfAwesomeness ?? "" ] } var adChoicesView: UIView? var mediaView: UIView? { return nativeAd?.mediaView }
Objective-C
/// Used to store the ad's images. In order to implement the /// GADMediationNativeAd protocol, we use this class to return the images /// property. NSArray<GADNativeAdImage *> *_images; /// Used to store the ad's icon. In order to implement the GADMediationNativeAd /// protocol, we use this class to return the icon property. GADNativeAdImage *_icon; /// Used to store the ad's ad choices view. In order to implement the /// GADMediationNativeAd protocol, we use this class to return the adChoicesView /// property. UIView *_adChoicesView; - (nullable NSString *)headline { return _nativeAd.headline; } - (nullable NSArray<GADNativeAdImage *> *)images { return _images; } - (nullable NSString *)body { return _nativeAd.body; } - (nullable GADNativeAdImage *)icon { return _icon; } - (nullable NSString *)callToAction { return _nativeAd.callToAction; } - (nullable NSDecimalNumber *)starRating { return _nativeAd.starRating; } - (nullable NSString *)store { return _nativeAd.store; } - (nullable NSString *)price { return _nativeAd.price; } - (nullable NSString *)advertiser { return _nativeAd.advertiser; } - (nullable NSDictionary<NSString *, id> *)extraAssets { return @{SampleCustomEventExtraKeyAwesomeness : _nativeAd.degreeOfAwesomeness}; } - (nullable UIView *)adChoicesView { return _adChoicesView; } - (nullable UIView *)mediaView { return _nativeAd.mediaView; } - (BOOL)hasVideoContent { return self.mediaView != nil; }
يمكن أن توفر بعض الشبكات التي تعتمد على التوسّط مواد عرض إضافية غير تلك المحدّدة في "حزمة تطوير البرامج (SDK) لإعلانات Google على الأجهزة الجوّالة". يتضمّن بروتوكول GADMediationNativeAd
طريقة تُسمى extraAssets
تستخدمها حزمة "SDK لإعلانات Google على الأجهزة الجوّالة" لاسترداد أي من مواد العرض "الإضافية" هذه من مصمم الخرائط.
ربط مواد عرض الصور
إنّ ربط مواد عرض الصور أكثر تعقيدًا من ربط أنواع بيانات أبسط مثل NSString
أو double
. قد يتم تنزيل الصور تلقائيًا أو
إرجاعها كقيم عنوان URL. وقد تتفاوت كثافة وحدات البكسل أيضًا.
لمساعدتك في إدارة هذه التفاصيل، توفّر حزمة "SDK لإعلانات Google على الأجهزة الجوّالة" الفئة
GADNativeAdImage
. يجب عرض معلومات مواد عرض الصور (سواء كانت كائنات UIImage
فعلية أو قيم NSURL
فقط) إلى حزمة SDK لإعلانات Google على الأجهزة الجوّالة
باستخدام هذه الفئة.
في ما يلي كيفية معالجة فئة مصمم الخرائط لإنشاء GADNativeAdImage
لعرض صورة الرمز:
Swift
if let image = nativeAd.image { images = [GADNativeAdImage(image: image)] } else { let imageUrl = URL(fileURLWithPath: nativeAd.imageURL) images = [GADNativeAdImage(url: imageUrl, scale: nativeAd.imageScale)] }
Objective-C
if (nativeAd.image) { _images = @[ [[GADNativeAdImage alloc] initWithImage:nativeAd.image] ]; } else { NSURL *imageURL = [[NSURL alloc] initFileURLWithPath:nativeAd.imageURL]; _images = @[ [[GADNativeAdImage alloc] initWithURL:imageURL scale:nativeAd.imageScale] ]; }
الأحداث الناتجة عن مرات الظهور والنقرات
تحتاج كل من حزمة "SDK لإعلانات Google على الأجهزة الجوّالة" وحزمة تطوير البرامج (SDK) المستندة إلى التوسّط إلى معرفة وقت حدوث مرة ظهور أو نقرة، ولكن تحتاج حزمة SDK واحدة فقط إلى تتبُّع هذه الأحداث. هناك أسلوبان مختلفان يمكن أن تستخدِمهما الأحداث المخصّصة، اعتمادًا على ما إذا كانت حزمة تطوير البرامج (SDK) المستندة إلى التوسّط تتيح تتبُّع مرات الظهور والنقرات بمفردها.
تتبُّع النقرات ومرّات الظهور باستخدام "SDK لإعلانات Google على الأجهزة الجوّالة"
إذا لم تنفِّذ حزمة SDK المعتمَدة على التوسّط تتبُّع مرات الظهور والنقرات الخاصة بها، ولكنها
توفّر طرقًا لتسجيل النقرات ومرات الظهور، يمكن لحزمة SDK لإعلانات Google على الأجهزة الجوّالة تتبُّع هذه الأحداث وإرسال إشعار إلى المحوّل.
GADMediationNativeAd
protocol تتضمن طريقتين:
didRecordImpression:
و didRecordClickOnAssetWithName:view:viewController:
يمكن
للأحداث المخصّصة تنفيذهما لاستدعاء الطريقة المقابلة في عنصر الإعلان المدمج مع التوسط:
Swift
func didRecordImpression() { nativeAd?.recordImpression() } func didRecordClickOnAsset( withName assetName: GADUnifiedNativeAssetIdentifier, view: UIView, wController: UIViewController ) { nativeAd?.handleClick(on: view) }
Objective-C
- (void)didRecordImpression { if (self.nativeAd) { [self.nativeAd recordImpression]; } } - (void)didRecordClickOnAssetWithName:(GADUnifiedNativeAssetIdentifier)assetName view:(UIView *)view viewController:(UIViewController *)viewController { if (self.nativeAd) { [self.nativeAd handleClickOnView:view]; } }
وبما أنّ الفئة التي تنفّذ GADMediationNativeAd
protocolالبروتوكول تشير إلى كائن الإعلان المدمج مع المحتوى في "نموذج حزمة تطوير البرامج (SDK)"، يمكنها استدعاء الطريقة المناسبة في ذلك العنصر للإبلاغ عن نقرة أو مرة ظهور. تجدر الإشارة إلى أنّ الطريقة
didRecordClickOnAssetWithName:view:viewController:
تأخذ معلَمة واحدة، وهي الكائن View
المطابق لمادة عرض الإعلان المدمج مع المحتوى التي تلقت النقرة.
تتبُّع النقرات ومرات الظهور باستخدام حزمة تطوير البرامج (SDK) المستندة إلى التوسّط
قد تُفضِّل بعض حِزم SDK المستندة إلى التوسّط تتبُّع النقرات ومرات الظهور من تلقاء نفسها. في هذه الحالة، عليك تنفيذ الطريقتَين handlesUserClicks
وhandlesUserImpressions
كما هو موضّح في المقتطف أدناه. يعني عرض
YES
أنّك تشير إلى أنّ الحدث المخصّص يتحمل مسؤولية تتبُّع هذه الأحداث، وسيتم إرسال إشعار إلى حزمة "SDK لإعلانات Google على الأجهزة الجوّالة" عند وقوع هذه الأحداث.
يمكن للأحداث المخصّصة التي تلغي تتبُّع النقرات ومرات الظهور استخدام الرسالة
didRenderInView:
لتمرير عرض الإعلان المدمج مع المحتوى إلى كائن الإعلانات المدمجة مع المحتوى في حزمة تطوير البرامج (SDK) المستندة إلى التوسّط للسماح لحزمة تطوير البرامج (SDK) المستندة إلى التوسّط بتنفيذ التتبّع الفعلي. إنّ نموذج حزمة تطوير البرامج (SDK) من مشروعنا كمثال على الأحداث المخصّصة (الذي تم أخذ مقتطفات الرمز
منه في هذا الدليل) لا يستخدم هذه الطريقة، ولكن إذا استخدمه رمز الحدث المخصّص، سيستدعي طريقة setNativeAdView:view:
كما هو موضّح في المقتطف أدناه:
Swift
func handlesUserClicks() -> Bool { return true } func handlesUserImpressions() -> Bool { return true } func didRender( in view: UIView, clickableAssetViews: [GADNativeAssetIdentifier: UIView], nonclickableAssetViews: [GADNativeAssetIdentifier: UIView], viewController: UIViewController ) { // This method is called when the native ad view is rendered. Here you would pass the UIView // back to the mediated network's SDK. self.nativeAd?.setNativeAdView(view) }
Objective-C
- (BOOL)handlesUserClicks { return YES; } - (BOOL)handlesUserImpressions { return YES; } - (void)didRenderInView:(UIView *)view clickableAssetViews:(NSDictionary<GADNativeAssetIdentifier, UIView *> *) clickableAssetViews nonclickableAssetViews:(NSDictionary<GADNativeAssetIdentifier, UIView *> *) nonclickableAssetViews viewController:(UIViewController *)viewController { // This method is called when the native ad view is rendered. Here you would // pass the UIView back to the mediated network's SDK. Playing video using // SampleNativeAd's playVideo method [_nativeAd setNativeAdView:view]; }
إعادة توجيه أحداث التوسّط إلى "حزمة تطوير البرامج (SDK) لإعلانات Google على الأجهزة الجوّالة"
بعد استدعاء GADMediationNativeLoadCompletionHandler
مع إعلان تم تحميله، يمكن للمحوِّل استخدام عنصر التفويض GADMediationNativeAdEventDelegate
الذي تم عرضه من خلال المحوِّل لإعادة توجيه أحداث العروض التقديمية من حزمة تطوير البرامج (SDK) التابعة لجهة خارجية إلى حزمة "SDK لإعلانات Google على الأجهزة الجوّالة".
ومن المهمّ أن يعيد الحدث المخصّص توجيه أكبر عدد ممكن من عمليات معاودة الاتصال هذه، لكي يتلقّى تطبيقك هذه الأحداث المكافئة من "SDK لإعلانات Google على الأجهزة الجوّالة". في ما يلي مثال على استخدام عمليات معاودة الاتصال:
يُكمل هذا تنفيذ الأحداث المخصّصة للإعلانات المدمجة مع المحتوى. المثال الكامل متاح على GitHub.