قالبهای آگهی سفارشی
قالبهای آگهی بومی سفارشی، مانند همتایان تعریفشده توسط سیستم، بااستفاده از اشیای GADAdLoader بار میشوند. گنجاندن ثابت
GADAdLoaderAdTypeCustomNative در آرایه adTypes هنگام
مقداردهی اولیه GADAdLoader آن را پیکربندی میکند تا هنگام بار کردن آگهیها، قالبهای بومی سفارشی را درخواست کند.
GADCustomNativeAdLoaderDelegate
پروتکل بار کردن قالبهای سفارشی دو روش دارد. اولی توسط
GADAdLoader استفاده میشود تا بفهمد کدام شناسههای قالب را باید درخواست کند:
Swift
public func customNativeAdFormatIDs(for adLoader: AdLoader) -> [Any]
آبجکتیو-سی
- (NSArray *)customNativeAdFormatIDsForAdLoader:(AdLoader *)adLoader;
هر قالب آگهی بومی سفارشی یک شناسه قالب متناظر دارد که آن را شناسایی میکند. وقتی این روش فراخوانی میشود، برنامهتان باید آرایهای حاوی شناسههای قالب آگهیهایی که برای نمایش آماده کرده است برگرداند.
پیام دوم زمانی ارسال میشود که آگهی بومی سفارشی بار شده باشد، بسیار شبیه به پیامهای مربوط به قالبهای تعریفشده توسط سیستم:
Swift
public func adLoader(_ adLoader: AdLoader, didReceive customNativeAd: CustomNativeAd)
آبجکتیو-سی
- (void)adLoader:(AdLoader *)adLoader didReceiveCustomNativeAd:(CustomNativeAd *)customNativeAd;
شناسههای قالب
شناسههای قالبی که برای ارجاع منحصربهفرد به قالبهای آگهی بومی سفارشی استفاده میشوند را میتوانید در واسط کاربری «مدیر آگهی» در بخش بومی در منو کرکرهای تحویل پیدا کنید:

شناسه قالب هر آگهی بومی سفارشی در کنار نام آن نشان داده میشود. با کلیک کردن روی یکی از نامها، به صفحه جزئیات میروید که اطلاعاتی درباره فیلدهای قالب نشان میدهد:

