فرمت‌های تبلیغاتی بومی سفارشی

قالب های تبلیغاتی سفارشی

مانند همتایان تعریف‌شده توسط سیستم، قالب‌های تبلیغات بومی سفارشی با استفاده از اشیاء GADAdLoader بارگیری می‌شوند. گنجاندن ثابت GADAdLoaderAdTypeCustomNative در آرایه adTypes هنگام مقداردهی اولیه GADAdLoader آن را برای درخواست فرمت های بومی سفارشی هنگام بارگیری تبلیغات پیکربندی می کند.

GADCustomNativeAdLoaderDelegate

پروتکل برای بارگذاری فرمت های سفارشی دو روش دارد. اولین مورد توسط GADAdLoader برای پیدا کردن شناسه های فرمت مورد استفاده قرار می گیرد:

سویفت

public func customNativeAdFormatIDs(for adLoader: GADAdLoader) -> [Any]

هدف-C

- (NSArray *)customNativeAdFormatIDsForAdLoader:(GADAdLoader *)adLoader;

هر قالب تبلیغات بومی سفارشی دارای شناسه قالب مربوطه است که آن را شناسایی می کند. هنگامی که این روش فراخوانی می شود، برنامه شما باید آرایه ای حاوی شناسه قالب تبلیغاتی را که برای نمایش آماده شده است، برگرداند.

پیام دوم زمانی ارسال می‌شود که تبلیغ بومی سفارشی بارگیری شود، بسیار شبیه به فرمت‌های تعریف‌شده توسط سیستم:

سویفت

public func adLoader(_ adLoader: GADAdLoader,
    didReceive customNativeAd: GADCustomNativeAd)

هدف-C

- (void)adLoader:(GADAdLoader *)adLoader
    didReceiveCustomNativeAd:(GADCustomNativeAd *)customNativeAd;

فرمت شناسه ها

شناسه‌های قالبی که برای ارجاع منحصربه‌فرد به قالب‌های تبلیغات بومی سفارشی استفاده می‌شوند را می‌توان در رابط کاربری Ad Manager در بخش Native در منوی کشویی Delivery پیدا کرد:

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

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

نمایش فرمت های تبلیغاتی بومی سفارشی

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

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

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

MySimpleNativeAdView.h

سویفت

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: GADCustomNativeAd) {
    ...
  }
}

هدف-C

@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 (گزیده)

سویفت

...
func populateWithCustomNativeAd(_ customNativeAd: GADCustomNativeAd) {
  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")
}
...

هدف-C

...
- (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 را نمایش می دهد و رفتار کلیک مناسب را پیکربندی می کند.

سویفت

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:
      GADNativeAssetIdentifier.adChoicesViewAsset.rawValue)
  }

  func populate(withCustomNativeAd customNativeAd: GADCustomNativeAd) {

    // Render the AdChoices image.
    let adChoicesKey = GADNativeAssetIdentifier.adChoicesViewAsset.rawValue
    let adChoicesImage = customNativeAd.image(forKey: adChoicesKey)?.image
    adChoicesView.image = adChoicesImage
    adChoicesView.isHidden = adChoicesImage == nil
    ...
  }
}

هدف-C

@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 برای دریافت نمای ویدیو استفاده کنید. سپس این نما را به سلسله مراتب نمای خود اضافه کنید. اگر تبلیغ محتوای ویدیویی ندارد، برنامه‌های دیگری را برای نمایش آگهی بدون ویدیو تنظیم کنید.

مثال زیر بررسی می‌کند که آیا تبلیغ محتوای ویدیویی دارد یا خیر، و اگر ویدیو در دسترس نباشد، تصویری را در جای خود نمایش می‌دهد:

سویفت

...
  /// Populates the ad view with the custom native ad object.
  func populate(withCustomNativeAd customNativeAd: GADCustomNativeAd) {
    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]()))
  }
...

هدف-C

