Engage SDK Social: инструкции по технической интеграции для сторонних разработчиков

Повышайте вовлеченность пользователей, обращаясь к ним там, где они находятся. Интегрируйте Engage SDK, чтобы показывать персональные рекомендации и контент, который пользователи не досмотрели, на разных платформах на устройстве, например в подборках, Entertainment Space и Google Play. Интеграция добавляет менее 50 КБ (в сжатом виде) к среднему размеру APK и занимает у разработчиков около недели. Подробную информацию вы найдете на нашем сайте.

В этом руководстве содержатся инструкции для партнеров-разработчиков по доставке контента из социальных сетей на платформы Google Play Покупок.

Поддерживаемые категории и платформы

Доступность платформ Engage SDK зависит от категории контента в приложении. В таблице ниже указано, какие требования нужно выполнить, чтобы ваши товары показывались на разных платформах.

Статус Категория контента или сценарий использования Поддерживаемые платформы
Поддерживается
(Доступно на всех платформах)
  • Социальные сети
  • Изображения и мемы
  • Видеоклипы и короткие видео
  • Очные встречи
  • Облачное хранилище для фотографий
  • Подборки
  • Вкладка "Приложения" в Google Play
  • Вкладка "Вы" в Google Play
  • Страница приложения в Google Play
Чего пользователь не может
  • Видеочат в реальном времени
  • Мгновенный обмен сообщениями, передача данных о присутствии в интернете или данных в реальном времени.
  • Обмен файлами и загрузчики
  • Знакомства
  • Генераторы аватаров

Сведения об интеграции

В следующем разделе приведены подробные сведения об интеграции.

Терминология

Рекомендации. Персонализированные предложения от одного партнера-разработчика.

Рекомендации имеют следующую структуру:

Кластер рекомендаций. Раздел интерфейса, в котором собраны рекомендации от одного партнера-разработчика.

Каждый кластер рекомендаций состоит из объектов одного из двух типов :

  • PortraitMediaEntity
  • SocialPostEntity

PortraitMediaEntity должен содержать одно вертикальное изображение для публикации. Метаданные профиля и взаимодействия необязательны.

  • Запись

    • изображение в вертикальной ориентации и временная метка;
    • Изображение в режиме портретной съемки + текст и временная метка
  • Профиль

    • Аватар, название или псевдоним, дополнительное изображение
  • Взаимодействия

    • только подсчет и маркировка;
    • Количество и значок

SocialPostEntity содержит метаданные, связанные с профилем, публикацией и взаимодействием.

  • Профиль

    • Аватар, имя или псевдоним, дополнительный текст, дополнительное изображение
  • Запись

    • текст и временная метка;
    • Мультимедиа (изображение или URL мультимедиа) и временная метка.
    • текст и мультимедиа (изображение или URL мультимедиа) и временная метка;
    • Предпросмотр видео (значок и продолжительность) и временная метка
  • Взаимодействия

    • только подсчет и пометка;
    • Количество и значок

Подготовка

Минимальный уровень API: 19.

Добавьте библиотеку com.google.android.engage:engage-core в приложение:

dependencies {
    // Make sure you also include that repository in your project's build.gradle file.
    implementation 'com.google.android.engage:engage-core:1.6.0'
}

Сводка

Дизайн основан на реализации привязанной службы.

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

Тип кластера Ограничения кластера Минимальное количество объектов в кластере Максимальное количество объектов в кластере
Кластеры рекомендаций Не более 7 Не менее одного (PortraitMediaEntity или SocialPostEntity) Не более 50 (PortraitMediaEntity или SocialPostEntity).

Шаг 1. Укажите данные о компании

В SDK определены разные объекты для представления каждого типа товара. SDK поддерживает следующие объекты для категории "Социальные сети":

  1. PortraitMediaEntity
  2. SocialPostEntity

В таблицах ниже перечислены доступные атрибуты и требования для каждого типа.

PortraitMediaEntity

Атрибут Требования Описание Формат
URI действия Обязательно для всех платформ, кроме Google TV.

Ссылка на контент в приложении поставщика.

Примечание. Ссылки на контент можно использовать для атрибуции. Ознакомьтесь с разделом часто задаваемых вопросов

URI
PlatformSpecificPlayback Обязательный для Google TV.

Ссылка на контент в приложении поставщика для таких платформ, как Google TV и мобильные устройства.

