Повышайте вовлеченность пользователей, обращаясь к ним там, где они находятся. Интегрируйте Engage SDK, чтобы показывать персональные рекомендации и контент, который пользователи не досмотрели, на разных платформах на устройстве, например в подборках, Entertainment Space и Google Play. Интеграция добавляет менее 50 КБ (в сжатом виде) к среднему размеру APK и занимает у разработчиков около недели. Подробную информацию вы найдете на нашем сайте.
В этом руководстве содержатся инструкции для партнеров-разработчиков по доставке контента из социальных сетей на платформы Google Play Покупок.
Поддерживаемые категории и платформы
Доступность платформ Engage SDK зависит от категории контента в приложении. В таблице ниже указано, какие требования нужно выполнить, чтобы ваши товары показывались на разных платформах.
| Статус | Категория контента или сценарий использования | Поддерживаемые платформы |
|---|---|---|
|
Поддерживается (Доступно на всех платформах) |
|
|
| Чего пользователь не может |
|
Навыки работы с Android
Посмотреть на GitHubИнтегрируйте Engage SDK
android skills add engage-sdk-integrationСведения об интеграции
В следующем разделе приведены подробные сведения об интеграции.
Терминология
Рекомендации. Персонализированные предложения от одного партнера-разработчика.
Рекомендации имеют следующую структуру:
Кластер рекомендаций. Раздел интерфейса, в котором собраны рекомендации от одного партнера-разработчика.
Каждый кластер рекомендаций состоит из объектов одного из двух типов :
- 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 поддерживает следующие объекты для категории "Социальные сети":
PortraitMediaEntitySocialPostEntity
В таблицах ниже перечислены доступные атрибуты и требования для каждого типа.
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:
isServiceAvailablepublishRecommendationClusterspublishUserAccountManagementRequestupdatePublishStatusdeleteRecommendationsClustersdeleteUserManagementClusterdeleteClusters
isServiceAvailable
Этот API используется, чтобы проверить, доступен ли сервис для интеграции и можно ли показывать контент на устройстве.
Для Engage SDK версии 1.6.0 и выше (рекомендуется)
Навыки работы с Android
Посмотреть на GitHubИнтеграция Engage SDK
android skills add engage-sdk-integrationUse the engage-sdk-integration skill to use Engage SDK 1.6.0 and refactor isServiceAvailable to pass ServiceAvailabilityRequest for publishing all cluster types.Вы можете проверить доступность сервиса для каждого типа кластера, который вы собираетесь опубликовать. 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, ваши рекомендации и кластеры будут опубликованы и станут видны пользователям.