Как использовать специальные форматы нативных объявлений

Выберите платформу: Android iOS Android (устаревшая версия)

Специальные форматы объявлений

Как и системные форматы, специальные форматы нативных объявлений загружаются с помощью объектов GADAdLoader. Если при инициализации GADAdLoader добавить константу GADAdLoaderAdTypeCustomNative в массив adTypes, то при загрузке объявлений будет запрашиваться специальный формат нативных объявлений.

GADCustomNativeAdLoaderDelegate

Протокол загрузки специальных форматов включает два метода. Первый используется в GADAdLoader, чтобы определить, какие идентификаторы форматов нужно запросить:

Swift

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

Objective-C

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

У каждого специального формата нативного объявления есть идентификатор, Когда вызывается этот метод, приложение должно возвращать массив, содержащий идентификаторы форматов объявлений, которые оно готово показывать.

Второе сообщение отправляется после загрузки специального нативного объявления, как и в случае с системными форматами:

Swift

public func adLoader(_ adLoader: AdLoader,
    didReceive customNativeAd: CustomNativeAd)

Objective-C

- (void)adLoader:(AdLoader *)adLoader
    didReceiveCustomNativeAd:(CustomNativeAd *)customNativeAd;

Идентификаторы форматов

Идентификаторы форматов, которые используются для уникальной идентификации специальных форматов нативных объявлений, можно найти в интерфейсе Менеджера рекламы в разделе Нативные раскрывающегося меню Показ:

Идентификатор формата каждого специального нативного объявления указан рядом с его названием. Нажав на одно из названий, вы перейдете на экран с подробной информацией о полях формата:

Здесь можно добавлять, изменять и удалять отдельные поля. Запишите название каждого объекта. Название – это ключ, который используется для получения данных для каждого объекта при показе нативного объявления в вашем собственном формате.

Как показывать специальные форматы нативных объявлений

Специальные форматы нативных объявлений отличаются от системных тем, что издатели могут сами определять список объектов, из которых состоит объявление. Поэтому процесс показа специальных нативных объявлений отличается от показа объявлений стандартных форматов:

  1. Поскольку GADCustomNativeAd предназначен для работы с любыми созданными вами нативными форматами, у него нет именованных методов доступа к объектам. Вместо этого используются методы, такие как imageForKey: и stringForKey:, которые принимают название поля в качестве аргумента.
  2. Для работы с GADCustomNativeAd нет специального класса просмотра объявлений, такого как GADNativeAdView. Вы можете использовать любое представление, которое подходит для вашего сайта.
  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) {
    ...
  }
}

Objective-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 (фрагмент)

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

Objective-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"];
}
...

Как добавить значок "Выбор рекламы"

В рамках поддержки закона ЕС "О цифровых услугах" (DSA) объявления с резервированием, которые показываются в Европейской экономической зоне (ЕЭЗ), должны содержать значок "Выбор рекламы" и ссылку на страницу "Об этой рекламе" в Google. В нативных объявлениях, которые появляются в приложениях, должен показываться значок "Выбор рекламы". Ответственность за это несете вы. Важно, чтобы вы предприняли шаги для отрисовки и установки прослушивателя кликов для значка "Выбор рекламы" при отрисовке основных объектов объявлений.

В примере ниже показано, как добавить значок "Выбор рекламы" и настроить поведение при нажатии.

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
    ...
  }
}

Objective-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, чтобы получить представление видео. Затем добавьте это представление в иерархию представлений. Если в объявлении нет видеоконтента, создайте альтернативный план показа объявления без видео.

В приведенном ниже примере проверяется, есть ли в объявлении видеоконтент, и если его нет, то вместо него показывается изображение:

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]()))
  }
...

Objective-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.

Чтобы посмотреть, как работает нативное видеообъявление, скачайте пример специальной отрисовки в Менеджере рекламы.

Как обрабатывать клики и показы специальных нативных объявлений

При использовании специальных форматов нативных объявлений ваше приложение должно регистрировать показы и сообщать о кликах в SDK.

Регистрация показов

Чтобы зарегистрировать показ специального нативного объявления, просто вызовите метод recordImpression для соответствующего объекта GADCustomNativeAd:

Swift

myCustomNativeAd.recordImpression()

Objective-C

[myCustomNativeAd recordImpression];

SDK предотвращает регистрацию дублирующихся показов для одного запроса, если ваше приложение случайно вызовет метод несколько раз для одного и того же объявления.

Отчеты о кликах

Чтобы сообщить SDK о том, что пользователь нажал на объект, вызовите метод performClickOnAssetWithKey: для соответствующего объекта GADCustomNativeAd и передайте название объекта, на который было нажато. Например, если у вас есть объект в специальном формате под названием MainImage и вы хотите зарегистрировать клик по представлению, соответствующему этому объекту, код будет выглядеть следующим образом:

Swift

myCustomNativeAd.performClickOnAsset(withKey: "MainImage")

Objective-C

[myCustomNativeAd performClickOnAssetWithKey:@"MainImage"];

Обратите внимание, что вам не нужно вызывать этот метод для каждого просмотра объекта, связанного с объявлением. Например, если у вас есть другой объект с названием "Заголовок", который должен показываться, но не должен быть кликабельным, то для его показа не нужно вызывать performClickOnAssetWithKey:.

Как реагировать на специальные действия при клике

У объекта GADCustomNativeAd есть свойство customClickHandler, которое относится к типу GADNativeAdCustomClickHandler.

Swift

typealias NativeAdCustomClickHandler = (assetID: String) -> Void

Objective-C

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

Это блок (Objective-C) или замыкание (Swift), которое принимает в качестве входного параметра объект assetID, идентифицирующий объект, на который нажал пользователь.

При клике по нативному объявлению SDK может выполнить три действия (в указанном порядке):

  1. Вызвать блок customClickHandler в Objective-C или замыкание в Swift, если они были заданы.
  2. Перебирает URL диплинков в объявлении и открывает первый, для которого найдено подходящее приложение.
  3. Откройте браузер и перейдите по традиционному целевому URL объявления.

Свойство customClickHandler принимает блок в Objective-C и замыкание в Swift. Если вы зададите блокировку или закрытие, SDK выполнит ее и не будет предпринимать никаких других действий. Если вы зададите нулевое значение, SDK вернется к URL целевой страницы и/или URL для перехода к приложению, зарегистрированным в объявлении.

Специальные обработчики нажатий позволяют приложению самостоятельно определять, какое действие лучше всего выполнить в ответ на нажатие. Это может быть обновление интерфейса, показ другого контроллера представления или просто регистрация нажатия. Вот пример с предупреждением:

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

Objective-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"];

Как тестировать код нативных объявлений

Объявления с прямой продажей

Если вы хотите протестировать прямые продажи нативных объявлений, используйте следующий идентификатор рекламного блока Менеджера рекламы:

/21775744923/example/native

Он настроен на показ образцов объявлений для установки приложений и контентных объявлений, а также на показ нативных объявлений специального формата со следующими объектами:

  • Заголовок (текст)
  • MainImage (изображение)
  • Подпись (текст)

Нативные объявления для заполнения

Чтобы проверить поведение нативных объявлений с автозаполнением, используйте следующий рекламный блок Менеджера рекламы:

/21775744923/example/native-backfill

Он будет показывать примеры объявлений, ориентированных на установку приложения, и объявлений в контенте, в которых есть оверлей "Выбор рекламы".

Не забудьте обновить код, чтобы он ссылался на ваши рекламные блоки и форматы, прежде чем запускать приложение.