...
- (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 را برای مثالی از ویدیوی بومی در عمل دانلود کنید.

مدیریت کلیک ها و نمایش های تبلیغاتی بومی سفارشی

برای قالب‌های تبلیغات بومی سفارشی، برنامه شما مسئول ثبت نمایش‌ها و گزارش رویدادهای کلیک به SDK است.

ثبت برداشت ها

برای ثبت یک نمایش برای یک تبلیغ بومی سفارشی، فقط روش recordImpression را در GADCustomNativeAd مربوطه فراخوانی کنید:

سویفت

myCustomNativeAd.recordImpression()

هدف-C

[myCustomNativeAd recordImpression];

SDK از ثبت نمایش‌های تکراری برای یک درخواست منفرد جلوگیری می‌کند، اگر برنامه‌تان به‌طور تصادفی چندین بار برای یک تبلیغ این روش را فراخوانی کند.

گزارش کلیک

برای گزارش به SDK مبنی بر اینکه کلیک روی نمای دارایی رخ داده است، متد performClickOnAssetWithKey: را در GADCustomNativeAd مربوطه فراخوانی کنید و نام دارایی روی آن کلیک کنید. به عنوان مثال، اگر دارایی در قالب سفارشی خود به نام "MainImage" داشته باشید و بخواهید کلیک روی نمای مربوط به آن دارایی را گزارش دهید، کد شما به شکل زیر خواهد بود:

سویفت

myCustomNativeAd.performClickOnAsset(withKey: "MainImage")

هدف-C

[myCustomNativeAd performClickOnAssetWithKey:@"MainImage"];

توجه داشته باشید که لازم نیست این روش را برای هر نمای دارایی مرتبط با تبلیغ خود فراخوانی کنید. به عنوان مثال، اگر دارایی دیگری به نام «Caption» داشتید که قرار بود نمایش داده شود اما کاربر روی آن کلیک یا ضربه نزند، برنامه شما نیازی به فراخوانی performClickOnAssetWithKey: برای آن نمایش ندارد.

پاسخ به اقدامات کلیک سفارشی

GADCustomNativeAd دارای یک ویژگی customClickHandler است که از نوع GADNativeAdCustomClickHandler است.

سویفت

typealias GADNativeAdCustomClickHandler = (assetID: String) -> Void

هدف-C

typedef void (^GADNativeAdCustomClickHandler)(NSString *assetID);

این یک بلوک (Objective-C) / بسته شدن (Swift) است که assetID به عنوان پارامتر ورودی می پذیرد، که دارایی را که روی آن کلیک شده است شناسایی می کند.

هنگامی که یک کلیک روی یک تبلیغ بومی سفارشی انجام می شود، سه پاسخ ممکن از SDK وجود دارد که به این ترتیب تلاش می شود:

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

ویژگی customClickHandler یک بلوک در Objective-C و یک بسته در Swift را می پذیرد. اگر یک بلوک یا بسته را تنظیم کنید، SDK آن را اجرا می کند و هیچ اقدام دیگری انجام نمی دهد. با این حال، اگر مقدار صفر را تعیین کنید، SDK به پیوند عمیق و/یا نشانی‌های اینترنتی مقصد ثبت‌شده در آگهی بازمی‌گردد.

کنترل‌کننده‌های کلیک سفارشی به برنامه شما اجازه می‌دهند بهترین اقدام را در پاسخ به کلیک انجام دهد، چه به‌روزرسانی رابط کاربری، ارائه کنترل‌کننده مشاهده دیگر یا صرفاً ثبت کلیک. در اینجا یک مثال است که یک هشدار را نشان می دهد:

سویفت

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")

هدف-C

[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

برای ارائه نمونه تبلیغات نصب برنامه و محتوا و همچنین یک قالب آگهی بومی سفارشی با دارایی های زیر پیکربندی شده است:

  • عنوان (متن)
  • تصویر اصلی (تصویر)
  • عنوان (متن)

تبلیغات پشتیبان بومی

برای آزمایش رفتار تبلیغات پشتیبان بومی، از این واحد تبلیغاتی Ad Manager استفاده کنید:

/21775744923/example/native-backfill

این نمونه تبلیغات نصب برنامه و محتوایی را ارائه می دهد که شامل همپوشانی AdChoices است.

به یاد داشته باشید قبل از پخش زنده، کد خود را به روز کنید تا به واحد تبلیغات واقعی و شناسه های قالب خود مراجعه کنید!