Пользовательские форматы нативной рекламы

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

Пользовательские форматы рекламы

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

GADCustomNativeAdLoaderDelegate

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

Быстрый

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

Objective-C

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

Каждый пользовательский формат нативной рекламы имеет соответствующий идентификатор формата. При вызове этого метода ваше приложение должно вернуть массив, содержащий идентификаторы форматов рекламы, которую оно готово показать.

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

Быстрый

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

Objective-C

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

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

Идентификаторы форматов, используемые для уникальной идентификации пользовательских форматов нативной рекламы, можно найти в пользовательском интерфейсе Ad Manager в разделе « Нативная реклама» в раскрывающемся списке «Доставка» :

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

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

Отображение пользовательских форматов нативной рекламы

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

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

Быстрый

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

Отобразить значок AdChoices

В рамках Закона о поддержке цифровых услуг (DSA) для показа рекламных объявлений о бронировании в Европейской экономической зоне (ЕЭЗ) требуется значок 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:
      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 , чтобы получить представление видео. Затем добавьте это представление в иерархию представлений. Если в объявлении нет видеоконтента, создайте альтернативные планы для показа объявления без видео.

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

Быстрый

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

Загрузите пример пользовательского рендеринга в Ad Manager, чтобы увидеть работающую демонстрацию нативного видео.

Обработка кликов и показов нативной рекламы.

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

Запись впечатлений

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

Быстрый

myCustomNativeAd.recordImpression()

Objective-C

[myCustomNativeAd recordImpression];

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

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

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

Быстрый

myCustomNativeAd.performClickOnAsset(withKey: "MainImage")

Objective-C

[myCustomNativeAd performClickOnAssetWithKey:@"MainImage"];

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

Реагирование на пользовательские действия по клику

У GADCustomNativeAd есть свойство customClickHandler , которое имеет тип GADNativeAdCustomClickHandler

Быстрый

typealias NativeAdCustomClickHandler = (assetID: String) -> Void

Objective-C

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

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

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

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

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

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

Быстрый

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

Тестирование нативного рекламного кода

Реклама, продаваемая напрямую

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

/21775744923/example/native

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

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

Нативная реклама для заполнения пробелов

Для проверки работы встроенных рекламных объявлений используйте этот рекламный блок в Ad Manager:

/21775744923/example/native-backfill

Будет показана демонстрационная реклама для установки приложений и контентная реклама, включающая всплывающее окно AdChoices.

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