Список объектов PlatformSpecificPlayback
Причина рекомендации Необязательно Обоснование рекомендации контента пользователю. Объект RecommendationReason
Сводка комментариев Необязательно Сводка комментариев к записи. Строка
Метаданные, связанные с публикацией (обязательно)
Изображения Обязательно

Изображения должны иметь вертикальное соотношение сторон.

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

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

Ознакомьтесь со спецификациями изображений.
Текст Необязательно Основной текст записи, обновления и т. д. Строка (рекомендуется не более 140 символов)
Временная метка Необязательно Время публикации записи. Временная метка в миллисекундах с начала отсчета
видеоконтент; Необязательно Это видео? Логическое значение
Продолжительность видео Необязательно Продолжительность видео в миллисекундах. Долгота
Метаданные, связанные с профилем (необязательно)
Название Обязательно Название, идентификатор или псевдоним профиля, например "Иван Иванов", "@TeamPixel". Строка(рекомендуется не более 25 символов)
Аватар Обязательно

Фото профиля или аватар пользователя.

Квадратное изображение (1:1)

Ознакомьтесь со спецификациями изображений.
Дополнительное изображение Необязательно

Значок профиля, например значок подлинности.

Квадратное изображение (1:1)

Ознакомьтесь со спецификациями изображений.
Метаданные, связанные с взаимодействиями (необязательно)
Количество Необязательно

Укажите количество взаимодействий, например "3,7 млн".

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

Примечание. Партнеры должны использовать либо Count, либо CountWithOptionalLabel.

Строка

CountWithOptionalLabel Необязательно

Укажите количество взаимодействий с необязательным ярлыком, например "3,7 млн лайков".

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

Примечание. Партнеры должны использовать либо Count, либо CountWithOptionalLabel.

Строка

Значение количества Необязательно

Количество взаимодействий в виде значения.

Примечание. Если в вашем приложении не реализована логика оптимизации больших чисел для экранов разных размеров, используйте Count Value вместо Count. Если указаны оба значения, используется Count.

Долгота
Label (Звукозаписывающая компания) Необязательно Укажите, для чего нужен ярлык взаимодействия. Например, "Нравится".

Строка

Видео Необязательно

Укажите, для чего нужно взаимодействие. Например, изображение со значком "Нравится" и эмодзи.

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

Примечание. Изображение должно быть квадратным (1:1).

Ознакомьтесь со спецификациями изображений.
DisplayTimeWindow (необязательно) – задает временной интервал, в течение которого контент будет показываться на платформе.
Временная метка начала Необязательно

Временная метка, после которой контент должен показываться на платформе.

Если правило не настроено, контент может показываться на платформе.

Временная метка в миллисекундах с начала отсчета
Временная метка окончания Необязательно

Временная метка, после которой контент больше не показывается на платформе.

Если правило не настроено, контент может показываться на платформе.

Временная метка в миллисекундах с начала отсчета

SocialPostEntity

Атрибут Требования Описание Формат
URI действия Обязательно

Ссылка на контент в приложении поставщика.

Примечание. Ссылки на контент можно использовать для атрибуции. Ознакомьтесь с разделом часто задаваемых вопросов

URI
PlatformSpecificPlayback URIs Обязательный для Google TV.

Ссылка на контент в приложении поставщика для таких платформ, как Google TV и мобильные устройства.

Список объектов PlatformSpecificPlayback
Причина рекомендации Необязательно Обоснование рекомендации контента пользователю. Объект RecommendationReason
Сводка комментариев Необязательно Сводка комментариев к записи. Строка

Метаданные, связанные с публикацией (обязательно)

Необходимо указать хотя бы один из следующих параметров: TextContent, Image или WebContent.

Изображения Необязательно

Изображения должны иметь вертикальное соотношение сторон.

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

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

Ознакомьтесь со спецификациями изображений.
Текст Необязательно Основной текст записи, обновления и т. д. Строка (рекомендуется не более 140 символов)
Видеоконтент (необязательно)
Продолжительность Обязательно Продолжительность видео в миллисекундах. Долгота
Изображение Обязательно Предварительный просмотр видеоконтента. Ознакомьтесь со спецификациями изображений.
Предварительный просмотр ссылки (необязательно)
Предпросмотр ссылки – заголовок Обязательно Текст, указывающий на заголовок контента веб-страницы. Строка
Предпросмотр ссылки – имя хоста Обязательно Текст, указывающий на владельца веб-страницы, например "ИНСАЙДЕР" Строка
Предпросмотр ссылки – изображение Необязательно Главное изображение для веб-контента Ознакомьтесь со спецификациями изображений.
Временная метка Необязательно Время публикации записи. Временная метка в миллисекундах с начала отсчета
Метаданные, связанные с профилем (необязательно)
Название Обязательно Имя, идентификатор или псевдоним профиля, например "Иван Иванов" или "@TeamPixel". Строка(рекомендуется не более 25 символов)
Дополнительный текст Необязательно

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

