Нативные объявления – пользовательская обработка

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

Пошаговые инструкции по реализации собственных шаблонов нативных объявлений приведены в Лаборатории для разработчиков.

Из этого руководства вы узнаете, как с помощью Google Mobile Ads SDK реализовать нативные объявления DFP в приложении для Android и что при этом важно учитывать.

Требования

Для изучения этого руководства требуется опыт использования Google Mobile Ads SDK. Если у вас его нет, обратитесь к руководству по началу работы.

Что такое нативные объявления

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

Стандартные форматы нативных объявлений

Есть два стандартных формата нативной рекламы: объявления, ориентированные на установку приложения, и обычные объявления. Первые представлены классом NativeAppInstallAd, вторые – классом NativeContentAd. Эти объекты содержат компоненты нативного объявления.

Собственные форматы нативных объявлений

Помимо применения стандартных, издатели DFP могут создавать собственные шаблоны нативных объявлений, определяя свои списки компонентов, и использовать эти шаблоны с зарезервированными объявлениями. Это позволяет издателям передавать в приложения необходимые структурированные данные. Такая реклама представлена объектом NativeCustomTemplateAd.

Загрузка стандартных форматов объявлений

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

Компоновка AdLoader

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

AdLoader adLoader = new AdLoader.Builder(context, "/6499/example/native")
    .forAppInstallAd(new OnAppInstallAdLoadedListener() {
        @Override
        public void onAppInstallAdLoaded(NativeAppInstallAd appInstallAd) {
            // Show the app install ad.
        }
    })
    .forContentAd(new OnContentAdLoadedListener() {
        @Override
        public void onContentAdLoaded(NativeContentAd contentAd) {
            // Show the content ad.
        }
    })
    .withAdListener(new AdListener() {
        @Override
        public void onAdFailedToLoad(int errorCode) {
            // Handle the failure by logging, altering the UI, etc.
        }
    })
    .withNativeAdOptions(new NativeAdOptions.Builder()
            // Methods in the NativeAdOptions.Builder class can be
            // used here to specify individual options settings.
            .build())
    .build();

Подготовка отдельных форматов

Первые методы, приведенные выше, необходимы для подготовки объекта AdLoader для конкретного типа нативного объявления:

forAppInstallAd – настраивает AdLoader для запроса объявления, ориентированного на установку приложения. После успешной загрузки объявления вызывается метод onAppInstallAdLoaded для объекта блока прослушивания.

forContentAd – работает аналогично forAppInstallAd, но с обычными объявлениями. После успешной загрузки объявления вызывается метод onContentAdLoaded для объекта блока прослушивания.

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

Использование AdListener с AdLoader

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

.withAdListener(new AdListener() {
  // AdListener callbacks like OnAdFailedToLoad, OnAdOpened, and so on,
  // can be overridden here.
})

Между тем, как AdListeners работает с нативными объявлениями и с баннерами либо межстраничными объявлениями, есть важное различие. У AdLoader есть собственные блоки прослушивания, которые зависят от формата и применяются после загрузки объявления (OnAppInstallAdLoadedListener и др.). Поэтому, если она прошла успешно, метод onAdLoaded из AdListener не вызывается.

NativeAdOptions

Последняя необязательная функция, которую можно включить в описанный выше процесс создания AdLoader, – это метод withNativeAdOptions.

.withNativeAdOptions(new NativeAdOptions.Builder()
        // Methods in the NativeAdOptions.Builder class can be
        // used here to specify individual options settings.
        .build()
)

Объект NativeAdOptions позволяет приложениям задавать специальные параметры для формирования запросов. Эти методы доступны при создании экземпляра в рамках класса Builder данного объекта:

setReturnUrlsForImageAssets Графические компоненты нативных объявлений возвращаются через экземпляры класса NativeAd.Image, который содержит поля Drawable и Uri. Если параметру присвоено значение false (по умолчанию), SDK будет получать графические компоненты автоматически и подставлять их в Drawable и Uri. Если же ему присвоено значение true, SDK заполнит только поле Uri, что позволит вам скачивать изображения по своему усмотрению.

setImageOrientation В некоторых креативах используются разные изображения для разной ориентации устройства. Чтобы запросить нужные, необходимо вызвать этот метод с одной из констант для ориентации NativeAdOptions: ORIENTATION_PORTRAIT, ORIENTATION_LANDSCAPE или ORIENTATION_ANY. В противном случае будет использовано значение ORIENTATION_ANY по умолчанию.

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

setRequestMultipleImages Некоторые графические компоненты содержат не одно изображение, а серию. Если для этого свойства задано значение true, приложение может показывать все изображения любого компонента, содержащего несколько графических объектов. В противном случае (значение false, которое используется по умолчанию) SDK предоставит для любых компонентов с сериями изображений только первое изображение.

Если при создании AdLoader функция withNativeAdOptions не вызывается совсем, для каждого параметра используется значение по умолчанию.

