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

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

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

Детали интеграции

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

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

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

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

Кластер рекомендаций : представление пользовательского интерфейса, содержащее группу рекомендаций от одного и того же партнера-разработчика.

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

  • 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.5.2'
}

Краткое содержание

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

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

Тип кластера Пределы кластера Минимальные пределы сущностей в кластере Максимальные пределы сущностей в кластере
Кластер(ы) рекомендаций Максимум 7 По крайней мере 1 ( PortraitMediaEntity или SocialPostEntity ) Максимум 50 ( PortraitMediaEntity или SocialPostEntity )

Шаг 1: Предоставьте данные об организации

В SDK определены различные сущности для представления каждого типа элементов. SDK поддерживает следующие сущности для категории «Социальные»:

  1. PortraitMediaEntity
  2. SocialPostEntity

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

PortraitMediaEntity

Атрибут Требование Описание Формат
URI действия Необходимый

Глубокая ссылка на сущность в приложении поставщика.

Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы».

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

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

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

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

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

Изображение профиля или аватара пользователя.

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

Инструкции см. в разделе «Характеристики изображения» .
Дополнительное изображение Необязательный

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

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

Инструкции см. в разделе «Характеристики изображения» .
Метаданные, связанные с взаимодействиями (необязательно)
Считать Необязательный

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

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

Нить

Рекомендуемый размер текста: максимум 20 символов для количества и метки.

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

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

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

Длинный
Этикетка Необязательный Укажите, для чего предназначена метка взаимодействия. Например, «Нравится».

Нить

Рекомендуемый размер текста: максимум 20 символов для количества и метки.

Визуальный Необязательный

Укажите цель взаимодействия. Например, изображение значка «Нравится», эмодзи.

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

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

Инструкции см. в разделе «Характеристики изображения» .
DisplayTimeWindow (необязательно) — задайте временное окно для отображения содержимого на поверхности.
Начальная временная метка Необязательный

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

Если не установлено, содержимое может быть отображено на поверхности.

Метка времени эпохи в миллисекундах
Конечная временная метка Необязательный

Метка времени эпохи, после которой контент больше не отображается на поверхности.

Если не установлено, содержимое может быть отображено на поверхности.

Метка времени эпохи в миллисекундах

SocialPostEntity

Атрибут Требование Описание Формат
URI действия Необходимый

Глубокая ссылка на сущность в приложении поставщика.

Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы».

URI

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

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

Изображение(я) Необязательный

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

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

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

Инструкции см. в разделе «Характеристики изображения» .
Текстовое содержание Необязательный Основной текст поста, обновления и т. д. Строка (рекомендуется максимум 140 символов)
Видеоконтент (необязательно)
Продолжительность Необходимый Длительность видео в миллисекундах. Длинный
Изображение Необходимый Предварительный просмотр видеоконтента. Инструкции см. в разделе «Характеристики изображения» .
Предварительный просмотр ссылки (необязательно)
Предварительный просмотр ссылки - Название Необходимый Текст, указывающий заголовок содержимого веб-страницы Нить
Предварительный просмотр ссылки - Имя хоста Необходимый Текст, указывающий владельца веб-страницы, например «INSIDER» Нить
Предварительный просмотр ссылки - Изображение Необязательный Главное изображение для веб-контента Инструкции см. в разделе «Характеристики изображения» .
Метка времени Необязательный Время публикации поста. Метка времени эпохи в миллисекундах
Метаданные, связанные с профилем (необязательно)
Имя Необходимый Имя, идентификатор или никнейм профиля, например «John Doe», «@TeamPixel». Строка (рекомендуется макс. 25 символов)
Дополнительный текст Необязательный

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

Например, «@John-Doe», «5 млн подписчиков», «Вам может понравиться», «В тренде», «5 новых публикаций».

Строка (рекомендуется макс. 40 символов)
Аватар Необходимый

Изображение профиля или аватара пользователя.

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

Инструкции см. в разделе «Характеристики изображения» .
Дополнительное изображение Необязательный

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

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

Инструкции см. в разделе «Характеристики изображения» .
Метаданные, связанные с взаимодействиями (необязательно)
Считать Необходимый Укажите количество взаимодействий, например - «3,7 млн.» Строка (рекомендуемая длина для количества и метки — не более 20 символов)
Этикетка

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

Если не предоставлено, необходимо предоставить визуальное изображение .

Укажите цель взаимодействия. Например, «Нравится». Строка (рекомендуемая длина для количества и метки — не более 20 символов)
Визуальный

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

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

Укажите цель взаимодействия. Например, изображение значка «Нравится», эмодзи.

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

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

Инструкции см. в разделе «Характеристики изображения» .
DisplayTimeWindow (необязательно) — задайте временное окно для отображения содержимого на поверхности.
Начальная временная метка Необязательный

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

Если не установлено, содержимое может быть отображено на поверхности.

Метка времени эпохи в миллисекундах
Конечная временная метка Необязательный

Метка времени эпохи, после которой контент больше не отображается на поверхности.

Если не установлено, содержимое может быть отображено на поверхности.

Метка времени эпохи в миллисекундах

Характеристики изображения

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

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

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

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

5120 КБ

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

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

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

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

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

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

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

isServiceAvailable

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

Котлин

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

Ява

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 Необязательный

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

Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы».

Котлин

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

Ява

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

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

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

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

publishUserAccountManagementRequest

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

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

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

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

Изображения с соотношением сторон 16x9 и разрешением 1264x712

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

Котлин

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());

Ява

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

Котлин

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

Ява

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

deleteRecommendationClusters

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

Котлин

client.deleteRecommendationClusters()

Ява

client.deleteRecommendationClusters();

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

deleteUserManagementCluster

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

Котлин

client.deleteUserManagementCluster()

Ява

client.deleteUserManagementCluster();

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

deleteClusters

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

Котлин

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

Ява

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() . Это обеспечивает связь между приложениями, которые всё ещё находятся в памяти.

Котлин

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)
}

Ява

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 в Play Store.
  • После того, как Google подтвердит, что ваш обновленный APK был опубликован в Play Store, ваши рекомендации и кластеры будут опубликованы и видны пользователям.