Примеры: "@John-Doe", "5 млн подписчиков", "Вам может понравиться", "Популярное", "5 новых записей".

Строка(рекомендуется не более 40 символов)
Аватар Обязательно

Фото профиля или аватар пользователя.

Квадратное изображение (1:1)

Ознакомьтесь со спецификациями изображений.
Дополнительное изображение Необязательно

Значок профиля, например значок подлинности

Квадратное изображение (1:1)

Ознакомьтесь со спецификациями изображений.
Метаданные, связанные с взаимодействиями (необязательно)
Количество Обязательно

Укажите количество взаимодействий, например "3,7 млн".

Примечание. Партнеры должны использовать либо Count, либо CountWithOptionalLabel.

Строка
CountWithOptionalLabel Обязательно

Укажите количество взаимодействий с необязательным ярлыком, например "3,7 млн отметок "Нравится".

Примечание. Партнеры должны использовать либо Count, либо CountWithOptionalLabel.

Строка
Label (Звукозаписывающая компания)

Необязательно

Если не указано, необходимо указать Visual.

Укажите, для чего нужно взаимодействие. Например, "Понравившиеся". Строка (рекомендуется не более 20 символов для количества и ярлыка вместе)
Видео

Необязательно

Если не указано, необходимо указать Label.

Укажите, для чего нужно взаимодействие. Пример: изображение со значком лайка и эмодзи.

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

Квадратное изображение (1:1)

Ознакомьтесь со спецификациями изображений.
DisplayTimeWindow (необязательно) – задает временной интервал, в течение которого контент будет показываться на платформе.
Временная метка начала Необязательно

Временная метка, после которой контент должен показываться на платформе.

Если правило не настроено, контент может показываться на платформе.

Временная метка в миллисекундах с начала отсчета
Временная метка окончания Необязательно

Временная метка, после которой контент больше не показывается на платформе.

Если правило не настроено, контент может показываться на платформе.

Временная метка в миллисекундах с начала отсчета

Требования к картинкам

Изображения должны размещаться в общедоступных сетях доставки контента, чтобы у Google был к ним доступ.

Форматы файлов

PNG, JPG, статический GIF, WebP

Максимальный размер файла

5120 КБ

Дополнительные рекомендации

  • Рекомендуемые пределы допустимой области изображения: важный контент должен занимать центральные 80% изображения.
  • Используйте прозрачный фон, чтобы изображение правильно отображалось в светлой и темной темах.

Шаг 2. Предоставьте данные о кластере

Рекомендуется выполнять задачу публикации контента в фоновом режиме (например, с помощью WorkManager) и запланировать ее на регулярной основе или на основе событий (например, каждый раз, когда пользователь открывает приложение или когда пользователь только что подписался на новый аккаунт).

AppEngageSocialClient отвечает за публикацию социальных кластеров.

Для публикации кластеров в клиенте используются следующие API:

  • isServiceAvailable
  • publishRecommendationClusters
  • publishUserAccountManagementRequest
  • updatePublishStatus
  • deleteRecommendationsClusters
  • deleteUserManagementCluster
  • deleteClusters

isServiceAvailable

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

Вы можете проверить доступность сервиса для каждого типа кластера, который вы собираетесь опубликовать. API isServiceAvailable принимает объект запроса ServiceAvailabilityRequest, который содержит типы кластеров, для которых необходимо проверить доступность сервиса. В таблице ниже приведены значения перечисления ClusterType, необходимые для ServiceAvailabilityRequest.

Тип кластера Константа типа кластера Целочисленное значение
Неизвестно TYPE_UNKNOWN 0
Кластер рекомендаций TYPE_RECOMMENDATION 1
Рекомендуемый кластер TYPE_FEATURED 2
Кластер продолжения TYPE_CONTINUATION 3
Кластер управления пользователями TYPE_ENGAGEMENT 8
Кластер подписок TYPE_SUBSCRIPTION 12

Kotlin

