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

Выберите платформу: 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.mediaContent, чтобы получить экземпляр GADMediaContent объявления. Чтобы определить, содержит ли объявление видеоконтент, проверьте свойство hasVideoContent. Если в объявлении есть видеоконтент, создайте представление GADMediaView, назначьте свойство mediaContent и добавьте представление медиаконтента в иерархию представлений. Если в объявлении нет видеоконтента, покажите альтернативный объект, например изображение.

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

Swift

func populate(withCustomNativeAd customNativeAd: CustomNativeAd) {
  // Remove all the media placeholder's subviews.
  for subview: UIView in mainPlaceholder.subviews {
    subview.removeFromSuperview()
  }

  // This custom native ad has both a video and image associated with it. Use the video
  // asset if available, or fall back to the image asset.
  let mainView: UIView
  if customNativeAd.mediaContent.hasVideoContent {
    let mediaView = MediaView()
    mediaView.mediaContent = customNativeAd.mediaContent
    mainView = mediaView
  } else {
    let image: UIImage? = customNativeAd.image(forKey: "MainImage")?.image
    mainView = UIImageView(image: image)
  }
  mainPlaceholder.addSubview(mainView)

  // Size the media view to fill the container size.
  mainView.translatesAutoresizingMaskIntoConstraints = false
  NSLayoutConstraint.activate([
    mainView.leadingAnchor.constraint(equalTo: mainPlaceholder.leadingAnchor),
    mainView.trailingAnchor.constraint(equalTo: mainPlaceholder.trailingAnchor),
    mainView.topAnchor.constraint(equalTo: mainPlaceholder.topAnchor),
    mainView.bottomAnchor.constraint(equalTo: mainPlaceholder.bottomAnchor),
  ])
}

Objective-C

- (void)populateWithCustomNativeAd:(GADCustomNativeAd *)customNativeAd {
  // Remove all the media placeholder's subviews.
  for (UIView *subview in self.mainPlaceholder.subviews) {
    [subview removeFromSuperview];
  }

  // This custom native ad has both a video and image associated with it. Use the video
  // asset if available, or fall back to the image asset.
  UIView *mainView = nil;
  if (customNativeAd.mediaContent.hasVideoContent) {
    GADMediaView *mediaView = [[GADMediaView alloc] init];
    mediaView.mediaContent = customNativeAd.mediaContent;
    mainView = mediaView;
  } else {
    UIImage *image = [customNativeAd imageForKey:@"MainImage"].image;
    mainView = [[UIImageView alloc] initWithImage:image];
  }
  [self.mainPlaceholder addSubview:mainView];

  // Size the media view to fill the container size.
  mainView.translatesAutoresizingMaskIntoConstraints = NO;
  [NSLayoutConstraint activateConstraints:@[
    [mainView.leadingAnchor constraintEqualToAnchor:self.mainPlaceholder.leadingAnchor],
    [mainView.trailingAnchor constraintEqualToAnchor:self.mainPlaceholder.trailingAnchor],
    [mainView.topAnchor constraintEqualToAnchor:self.mainPlaceholder.topAnchor],
    [mainView.bottomAnchor constraintEqualToAnchor:self.mainPlaceholder.bottomAnchor],
  ]];
}

Подробную информацию о настройке видео в нативном объявлении специального формата можно найти в описании класса GADVideoController.

Пример реализации специальных нативных видеообъявлений с использованием специальной отрисовки в Менеджере рекламы на языках Swift и Objective-C.

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

При использовании специальных форматов нативных объявлений ваше приложение должно регистрировать показы и передавать в 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 выполнит его и не будет предпринимать никаких дальнейших действий. Если вы зададите значение nil, SDK будет использовать ссылку на контент и/или целевой 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

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

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