استفاده از قالب‌های آگهی بومی سفارشی

پلاتفرم را انتخاب کنید: Android iOS Android (قدیمی)

قالب‌های آگهی سفارشی

قالب‌های آگهی بومی سفارشی، مانند همتایان تعریف‌شده توسط سیستم، بااستفاده از اشیای 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;

شناسه‌های قالب

شناسه‌های قالبی که برای ارجاع منحصربه‌فرد به قالب‌های آگهی بومی سفارشی استفاده می‌شوند را می‌توانید در واسط کاربری «مدیر آگهی» در بخش بومی در منو کرکره‌ای تحویل پیدا کنید:

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

از اینجا می‌توانید فیلدهای تکی را اضافه، ویرایش، و حذف کنید. نام هریک از دارایی‌ها را یادداشت کنید. نام کلیدی است که برای دریافت داده‌های هر دارایی هنگام نمایش قالب آگهی بومی سفارشی شما استفاده می‌شود.

نمایش قالب‌های آگهی بومی سفارشی

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

  1. چون GADCustomNativeAd برای مدیریت هریک از قالب‌های آگهی بومی سفارشی که ایجاد می‌کنید طراحی شده است، دسترسی‌دهنده دارایی نام‌گذاری‌شده ندارد. درعوض، روش‌هایی مثل imageForKey: و stringForKey: را ارائه می‌دهد که نام فیلد را به‌عنوان آرگومان می‌گیرند.
  2. هیچ کلاس اختصاصی نمای آگهی مانند GADNativeAdView برای استفاده با GADCustomNativeAd وجود ندارد. می‌توانید از هر نمایی که برای تجربه کاربری شما مناسب است استفاده کنید.
  3. چون کلاس اختصاصی برای نمای آگهی وجود ندارد، لازم نیست هیچ‌کدام از نماهایی را که برای نمایش دارایی‌های آگهی استفاده می‌کنید ثبت کنید.

در اینجا نمونه‌ای از نمای آگهی آورده شده است که می‌تواند آگهی بومی سفارشی ساده‌ای را نمایش دهد:

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 را به‌عنوان پارامتر ورودی می‌پذیرد، که دارایی‌ای را که روی آن کلیک شده است شناسایی می‌کند.

وقتی روی آگهی بومی سفارشی کلیک می‌شود، سه پاسخ احتمالی از کیت توسعه نرم‌افزار وجود دارد که به‌ترتیب زیر انجام می‌شود:

  1. اگر بلوک customClickHandler در Objective-C یا closure در Swift تنظیم شده است، آن را فراخوانی کنید.
  2. در میان نشانی‌های وب Deeplink آگهی حلقه بزنید و اولین نشانی وبی را که برنامه منطبقی برای آن پیدا می‌شود باز کنید.
  3. مرورگری را باز کنید و به «نشانی وب مقصد» سنتی آگهی بروید.

خصوصیت 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 است.

به‌یاد داشته باشید که پیش‌از فعال شدن، کدتان را به‌روز کنید تا به شناسه‌های واحد آگهی و قالب واقعی‌تان ارجاع دهد!