val request = ServiceAvailabilityRequest.Builder()
    .addIntendedClusterType(ClusterType.TYPE_CONTINUATION)
    .addIntendedClusterType(ClusterType.TYPE_RECOMMENDATION)
    .build()

client.isServiceAvailable(request).addOnCompleteListener { task ->
    if (task.isSuccessful) {
        val availabilityMap = task.result
        if (availabilityMap[ClusterType.TYPE_CONTINUATION] == true) {
            // Proceed with publishing continuation content
        }
        if (availabilityMap[ClusterType.TYPE_RECOMMENDATION] == true) {
            // Proceed with publishing recommendation content
        }
    } else {
        // The IPC call itself fails, proceed with error handling logic here,
        // such as retry.
    }
}

Java

ServiceAvailabilityRequest request =
    new ServiceAvailabilityRequest.Builder()
        .addIntendedClusterType(ClusterType.TYPE_CONTINUATION)
        .addIntendedClusterType(ClusterType.TYPE_RECOMMENDATION)
        .build();

client.isServiceAvailable(request).addOnCompleteListener(task -> {
    if (task.isSuccessful()) {
        Map<Integer, Boolean> availabilityMap = task.getResult();
        if (Boolean.TRUE.equals(availabilityMap.get(ClusterType.TYPE_CONTINUATION))) {
            // Proceed with publishing continuation content
        }
        if (Boolean.TRUE.equals(availabilityMap.get(ClusterType.TYPE_RECOMMENDATION))) {
            // Proceed with publishing recommendation content
        }
    } else {
        // The IPC call itself fails, proceed with error handling logic here,
        // such as retry.
    }
});
Функция условной доступности сервиса

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

Начиная с версии 1.6.0 Engage SDK позволяет проверять доступность определенных типов кластеров. Если вы хотите включить эту функцию для любого типа кластера, напишите на адрес engage-developers@google.com.

Для версий SDK до 1.6.0 (поддержка прекращена)

Kotlin

client.isServiceAvailable.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        // Handle IPC call success
        if(task.result) {
          // Service is available on the device, proceed with content publish
          // calls.
        } else {
          // Service is not available, no further action is needed.
        }
    } else {
      // The IPC call itself fails, proceed with error handling logic here,
      // such as retry.
    }
}

Java

client.isServiceAvailable().addOnCompleteListener(task - > {
    if (task.isSuccessful()) {
        // Handle success
        if(task.getResult()) {
          // Service is available on the device, proceed with content publish
          // calls.
        } else {
          // Service is not available, no further action is needed.
        }
    } else {
      // The IPC call itself fails, proceed with error handling logic here,
      // such as retry.
    }
});

publishRecommendationClusters

Этот API используется для публикации списка объектов RecommendationCluster.

Объект RecommendationCluster может иметь следующие атрибуты:

Атрибут Требования Описание
Список объектов SocialPostEntity или PortraitMediaEntity Обязательно Список объектов, составляющих рекомендации для этого кластера. Объекты в одном кластере должны быть одного типа.
Название Обязательно

Название кластера рекомендаций, например Последние новости от друзей.

Рекомендуемая длина текста: до 25 символов. Если текст слишком длинный, он может быть сокращен.

Подзаголовок Необязательно Подзаголовок кластера рекомендаций.
URI действия Необязательно

Ссылка на контент в приложении партнера, где пользователи могут посмотреть полный список рекомендаций.

Примечание. Ссылки на контент можно использовать для атрибуции. Ознакомьтесь с разделом часто задаваемых вопросов

Kotlin

client.publishRecommendationClusters(
            PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Latest from your friends")
                        .build())
                .build())

Java

client.publishRecommendationClusters(
            new PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    new RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Latest from your friends")
                        .build())
                .build());

Когда сервис получает запрос, в рамках одной транзакции выполняются следующие действия:

  • Все существующие данные кластера рекомендаций удаляются.
  • Данные из запроса анализируются и сохраняются в новых кластерах рекомендаций.

В случае ошибки весь запрос отклоняется и сохраняется существующее состояние.

publishUserAccountManagementRequest

Этот API используется для публикации карточки входа . Действие "Войти" направляет пользователей на страницу входа в приложение, чтобы оно могло публиковать контент (или предоставлять более персонализированный контент).

В карточке входа содержатся следующие метаданные:

Атрибут Требования Описание
URI действия Обязательно Ссылка на контент для действия (например, переход на страницу входа в приложение)
Изображение Необязательно. Если не указано, необходимо указать название.