از اینجا میتوانید فیلدهای تکی را اضافه، ویرایش، و حذف کنید. نام هریک از داراییها را یادداشت کنید. نام کلیدی است که برای دریافت دادههای هر دارایی هنگام نمایش قالب آگهی بومی سفارشی شما استفاده میشود.
نمایش قالبهای آگهی بومی سفارشی
قالبهای آگهی بومی سفارشی با قالبهای تعریفشده توسط سیستم تفاوت دارند زیرا ناشران میتوانند فهرست داراییهای خود را که آگهی را تشکیل میدهند تعریف کنند. به همین دلیل، فرایند نمایش آگهیهای بومی سفارشی از چند جهت با فرایند قالبهای تعریفشده توسط سیستم متفاوت است:
- چون
GADCustomNativeAdبرای مدیریت هریک از قالبهای آگهی بومی سفارشی که ایجاد میکنید طراحی شده است، دسترسیدهنده دارایی نامگذاریشده ندارد. درعوض، روشهایی مثلimageForKey:وstringForKey:را ارائه میدهد که نام فیلد را بهعنوان آرگومان میگیرند. - هیچ کلاس اختصاصی نمای آگهی مانند
GADNativeAdViewبرای استفاده باGADCustomNativeAdوجود ندارد. میتوانید از هر نمایی که برای تجربه کاربری شما مناسب است استفاده کنید. - چون کلاس اختصاصی برای نمای آگهی وجود ندارد، لازم نیست هیچکدام از نماهایی را که برای نمایش داراییهای آگهی استفاده میکنید ثبت کنید.
در اینجا نمونهای از نمای آگهی آورده شده است که میتواند آگهی بومی سفارشی سادهای را نمایش دهد:
MySimpleNativeAdView.h
Swift
import UIKit import GoogleMobileAds /// Custom native ad view class with format ID 10063170. class MySimpleNativeAdView: UIView { /// Weak references to this ad's asset views. @IBOutlet weak var headlineView: UILabel! @IBOutlet weak var mainImageView: UIImageView! @IBOutlet weak var captionView: UILabel! ... /// Populates the ad view with the custom native ad object. func populateWithCustomNativeAd(_ customNativeAd: CustomNativeAd) { ... } }
آبجکتیو-سی
@import UIKit; @import GoogleMobileAds; /// View representing a custom native ad format with format ID 10063170. @interface MySimpleNativeAdView : UIView // Weak references to this ad's asset views. @property(weak, nonatomic) IBOutlet UILabel *headlineView; @property(weak, nonatomic) IBOutlet UIImageView *mainImageView; @property(weak, nonatomic) IBOutlet UILabel *captionView; /// Populates the ad view with the custom native ad object. - (void)populateWithCustomNativeAd:(GADCustomNativeAd *)customNativeAd; @end
MySimpleNativeAdView.m (excerpt)
Swift
... func populateWithCustomNativeAd(_ customNativeAd: CustomNativeAd) { self.customNativeAd = customNativeAd // Populate the custom native ad assets. headlineView.text = self.customNativeAd.stringForKey("Headline") mainImageView.image = self.customNativeAd.imageForKey("MainImage")?.image captionView.text = self.customNativeAd.stringForKey("Caption") } ...
آبجکتیو-سی
... - (void)populateWithCustomNativeAd:(GADCustomNativeAd *)customNativeAd { self.customNativeAd = customNativeAd; // Populate the custom native ad assets. self.headlineView.text = [customNativeAd stringForKey:@"Headline"]; self.mainImageView.image = [customNativeAd imageForKey:@"MainImage"].image; self.captionView.text = [customNativeAd stringForKey:@"Caption"]; } ...
پرداز زدن نماد AdChoices
بهعنوان بخشی از پشتیبانی از «قانون خدمات دیجیتال» (DSA)، آگهیهای رزرو ارائهشده در «منطقه اقتصادی اروپا» (EEA) به نماد AdChoices و پیوندی به صفحه «درباره این آگهی» Google نیاز دارند. هنگام پیادهسازی آگهیهای بومی سفارشی، شما مسئول رندر کردن نماد AdChoices هستید. مهم است که هنگام ارائه داراییهای اصلی آگهی، اقداماتی را برای ارائه و تنظیم شنونده کلیک برای نماد AdChoices انجام دهید.
مثال زیر نماد AdChoices را ارائه میدهد و رفتار کلیک مناسب را پیکربندی میکند.
Swift
class MySimpleNativeAdView: UIView {
@IBOutlet weak var adChoicesView: UIImageView!
override func awakeFromNib() {
super.awakeFromNib()
// Enable clicks on AdChoices.
adChoicesView.addGestureRecognizer(
UITapGestureRecognizer(
target: self,
action: #selector(performClickOnAdChoices(_:))))
adChoicesView.isUserInteractionEnabled = true
}
@objc func performClickOnAdChoices(_ sender: UIImage!) {
customNativeAd.performClickOnAsset(withKey:
NativeAssetIdentifier.adChoicesViewAsset.rawValue)
}
func populate(withCustomNativeAd customNativeAd: CustomNativeAd) {
// Render the AdChoices image.
let adChoicesKey = NativeAssetIdentifier.adChoicesViewAsset.rawValue
let adChoicesImage = customNativeAd.image(forKey: adChoicesKey)?.image
adChoicesView.image = adChoicesImage
adChoicesView.isHidden = adChoicesImage == nil
...
}
}
آبجکتیو-سی
@interface MySimpleNativeAdView ()
@property(nonatomic, weak) IBOutlet UIImageView *adChoicesView;
@end
@implementation MySimpleNativeAdView
- (void)awakeFromNib {
[super awakeFromNib];
// Enable clicks on AdChoices.
[self.adChoicesView addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(performClickOnAdChoices:)]];
self.adChoicesView.userInteractionEnabled = YES;
}
- (void)performClickOnAdChoices:(UITapGestureRecognizer *)sender {
[self.customNativeAd performClickOnAssetWithKey:GADNativeAdChoicesViewAsset];
}
- (void)populateWithCustomNativeAd:(GADCustomNativeAd *)customNativeAd {
// Render the AdChoices image.
GADNativeAdImage *adChoicesAsset = [customNativeAd
imageForKey:GADNativeAdChoicesViewAsset];
self.adChoicesView.image = adChoicesAsset.image;
self.adChoicesView.hidden = (adChoicesAsset == nil);
...
}
ویدیو بومی برای قالبهای آگهی بومی سفارشی
هنگام ایجاد قالب سفارشی، میتوانید قالب را برای ویدیو واجدشرایط کنید.
در پیادهسازی برنامهتان، میتوانید از ویژگی
GADCustomNativeAd.mediaView
برای دریافت نمای ویدیو استفاده کنید. سپس این نما را به سلسلهمراتب نمای خود اضافه کنید. اگر آگهی محتوای ویدیویی ندارد، برنامههای جایگزین برای نمایش آگهی بدون ویدیو ایجاد کنید.
مثال زیر بررسی میکند که آیا آگهی محتوای ویدیویی دارد یا نه، و اگر ویدیو دردسترس نباشد، تصویری را بهجای آن نمایش میدهد:
Swift
... /// Populates the ad view with the custom native ad object. func populate(withCustomNativeAd customNativeAd: CustomNativeAd) { if customNativeAd.videoController.hasVideoContent(), let mediaView = customNativeAd.mediaView { updateMainView(mediaView) } else { // Assumes your native format has an image asset with the name MainImage. let image: UIImage? = customNativeAd.image(forKey: "MainImage")?.image updateMainView(UIImageView(image: image)) } } private func updateMainView(_ mainView:UIView) { // Assumes you have a placeholder view for your media content. // Remove all the placeholder's subviews. for subview: UIView in mainPlaceholder.subviews { subview.removeFromSuperview() } mainPlaceholder.addSubview(mainView) // Size the media view to fill our container size. mainView.translatesAutoresizingMaskIntoConstraints = false let viewDictionary: [AnyHashable: Any] = ["mainView":mainView] mainPlaceholder.addConstraints(NSLayoutConstraint.constraints( withVisualFormat: "H:|[mainView]|", options: [], metrics: nil, views: viewDictionary as? [String : Any] ?? [String : Any]())) mainPlaceholder.addConstraints(NSLayoutConstraint.constraints( withVisualFormat: "V:|[mainView]|", options: [], metrics: nil, views: viewDictionary as? [String : Any] ?? [String : Any]())) } ...
آبجکتیو-سی
... - (void)populateWithCustomNativeAd:(GADCustomNativeAd *)ad { UIView *mainView = nil; if (ad.videoController.hasVideoContent) { mainView = ad.mediaView; } else { // Assumes your native format has an image asset with the name MainImage. UIImage *image = [ad imageForKey:@"MainImage"].image; mainView = [[UIImageView alloc] initWithImage:image]; } // Assumes you have a placeholder view for your media content. for (UIView *subview in self.mainPlaceholder.subviews) { [subview removeFromSuperview]; } [self.mainPlaceholder addSubview:mainView]; // Size the main view to fill our container size. [mainView setTranslatesAutoresizingMaskIntoConstraints:NO]; NSDictionary *viewDictionary = NSDictionaryOfVariableBindings(mainView); [self.mainPlaceholder addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[mainView]|" options:0 metrics:nil views:viewDictionary]]; } ...
برای اطلاعات بیشتر درباره نحوه سفارشیسازی تجربه ویدیویی آگهی بومی سفارشی، GADVideoController را ببینید.
برای مشاهده نمونهای از ویدیو بومی درحال اجرا، نمونه Ad Manager Custom Rendering را بارگیری کنید.
مدیریت کلیکها و ظهورهای آگهی بومی سفارشی
برای قالبهای آگهی بومی سفارشی، برنامه شما مسئول ثبت ظهورها و گزارش رویدادهای کلیک به کیت توسعه نرمافزار است.
درحال ضبط ظهورها
برای ثبت ظهور برای آگهی بومی سفارشی، کافی است روش
recordImpression را در GADCustomNativeAd مربوطه فراخوانی کنید:
Swift
myCustomNativeAd.recordImpression()
آبجکتیو-سی
[myCustomNativeAd recordImpression];
کیت توسعه نرمافزار از ثبت شدن ظهورهای تکراری برای یک درخواست جلوگیری میکند، اگر برنامهتان بهطور تصادفی این روش را چندین بار برای یک آگهی فراخوانی کند.
کلیکهای گزارش تخلف
برای گزارش دادن به کیت توسعه نرمافزار مبنی بر اینکه کلیکی روی نمای دارایی انجام شده است،
روش performClickOnAssetWithKey: را در
GADCustomNativeAd مربوطه فراخوانی کنید و نام داراییای را که روی آن کلیک شده است ارسال کنید.
برای مثال، اگر داراییای در قالب سفارشیتان با نام «MainImage» داشتید
و میخواستید کلیک روی نمای مربوط به آن دارایی را گزارش کنید،
کد شما به این شکل خواهد بود:
Swift
myCustomNativeAd.performClickOnAsset(withKey: "MainImage")
آبجکتیو-سی
[myCustomNativeAd performClickOnAssetWithKey:@"MainImage"];
توجه داشته باشید که لازم نیست این روش را برای هر نمای دارایی مرتبط با آگهیتان فراخوانی کنید. برای مثال، اگر دارایی دیگری بهنام «زیرنویس ناشنوایان» داشتید که قرار بود نمایش داده شود اما کاربر روی آن کلیک یا تکضرب نمیزد، برنامهتان نیازی به فراخوانی performClickOnAssetWithKey: برای آن نما نداشت.
پاسخ دادن به کنشهای کلیک سفارشی
GADCustomNativeAd دارای ویژگی customClickHandler است که از نوع
GADNativeAdCustomClickHandler است
Swift
typealias NativeAdCustomClickHandler = (assetID: String) -> Void
آبجکتیو-سی
typedef void (^GADNativeAdCustomClickHandler)(NSString *assetID);
این یک بلوک (Objective-C) / بسته (Swift) است که assetID را بهعنوان پارامتر ورودی میپذیرد، که داراییای را که روی آن کلیک شده است شناسایی میکند.
وقتی روی آگهی بومی سفارشی کلیک میشود، سه پاسخ احتمالی از کیت توسعه نرمافزار وجود دارد که بهترتیب زیر انجام میشود:
- اگر بلوک
customClickHandlerدر Objective-C یا closure در Swift تنظیم شده است، آن را فراخوانی کنید. - در میان نشانیهای وب Deeplink آگهی حلقه بزنید و اولین نشانی وبی را که برنامه منطبقی برای آن پیدا میشود باز کنید.
- مرورگری را باز کنید و به «نشانی وب مقصد» سنتی آگهی بروید.
خصوصیت customClickHandler یک بلوک را در Objective-C و یک closure را در Swift میپذیرد. اگر مسدودسازی یا بستن را تنظیم کنید، کیت توسعه نرمافزار آن را اجرا میکند و اقدام دیگری
انجام نمیدهد. اما اگر مقدار nil تنظیم کنید، کیت توسعه نرمافزار به پیوند عمیق
و/یا نشانیهای وب مقصد ثبتشده با آگهی برمیگردد.
مدیریتکنندههای کلیک سفارشی به برنامه شما امکان میدهند تا خودش بهترین کنش را برای پاسخ به کلیک تصمیم بگیرد، خواه بهروزرسانی میانای کاربر باشد، ارائه یک کنترلکننده نمای دیگر، یا صرفاً ثبت کلیک. در اینجا مثالی آورده شده است که هشدار را نشان میدهد:
Swift
myCustomNativeAd.customClickHandler = { assetID in if assetID == "MainImage" { let alertView = UIAlertView(title: "Custom Click", message: "You just clicked on the image!", delegate: self, cancelButtonTitle: "OK") alertView.alertViewStyle = .default alertView.show() } } myCustomNativeAd.performClickOnAsset(withKey: "MainImage")
آبجکتیو-سی
[self.customNativeAd setCustomClickHandler:^(NSString *assetID){ if ([assetID isEqualToString:@"MainImage"]) { [[[UIAlertView alloc] initWithTitle:@"Custom Click" message:@"You just clicked on the image!" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; } }]; [self.customNativeAd performClickOnAssetWithKey:@"MainImage"];
درحال آزمایش کد آگهی بومی
آگهیهای فروختهشده مستقیم
اگر میخواهید آگهیهای بومی فروش مستقیم را امتحان کنید، میتوانید از این شناسه واحد آگهی Ad Manager استفاده کنید:
/21775744923/example/native
این برنامه برای ارائه آگهیهای نمونه نصب برنامه و محتوا، و همچنین قالب آگهی بومی سفارشی با داراییهای زیر پیکربندی شده است:
- Headline (text)
- MainImage (image)
- زیرنویس (نوشتار)
آگهیهای بومی پرکننده
برای آزمایش رفتار آگهیهای پر کردن فضای بومی، از این واحد آگهی Ad Manager استفاده کنید:
/21775744923/example/native-backfill
این برنامه نمونه آگهیهای نصب برنامه و محتوا را ارائه خواهد کرد که شامل همپوشانی AdChoices است.
بهیاد داشته باشید که پیشاز فعال شدن، کدتان را بهروز کنید تا به شناسههای واحد آگهی و قالب واقعیتان ارجاع دهد!