setAdChoicesPlacement()

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

  • ADCHOICES_TOP_LEFT;
  • ADCHOICES_TOP_RIGHT;
  • ADCHOICES_BOTTOM_RIGHT;
  • ADCHOICES_BOTTOM_LEFT.

Загрузка нативного объявления

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

adLoader.loadAd(new PublisherAdRequest.Builder().build());

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

Один экземпляр AdLoader может выполнить несколько запросов, но только по одному. Чтобы отправить запрос с помощью AdLoader, нужно дождаться завершения предыдущего и лишь потом вызывать loadAd. Если нужно запросить сразу несколько наборов объявлений, используйте несколько объектов AdLoader.

Когда запрашивать объявления

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

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

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

При загрузке нативного объявления SDK вызывает блок прослушивания для соответствующего формата рекламы. Далее показ объявления зависит уже от приложения (оно может выполнить его не сразу). В SDK есть полезные ресурсы, которые позволяют упростить показ нативных объявлений стандартных форматов.

Классы представления объявления

Для стандартных шаблонов используются два класса представления объявления: NativeAppInstallAdView – для рекламы, ориентированной на установку приложения; NativeContentAdView – для обычных объявлений. Эти классы являются ViewGroups, которые издателям следует использовать в качестве корневых узлов для нативной рекламы того или иного формата. Например, один объект NativeContentAdView соответствует одному обычному объявлению. Каждый объект, используемый для показа компонентов этого объявления (например, ImageView для показа компонента скриншотов), должен наследоваться от объекта NativeContentAdView.

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

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

  • учитывать клики;
  • учитывать показы (когда первый пиксель появляется на экране);
  • отображать значок "Выбор рекламы" в нативных креативах для заполнения.

Значок "Выбор рекламы"

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

Пример кода

Чтобы настроить отображение стандартного шаблона нативного объявления, выполните следующие действия:

  1. Создайте экземпляр подходящего класса представления объявления.
  2. Для каждого компонента объявления, который нужно отобразить:
    1. Передайте в представление компонента компонент из объекта нативного объявления.
    2. Зарегистрируйте представление компонента с помощью класса ViewGroup.
  3. Зарегистрируйте объект нативного объявления с помощью класса ViewGroup.

В этом примере представлена функция, которая показывает NativeContentAd:

private void displayContentAd(ViewGroup parent, NativeContentAd contentAd) {
    // Inflate a layout and add it to the parent ViewGroup.
    LayoutInflater inflater = (LayoutInflater) parent.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    NativeContentAdView adView = (NativeContentAdView) inflater
            .inflate(R.layout.my_content_ad, parent);

    // Locate the view that will hold the headline, set its text, and call the
    // NativeContentAdView's setHeadlineView method to register it.
    TextView headlineView = (TextView) adView.findViewById(R.id.contentad_headline);
    headlineView.setText(contentAd.getHeadline());
    adView.setHeadlineView(headlineView);

    ...
    // Repeat the above process for the other assets in the NativeContentAd
    // using additional view objects (Buttons, ImageViews, etc).
    ...

    // Call the NativeContentAdView's setNativeAd method to register the
    // NativeAdObject.
    adView.setNativeAd(contentAd);

    // Place the AdView into the parent.
    parent.addView(adView);
}

Рассмотрим отдельные операции.

Развертывание формата

LayoutInflater inflater = (LayoutInflater) parent.getContext()
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
NativeContentAdView adView = (NativeContentAdView) inflater
        .inflate(R.layout.my_content_ad, parent);

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

Заполнение и регистрация представлений компонентов

TextView headlineView = (TextView) adView.findViewById(R.id.contentad_headline);
headlineView.setText(contentAd.getHeadline());
adView.setHeadlineView(headlineView);

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

Регистрация объекта нативного объявления

adView.setNativeAd(contentAd);

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

Загрузка собственных форматов нативных объявлений

Компоновка AdLoader

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

AdLoader adLoader = new AdLoader.Builder(context, "/6499/example/native")
    .forCustomTemplateAd("10063170",
      new NativeCustomTemplateAd.OnCustomTemplateAdLoadedListener() {
          @Override
          public void onCustomTemplateAdLoaded(NativeCustomTemplateAd ad) {
              // Show the custom template and record an impression.
          }
      },
      new NativeCustomTemplateAd.OnCustomClickListener() {
          @Override
          public void onCustomClick(NativeCustomTemplateAd ad, String s) {
              // Handle the click action
          }
      })
    .withAdListener( ... )
    .withNativeAdOptions( ... )
    .build();

Подобно тому, как метод forAppInstallAd настраивает AdLoader, чтобы запросить объявление, ориентированное на установку приложения, метод forCustomTemplateAd выполняет настройку для обработки собственных шаблонов объявлений. В метод передаются три параметра:

  • Идентификатор собственного шаблона, который загрузчик AdLoader должен запросить. У каждого собственного шаблона нативной рекламы есть идентификатор. Этот параметр указывает, запрос какого шаблона приложение ожидает от AdLoader.
  • Блок прослушивания OnCustomTemplateAdLoadedListener, который следует вызвать после успешной загрузки объявления.
  • Блок прослушивания OnCustomClickListener, который можно дополнительно вызвать, когда пользователь нажимает на объявление. Подробнее об этом блоке прослушивания читайте в разделе "Обработка кликов и показов для собственных форматов нативной рекламы" ниже.

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

