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

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

Как и их системные аналоги, собственные форматы объявлений загружаются с помощью объектов 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 в разделе « Нативные» раскрывающегося списка «Доставка» :

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

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

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

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

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

Нативное видео для пользовательских форматов нативной рекламы

При создании пользовательского формата у вас есть возможность сделать его пригодным для видео.

В реализации вашего приложения вы можете использовать свойство 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]];
  [self.mainPlaceholder
      addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[mainView]|"
                                                             options:0
                                                             metrics:nil
                                                               views:viewDictionary]];
}
...

См. GADVideoController для получения дополнительной информации о том, как настроить качество видео для собственной собственной рекламы.

Загрузите пример пользовательского рендеринга Менеджера рекламы , чтобы увидеть рабочий пример нативного видео в действии.

Обработка кликов и показов нативных объявлений

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

Запись показов

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

Быстрый

myCustomNativeAd.recordImpression()

Цель-C

[myCustomNativeAd recordImpression];

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

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

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

Быстрый

myCustomNativeAd.performClickOnAsset(withKey: "MainImage")

Цель-C

[myCustomNativeAd performClickOnAssetWithKey:@"MainImage"];

Обратите внимание: вам не нужно вызывать этот метод для каждого просмотра объекта, связанного с вашим объявлением. Например, если у вас был другой актив под названием «Подпись», который должен был отображаться, но не щелкался и не касался пользователем, вашему приложению не нужно было бы вызывать 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. Просмотрите URL-адреса глубоких ссылок объявления и откройте первый из них, для которого можно найти подходящее приложение.
  3. Откройте браузер и перейдите к традиционному целевому URL-адресу объявления.

Свойство customClickHandler принимает блок в Objective-C и замыкание в Swift. Если вы установите блокировку или закрытие, SDK запустит его и не предпримет никаких дальнейших действий. Однако если вы установите нулевое значение, 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")

Цель-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 :

/6499/example/native

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

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

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

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

/6499/example/native-backfill

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

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