Изображение на карточке

Изображения с соотношением сторон 16:9 и разрешением 1264 x 712.

Название Необязательно. Если не указано, необходимо добавить изображение. Название на карточке
Текст действия Необязательно Текст, который будет показываться в призыве к действию (например, "Войти")
Подзаголовок Необязательно Необязательный подзаголовок на карточке

Kotlin

var SIGN_IN_CARD_ENTITY =
      SignInCardEntity.Builder()
          .addPosterImage(
              Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build()

client.publishUserAccountManagementRequest(
            PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

Java

SignInCardEntity SIGN_IN_CARD_ENTITY =
      new SignInCardEntity.Builder()
          .addPosterImage(
              new Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build();

client.publishUserAccountManagementRequest(
            new PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

Когда сервис получает запрос, в рамках одной транзакции выполняются следующие действия:

  • Существующие данные UserAccountManagementCluster от партнера-разработчика удаляются.
  • Данные из запроса анализируются и сохраняются в обновленном кластере UserAccountManagementCluster.

В случае ошибки весь запрос отклоняется и сохраняется существующее состояние.

updatePublishStatus

Если по какой-либо внутренней причине ни один из кластеров не опубликован, мы настоятельно рекомендуем обновить статус публикации с помощью API updatePublishStatus. Это важно по следующим причинам :

  • Указывать статус нужно во всех случаях, даже когда контент опубликован (STATUS == PUBLISHED). Это необходимо для заполнения панелей управления, на которых статус используется для передачи данных о работоспособности и других показателей интеграции.
  • Если контент не опубликован, но статус интеграции не нарушен (STATUS == NOT_PUBLISHED), Google может не запускать оповещения на панелях мониторинга работоспособности приложения. Она подтверждает, что контент не опубликован по ожидаемой причине с точки зрения поставщика.
  • Это помогает разработчикам понять, когда данные публикуются, а когда нет.
  • Google может использовать коды статуса, чтобы подсказать пользователю, как получить доступ к контенту приложения.

Список допустимых кодов статуса публикации :

// Content is published
AppEngagePublishStatusCode.PUBLISHED,

// Content is not published as user is not signed in
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN,

// Content is not published as user is not subscribed
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SUBSCRIPTION,

// Content is not published as user location is ineligible
AppEngagePublishStatusCode.NOT_PUBLISHED_INELIGIBLE_LOCATION,

// Content is not published as there is no eligible content
AppEngagePublishStatusCode.NOT_PUBLISHED_NO_ELIGIBLE_CONTENT,

// Content is not published as the feature is disabled by the client
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_FEATURE_DISABLED_BY_CLIENT,

// Content is not published as the feature due to a client error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_CLIENT_ERROR,

// Content is not published as the feature due to a service error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_SERVICE_ERROR,

// Content is not published due to some other reason
// Reach out to engage-developers@ before using this enum.
AppEngagePublishStatusCode.NOT_PUBLISHED_OTHER

Если контент не публикуется из-за того, что пользователь не вошел в аккаунт, Google рекомендует опубликовать карточку входа. Если по какой-либо причине поставщики не могут опубликовать карточку входа, мы рекомендуем вызвать API updatePublishStatus с кодом статуса NOT_PUBLISHED_REQUIRES_SIGN_IN.

Kotlin

client.updatePublishStatus(
   PublishStatusRequest.Builder()
     .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
     .build())

Java

client.updatePublishStatus(
    new PublishStatusRequest.Builder()
        .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
        .build());

deleteRecommendationsClusters

Этот API используется для удаления контента из кластеров рекомендаций.

Kotlin

client.deleteRecommendationsClusters()

Java

client.deleteRecommendationsClusters();

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

deleteUserManagementCluster

Этот API используется для удаления контента кластера UserAccountManagement.

Kotlin

client.deleteUserManagementCluster()

Java

client.deleteUserManagementCluster();

Когда сервис получает запрос, он удаляет существующие данные из кластера UserAccountManagement. В случае ошибки весь запрос отклоняется и сохраняется существующее состояние.

deleteClusters

Этот API используется для удаления контента кластера определенного типа.

Kotlin

client.deleteClusters(
    DeleteClustersRequest.Builder()
      .addClusterType(ClusterType.TYPE_RECOMMENDATION)
      ...
      .build())

Java

client.deleteClusters(
            new DeleteClustersRequest.Builder()
                .addClusterType(ClusterType.TYPE_RECOMMENDATION)
                ...
                .build());

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

Обработка ошибок

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

client.publishRecommendationClusters(
              new PublishRecommendationClustersRequest.Builder()
                  .addRecommendationCluster(...)
                  .build())
          .addOnCompleteListener(
              task -> {
                if (task.isSuccessful()) {
                  // do something
                } else {
                  Exception exception = task.getException();
                  if (exception instanceof AppEngageException) {
                    @AppEngageErrorCode
                    int errorCode = ((AppEngageException) exception).getErrorCode();
                    if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
                      // do something
                    }
                  }
                }
              });

Ошибка возвращается как AppEngageException с указанием причины в виде кода ошибки.

Код ошибки Название ошибки Примечание
1 SERVICE_NOT_FOUND Сервис недоступен на этом устройстве.
2 SERVICE_NOT_AVAILABLE Сервис доступен на устройстве, но не во время вызова (например, он отключен).
3 SERVICE_CALL_EXECUTION_FAILURE Не удалось выполнить задачу из-за проблем с потоками. В этом случае можно повторить попытку.
4 SERVICE_CALL_PERMISSION_DENIED Вызывающий абонент не может выполнить вызов сервиса.
5 SERVICE_CALL_INVALID_ARGUMENT Запрос содержит недопустимые данные (например, количество кластеров превышает допустимое).
6 SERVICE_CALL_INTERNAL Ошибка на стороне сервиса.
7 SERVICE_CALL_RESOURCE_EXHAUSTED Вызов сервиса выполняется слишком часто.

Шаг 3. Обработка намерений широковещательной рассылки

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

Цель широковещательных намерений – повторная активация приложения и принудительная синхронизация данных. Широковещательные намерения не предназначены для частой отправки. Он запускается, только когда сервис Engage определяет, что контент может быть устаревшим (например, ему неделя). Это позволяет пользователю видеть актуальный контент, даже если приложение не запускалось в течение длительного периода времени.

BroadcastReceiver необходимо настроить двумя способами:

  • Динамически зарегистрируйте экземпляр класса BroadcastReceiver с помощью Context.registerReceiver(). Это позволяет приложениям, которые все ещё находятся в памяти, обмениваться данными.

Kotlin

class AppEngageBroadcastReceiver : BroadcastReceiver(){
  // Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION
  // broadcast is received
}

fun registerBroadcastReceivers(context: Context){
  var  context = context
  context = context.applicationContext

// Register Recommendation Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_RECOMMENDATION),
                           com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                           /*scheduler=*/null)
}

Java

class AppEngageBroadcastReceiver extends BroadcastReceiver {
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
// is received
}

public static void registerBroadcastReceivers(Context context) {

context = context.getApplicationContext();

// Register Recommendation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_RECOMMENDATION),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);
}
  • Статически объявите реализацию с помощью тега <receiver> в файле AndroidManifest.xml. Это позволяет приложению получать намерения широковещательной рассылки, когда оно не запущено, а также публиковать контент.

<application>
   <receiver
      android:name=".AppEngageBroadcastReceiver"
      android:permission="com.google.android.engage.REQUEST_ENGAGE_DATA"
      android:exported="true"
      android:enabled="true">
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_RECOMMENDATION" />
      </intent-filter>
   </receiver>
</application>

Сервис будет отправлять следующие намерения:

  • com.google.android.engage.action.PUBLISH_RECOMMENDATION При получении этого намерения рекомендуется начать вызов publishRecommendationClusters.

Процесс интеграции

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

Часто задаваемые вопросы

Часто задаваемые вопросы об Engage SDK

Контакт

Если у вас возникнут вопросы в процессе интеграции, обратитесь в engage-developers@google.com. Наши специалисты ответят вам как можно скорее.

Дальнейшие действия

После завершения интеграции выполните следующие действия:

  • Отправьте письмо на адрес engage-developers@google.com и прикрепите к нему интегрированный APK-файл, готовый к тестированию в Google.
  • Google выполняет проверку, чтобы убедиться, что интеграция работает правильно. Если потребуются изменения, Google свяжется с вами и сообщит необходимые сведения.
  • Если тестирование прошло успешно и изменения не требуются, Google сообщит вам, что вы можете опубликовать обновленный APK-файл в Google Play.
  • После того как Google подтвердит, что обновленный APK-файл опубликован в Google Play, ваши рекомендации и кластеры будут опубликованы и станут видны пользователям.