Идентификаторы шаблонов

Уникальные идентификаторы для собственных шаблонов нативных объявлений можно найти в интерфейсе DFP на вкладке Выполнение в разделе Объявления > Нативные стили.

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

На открывшемся экране можно добавлять, изменять и удалять поля. Обратите внимание на столбец Идентификатор переменной справа. Указанные в нем идентификаторы используются для доступа к отдельным компонентам. Мы рассмотрим это подробнее в следующем разделе.

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

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

  1. Поскольку класс NativeCustomTemplateAd должен обрабатывать любые собственные шаблоны нативной рекламы, которые вы задаете в DFP, у него нет именованных средств доступа к компонентам. Вместо этого применяются такие методы, как getText и getImage, в которых в качестве аргумента выступает идентификатор переменной для поля шаблона.
  2. Для класса NativeCustomTemplateAd не предусмотрен специальный класс представления объявления, например NativeContentAdView. Вы можете использовать FrameLayout, RelativeLayout или любой другой класс, который подходит для вашего приложения.
  3. Поскольку отдельного класса ViewGroup не существует, вам не нужно регистрировать представления, используемые для показа компонентов объявления. Количество строк кода сокращается, но впоследствии понадобится дополнительный код для подсчета кликов.

Вот пример функции, которая служит для показа NativeCustomTemplateAd:

public void displayCustomTemplateAd (ViewGroup parent,
                                     NativeCustomTemplateAd customTemplateAd) {
    // Inflate a layout and add it to the parent ViewGroup.
    LayoutInflater inflater = (LayoutInflater) parent.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View adView = inflater.inflate(R.layout.custom_template_ad, parent);

    // Locate the TextView that will hold the value for "Headline" and
    // set its text.
    TextView myHeadlineView = (TextView) adView.findViewById(R.id.headline);
    myHeadlineView.setText(customTemplateAd.getText("Headline"));

    // Locate the ImageView that will hold the value for "MainImage" and
    // set its drawable.
    Button myMainImageView = (ImageView) adView.findViewById(R.id.main_image);
    myMainImageView.setImageDrawable(
            nativeCustomTemplateAd.getImage("MainImage").getDrawable());

    ...
    // Continue locating views and displaying assets until finished.
    ...
}

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

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

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

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

myCustomTemplateAd.recordImpression();

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

Передача данных о кликах

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

myCustomTemplateAd.performClick("MainImage");

Этот метод не нужно вызывать для каждого представления, связанного с объявлением. Если, к примеру, у вас есть другой компонент под названием Caption, который должен быть показан, но на который не будут нажимать пользователи, то приложению не нужно вызывать для представления этого компонента обработчик performClick.

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

При клике по собственному шаблону объявления SDK выполняет перечисленные ниже действия в следующем порядке:

  1. Вызывает блок прослушивания OnCustomClickListener (если он был задан) из загрузчика AdLoader.
  2. Для URL каждой ссылки на контент пытается найти и запустить первый преобразователь контента, который выполнит задачу.
  3. Открывает браузер и загружает веб-страницу по обычному целевому URL.

Метод forCustomTemplateAd принимает блок прослушивания OnCustomClickListener. Если передать объект с таким блоком, то SDK вместо этого вызовет свой метод onCustomClick, не предпринимая дальнейших действий. Если же в качестве блока прослушивания передано нулевое значение, SDK использует ссылку на контент и/или целевые URL, зарегистрированные с объявлением.

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

AdLoader adLoader = new AdLoader.Builder(context, "/6499/example/native")
    .forCustomTemplateAd("10063170",
      new NativeCustomTemplateAd.OnCustomTemplateAdLoadedListener() {
        // Display the ad.
      },
      new NativeCustomTemplateAd.OnCustomClickListener() {
          @Override
          public void onCustomClick(NativeCustomTemplateAd ad, String assetName) {
            Log.i("MyApp", "A custom click just happened for " + assetName + "!");
          }
      }).build();

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

Такой обмен данными оправдан по нескольким причинам. Прежде всего, это позволяет SDK сохранять контроль за действием, которое было вызвано кликом. Также может выполняться, например, автоматическая проверка ping сторонних URL отслеживания, заданных для креатива, или обработка других задач в фоновом режиме (для этого не нужен дополнительный код).

Тестирование кода нативного объявления

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

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

/6499/example/native

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

  • Headline (текстовый заголовок);
  • MainImage (изображение);
  • Caption (текстовая подпись).

Идентификатор шаблона для собственного формата адаптивного объявления: 10063170.

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

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

/6499/example/native-backfill

В нем показываются тестовые объявления – обычные и ориентированные на установку приложения – со значком "Выбор рекламы".

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

Оставить отзыв о...

Текущей странице
SDK for DFP Users on Android
Нужна помощь? Обратитесь в службу поддержки.