Повышайте вовлеченность пользователей, обращаясь к ним там, где они находятся. Интегрируйте Engage SDK, чтобы показывать персональные рекомендации и контент, который пользователи не досмотрели, на разных платформах на устройстве, например в подборках, Entertainment Space и Google Play. Интеграция добавляет менее 50 КБ (в сжатом виде) к среднему размеру APK и занимает у разработчиков около недели. Подробную информацию вы найдете на нашем сайте.
В этом руководстве рассказывается, как партнеры-разработчики могут передавать контент для покупок на платформы Engage.
Поддерживаемые категории и платформы
Доступность платформ Engage SDK зависит от категории контента в приложении. В таблице ниже указано, какие требования нужно выполнить, чтобы ваши товары показывались на разных платформах.
| Статус | Категория контента или сценарий использования | Поддерживаемые платформы |
|---|---|---|
|
Поддерживается (Доступно на всех платформах) |
|
|
| Чего пользователь не может |
|
Навыки работы с Android
Посмотреть на GitHubИнтегрируйте Engage SDK
android skills add engage-sdk-integrationСведения об интеграции
В этом разделе описаны шаги, модели данных и терминология, необходимые для интеграции с Engage SDK для торгового контента.
Терминология
Интеграция включает пять типов кластеров: Рекомендация, Рекомендуемые, Корзина, Список покупок, Повторный заказ и Отслеживание заказа.
Рекомендации. Персонализированные предложения от отдельных партнеров-разработчиков. Рекомендации могут быть персонализированными или общими (например, популярные товары). Используйте их, чтобы продвигать товары, события, распродажи, промоакции и подписки.
Рекомендации имеют следующую структуру:
Кластер рекомендаций. Раздел интерфейса, в котором собраны рекомендации от одного партнера-разработчика.
ShoppingEntity: объект, представляющий один элемент в кластере.
В кластере Рекомендуемые показываются объекты от разных партнеров-разработчиков. В верхней части интерфейса будет только один кластер "Рекомендуемые", который будет иметь приоритет над всеми кластерами рекомендаций. Каждый партнер-разработчик сможет транслировать до 10 объектов в кластере "Рекомендуемые".
Кластер Корзина показывает корзины из приложений разных партнеров-разработчиков в одном месте, напоминая пользователям о незавершенных покупках. Кластер корзины один, и он находится в верхней части интерфейса, выше всех кластеров рекомендаций. Каждый партнер-разработчик может транслировать до трех экземпляров
ShoppingCartв кластере корзины.Корзина покупок имеет следующую структуру:
Кластер корзин. Элемент интерфейса, в котором собраны предварительные версии корзин от разных партнеров-разработчиков.
ShoppingCart. Объект, представляющий предварительный просмотр корзины для одного партнера-разработчика, который будет отображаться в кластере корзины.
ShoppingCartдолжен показывать общее количество товаров в корзине и может включать изображения некоторых товаров в корзине пользователя.
Кластер Список покупок показывает списки покупок из приложений разных партнеров-разработчиков в одном интерфейсе, предлагая пользователям вернуться в соответствующее приложение, чтобы обновить и завершить свои списки. Существует один кластер списка покупок.
В кластере Повторный заказ показываются предыдущие заказы от нескольких партнеров-разработчиков, сгруппированные в одном интерфейсе. Это побуждает пользователей сделать повторный заказ. В кластере Reorder есть только один кластер.
В кластере повторного заказа должно быть указано общее количество товаров в предыдущем заказе пользователя, а также один из следующих элементов:
- Изображения X товаров из предыдущего заказа пользователя.
- Ярлыки для X товаров в предыдущем заказе пользователя.
Кластер Отслеживание заказов позволяет пользователям следить за статусом ожидающих или недавно выполненных заказов от разных партнеров-разработчиков.
Кластер ShoppingOrderTracking находится в верхней части интерфейса, выше всех кластеров рекомендаций. Каждый партнер-разработчик может передавать несколько объектов ShoppingOrderTrackingEntity в кластере Shopping Order Tracking.
Кластер ShoppingOrderTrackingCluster имеет следующую структуру:
- Кластер ShoppingOrderTracking. Элемент интерфейса, который содержит группу предпросмотров отслеживания заказов от разных партнеров-разработчиков.
- ShoppingOrderTrackingEntity – объект, представляющий предварительный просмотр отслеживания заказа для одного партнера-разработчика. Он показывается в кластере отслеживания заказов. В ShoppingOrderTrackingEntity должен быть указан статус заказа и время его оформления. Мы настоятельно рекомендуем указывать ожидаемую дату доставки в ShoppingOrderTrackingEntity, поскольку она показывается пользователям.
Подготовка
Минимальный уровень 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'
}
Подробнее о видимости пакетов в Android 11…
Сводка
Дизайн основан на реализации привязанной службы.
На данные, которые может публиковать клиент, распространяются следующие ограничения для разных типов кластеров:
| Тип кластера | Ограничения кластера | Максимальное количество объектов в кластере |
|---|---|---|
| Кластеры рекомендаций | Не более 7 | Не более 50 ShoppingEntity |
| Рекомендуемый кластер | Не более 1 | Не более 20 ShoppingEntity |
| Кластер корзины покупок | Не более 1 | Не более 3 ShoppingCart
Несколько корзин ожидается только для приложений с отдельными корзинами для каждого продавца. |
| Кластер списка покупок | Не более 1 | Не более 3 ShoppingList |
| Кластер повторного заказа в Покупках | Не более 1 | Не более 1 ReorderEntity |
| Кластер отслеживания заказов в Покупках | Не более 3 | Не более 3 ShoppingOrderTrackingEntity |
Шаг 1. Укажите данные о компании
В SDK определены разные объекты, представляющие каждый тип товара. Для категории "Покупки" поддерживаются следующие объекты:
ShoppingEntityShoppingCartShoppingListReorderShoppingOrderTracking
В таблицах ниже перечислены доступные атрибуты и требования для каждого типа.
ShoppingEntity
Объект ShoppingEntity представляет товар, промоакцию, сделку, подписку или событие, которые партнеры-разработчики хотят опубликовать.
ShoppingEntity
| Атрибут | Требования | Описание | Формат |
|---|---|---|---|
| Постеры | Обязательно | Добавьте хотя бы одно изображение. | Ознакомьтесь со спецификациями изображений. |
| URI действия | Обязательно |
Ссылка на контент в приложении, которая ведет на страницу с подробными сведениями об объекте. Примечание. Ссылки на контент можно использовать для атрибуции. Ознакомьтесь с разделом часто задаваемых вопросов |
URI |
| Название | Необязательно | Название объекта. | Произвольный текст Рекомендуемый размер текста: менее 90 символов (слишком длинный текст может быть сокращен). |
| Цена – текущая | Условно обязательно |
Текущая цена объекта. Обязателен, если указана зачеркнутая цена. |
Произвольный текст |
| Цена – зачеркнутая | Необязательно | Исходная цена объекта, которая будет зачеркнута в интерфейсе. | Произвольный текст |
| Уточнение | Необязательно | Выноска с информацией о промоакции, событии или обновлении, если они есть. | Произвольный текст Рекомендуемая длина текста: до 45 символов. Если текст слишком длинный, он может быть сокращен. |
| Мелкий шрифт в уточнении | Необязательно | Текст мелким шрифтом для уточнения. | Произвольный текст Рекомендуемая длина текста: до 45 символов. Если текст слишком длинный, он может быть сокращен. |
| Оценка (необязательно). Примечание. Все оценки показываются в виде звездочек. | |||
| Оценка – максимальное значение | Необязательно | Максимальное значение оценочной шкалы. Обязательно, если указано текущее значение оценки. |
Число >= 0,0 |
| Оценка – текущее значение | Необязательно | Текущее значение оценочной шкалы. Обязательно, если указано максимальное значение оценки. |
Число >= 0,0 |
| Рейтинг – количество | Необязательно |
Количество оценок объекта. Примечание. Укажите это поле, если ваше приложение управляет тем, как количество отображается пользователям. Используйте краткую строку. Например, если количество равно 1 000 000, используйте сокращение "1 млн", чтобы число не обрезалось на экранах меньшего размера. |
Строка |
| Рейтинг – количество оценок | Необязательно | Количество оценок объекта. Примечание. Заполните это поле, если вы не обрабатываете логику сокращения самостоятельно. Если указаны оба значения, пользователям будет показываться Count. |
Долгота |
| DisplayTimeWindow (необязательно) – задает временной интервал, в течение которого контент будет показываться на платформе. | |||
| Временная метка начала | Необязательно |
Временная метка, после которой контент должен показываться на платформе. Если правило не настроено, контент может показываться на платформе. |
Временная метка в миллисекундах с начала отсчета |
| Временная метка окончания | Необязательно |
Временная метка, после которой контент больше не показывается на платформе. Если правило не настроено, контент может показываться на платформе. |
Временная метка в миллисекундах с начала отсчета |
ShoppingCart
| Атрибут | Требования | Описание | Формат |
|---|---|---|---|
| URI действия | Обязательно |
Ссылка на контент в приложении партнера, которая ведет к корзине. Примечание. Ссылки на контент можно использовать для атрибуции. Ознакомьтесь с разделом часто задаваемых вопросов |
URI |
| Количество элементов | Обязательно |
Количество товаров (а не только количество продуктов) в корзине. Например, если в корзине три одинаковые рубашки и одна шляпа, это число должно быть равно 4. |
Целое число >= 1 |
| Текст действия | Необязательно |
Текст призыва к действию на кнопке корзины, например Ваша корзина. Если разработчик не указал текст действия, по умолчанию используется Посмотреть корзину. Этот атрибут поддерживается в версии 1.1.0 и более поздних. |
Строка |
| Название | Необязательно | Название корзины, например Ваша корзина. Если разработчик не указал заголовок, по умолчанию используется Ваша корзина. Если партнер-разработчик публикует отдельную корзину для каждого продавца, укажите название продавца в заголовке. |
Произвольный текст Рекомендуемая длина текста: не более 25 символов. Если текст слишком длинный, он может быть сокращен. |
| Изображения корзины | Необязательно | Изображения каждого товара в корзине. Вы можете добавить до 10 изображений в порядке приоритета. Количество показываемых изображений зависит от типа устройства. |
Ознакомьтесь со спецификациями изображений. |
| Ярлыки объектов | Необязательно | Список ярлыков для товаров в списке покупок. Фактическое количество ярлыков зависит от типа устройства. |
Список ярлыков в виде текста Рекомендуемая длина текста: не более 20 символов. Если текст слишком длинный, он может быть сокращен. |
| Временная метка последнего взаимодействия пользователя | Необязательно | Количество миллисекунд, прошедших с начала эпохи, определяющее, когда пользователь в последний раз взаимодействовал с корзиной.
Это значение будет передаваться партнерами-разработчиками, которые публикуют отдельные корзины для каждого продавца. Оно может использоваться для ранжирования. |
Временная метка в миллисекундах с начала отсчета |
| DisplayTimeWindow (необязательно) – задает временной интервал, в течение которого контент будет показываться на платформе. | |||
| Временная метка начала | Необязательно |
Временная метка, после которой контент должен показываться на платформе. Если правило не настроено, контент может показываться на платформе. |
Временная метка в миллисекундах с начала отсчета |
| Временная метка окончания | Необязательно |
Временная метка, после которой контент больше не показывается на платформе. Если правило не настроено, контент может показываться на платформе. |
Временная метка в миллисекундах с начала отсчета |
ShoppingList
| Атрибут | Требования | Описание | Формат |
|---|---|---|---|
| URI действия | Обязательно |
Ссылка на контент в приложении партнера, которая ведет к списку покупок. Примечание. Ссылки на контент можно использовать для атрибуции. Ознакомьтесь с разделом часто задаваемых вопросов |
URI |
| Количество элементов | Обязательно | Количество товаров в списке покупок. | Целое число >= 1 |
| Название | Необязательно |
Название списка, например Список покупок. Если разработчик не указал название, по умолчанию используется Список покупок. |
Произвольный текст Рекомендуемая длина текста: не более 25 символов. Если текст слишком длинный, он может быть сокращен. |
| Ярлыки объектов | Обязательно | Список ярлыков для товаров в списке покупок. Необходимо указать хотя бы один ярлык. Максимальное количество ярлыков – 10. Они должны быть перечислены в порядке приоритета. Количество ярлыков, которые будут показаны, зависит от типа устройства. |
Список ярлыков в виде текста Рекомендуемая длина текста: не более 20 символов. Если текст слишком длинный, он может быть сокращен. |
| Временная метка последнего взаимодействия пользователя | Обязательно | Количество миллисекунд, прошедших с начала эпохи, определяющее время последнего взаимодействия пользователя со списком покупок. | Временная метка в миллисекундах с начала отсчета |
ShoppingReorderCluster
| Атрибут | Требования | Описание | Формат |
|---|---|---|---|
| URI действия | Обязательно |
Ссылка на контент в приложении партнера, по которой можно повторить заказ. Примечание. Ссылки на контент можно использовать для атрибуции. Ознакомьтесь с разделом часто задаваемых вопросов |
URI |
| Текст действия | Необязательно |
Текст призыва к действию на кнопке повторного заказа, например Заказать снова. Если разработчик не указал текст действия, по умолчанию используется Заказать снова. Этот атрибут поддерживается в версии 1.1.0 и более поздних. |
Строка |
| Количество элементов | Обязательно |
Количество товаров (не только количество продуктов) в предыдущем заказе. Например, если в предыдущем заказе было три маленьких кофе и один круассан, то это число должно быть равно четырем. |
Целое число >= 1 |
| Название | Обязательно | Название товара, который вы хотите заказать повторно. | Произвольный текст Рекомендуемая длина текста: не более 40 символов. Если текст слишком длинный, он может быть сокращен. |
| Ярлыки объектов | Необязательно (Если не указано, необходимо предоставить изображения постеров) |
Список ярлыков товаров для предыдущего заказа. Можно указать до 10 ярлыков в порядке приоритета. Фактическое количество ярлыков зависит от типа устройства. |
Список произвольного текста Рекомендуемый размер текста для каждого ярлыка: менее 20 символов. (Слишком длинный текст может быть сокращен и дополнен многоточием.) |
| Постеры | Необязательно (Если не указано, необходимо указать ярлыки объектов) |
Изображения товаров из предыдущего заказа. Вы можете добавить до 10 изображений в порядке приоритета. Количество показываемых изображений зависит от типа устройства. |
Ознакомьтесь со спецификациями изображений. |
ShoppingOrderTrackingCluster
| Атрибут | Требования | Описание | Формат |
|---|---|---|---|
| Название | Обязательно |
Краткое название отслеживаемой посылки или товаров либо номер отслеживания. |
Произвольный текст Рекомендуемая длина текста: 50 символов (слишком длинный текст будет сокращен многоточием). |
| Тип заказа | Обязательно |
Краткое название отслеживаемой посылки или товаров либо номер отслеживания. |
Enum: IN_STORE_PICKUP, SAME_DAY_DELIVERY, MULTI_DAY_DELIVERY |
| Статус | Обязательно |
Текущий статус заказа. Примеры: "Задерживается", "В пути", "Отправлено", "Доставлено", "Нет в наличии", "Заказ готов". |
Произвольный текст Рекомендуемая длина текста: 25 символов. Если текст слишком длинный, он будет сокращен и в конце появится многоточие. |
| Время заказа | Обязательно |
Временная метка в миллисекундах, когда был размещен заказ. Если не указано ожидаемое время доставки, будет показано время заказа. |
Временная метка в миллисекундах с начала отсчета |
| URI действия | Обязательно |
Ссылка на контент для отслеживания заказа в приложении партнера. |
URI |
| OrderDeliveryTimeWindow (необязательно) – временной интервал для отслеживаемого заказа, от момента его размещения до ожидаемого или фактического времени доставки. | |||
| OrderDeliveryTimeWindow - Start Time | Необязательно |
Временная метка в миллисекундах, указывающая, когда заказ будет доставлен или готов к самовывозу. |
Временная метка в миллисекундах с начала отсчета |
| OrderDeliveryTimeWindow - End Time | Необязательно |
Временная метка в миллисекундах, указывающая, когда заказ будет доставлен или готов к самовывозу. |
Временная метка в миллисекундах с начала отсчета |
| Постеры | Необязательно | Изображение одного товара из заказа. Рекомендуемое соотношение сторон – 1:1. |
Ознакомьтесь со спецификациями изображений. |
| Количество элементов | Необязательно | Количество товаров в заказе. | Целое число >= 1 |
| Описание | Необязательно | Один абзац текста с описанием товаров в заказе. Примечание. Пользователю будет показано либо описание, либо список подзаголовков, но не оба элемента. |
Произвольный текст Рекомендуемый размер текста: 180 символов. |
| Список субтитров | Необязательно | До трех подзаголовков, каждый из которых состоит из одной строки текста. Примечание. Пользователю будет показано либо описание, либо список подзаголовков, но не оба элемента. |
Произвольный текст Рекомендуемый размер текста для каждой строки субтитров: не более 50 символов. |
| Стоимость заказа – текущая цена | Необязательно | Текущая стоимость заказа. | Произвольный текст |
| Номер заказа | Необязательно | Номер или идентификатор заказа, который позволяет однозначно идентифицировать заказ. |
Произвольный текст Рекомендуемый размер текста: не более 25 символов. |
| Номер отслеживания | Необязательно | Номер отслеживания заказа или посылки, если требуется доставка. |
Произвольный текст Рекомендуемый размер текста: не более 25 символов. |
Требования к картинкам
В таблице ниже приведены требования к объектам изображений.
| Соотношение сторон | Минимальный размер (пиксели) | Рекомендуемый размер (пиксели) |
|---|---|---|
|
Квадрат (1:1). Предпочтительно для нерекомендуемых кластеров |
300x300 | 1200x1200 |
|
Горизонтальное (1,91:1) Предпочтительные для рекомендуемых кластеров |
600x314 | 1200x628 |
| Вертикальное (4:5) | 480x600 | 960x1200 |
Форматы файлов
PNG, JPG, статический GIF, WebP
Максимальный размер файла
5120 КБ
Дополнительные рекомендации
- Рекомендуемые пределы допустимой области изображения: важный контент должен занимать центральные 80% изображения.
- Используйте прозрачный фон, чтобы изображение правильно отображалось в светлой и темной темах.
Шаг 2. Предоставьте данные о кластере
Рекомендуется выполнять публикацию контента в фоновом режиме (например, с помощью WorkManager) и запланировать ее на регулярной основе или на основе событий (например, каждый раз, когда пользователь открывает приложение или когда пользователь только что добавил что-то в свою корзину).
AppEngageShoppingClient отвечает за публикацию кластеров покупок.
Для публикации кластеров в клиенте используются следующие API:
isServiceAvailablepublishRecommendationClusterspublishFeaturedClusterpublishShoppingCartspublishShoppingListspublishShoppingReorderClusterpublishShoppingOrderTrackingClusterpublishUserAccountManagementRequestupdatePublishStatusdeleteRecommendationsClustersdeleteFeaturedClusterdeleteShoppingCartClusterdeleteShoppingListClusterdeleteReorderClusterdeleteShoppingOrderTrackingClusterdeleteUserManagementClusterdeleteClusters
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_SHOPPING_CART |
4 |
| Кластер управления пользователями | TYPE_ENGAGEMENT |
8 |
| Кластер списка покупок | TYPE_SHOPPING_LIST |
9 |
| Кластер повторного заказа в Покупках | TYPE_SHOPPING_REORDER |
10 |
| Кластер отслеживания заказов в Покупках | TYPE_SHOPPING_ORDER_TRACKING |
11 |
| Кластер подписок | 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 может иметь следующие атрибуты:
| Атрибут | Требования | Описание |
|---|---|---|
| Список ShoppingEntity | Обязательно | Список объектов ShoppingEntity, которые составляют рекомендации для этого кластера. |
| Название | Обязательно | Название кластера рекомендаций. Рекомендуемая длина текста: до 25 символов. Если текст слишком длинный, он может быть сокращен. |
| Подзаголовок | Необязательно | Подзаголовок кластера рекомендаций. |
| URI действия | Необязательно |
Ссылка на контент в приложении партнера, где пользователи могут посмотреть полный список рекомендаций. Примечание. Ссылки на контент можно использовать для атрибуции. Ознакомьтесь с разделом часто задаваемых вопросов |
Kotlin
client.publishRecommendationClusters(
PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(
RecommendationCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.setTitle("Black Friday Deals")
.build())
.build())
Java
client.publishRecommendationClusters(
new PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(
new RecommendationCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.setTitle("Black Friday Deals")
.build())
.build());
Когда сервис получает запрос, в рамках одной транзакции выполняются следующие действия:
- Все существующие данные кластера рекомендаций удаляются.
- Данные из запроса анализируются и сохраняются в новых кластерах рекомендаций.
В случае ошибки весь запрос отклоняется и сохраняется существующее состояние.
publishFeaturedCluster
Этот API используется для публикации объекта FeaturedCluster.
Kotlin
client.publishFeaturedCluster(
PublishFeaturedClusterRequest.Builder()
.setFeaturedCluster(
FeaturedCluster.Builder()
...
.build())
.build())
Java
client.publishFeaturedCluster(
new PublishFeaturedClusterRequest.Builder()
.setFeaturedCluster(
new FeaturedCluster.Builder()
...
.build())
.build());
Когда сервис получает запрос, в рамках одной транзакции выполняются следующие действия:
- Существующие данные
FeaturedClusterот партнера-разработчика удаляются. - Данные из запроса анализируются и сохраняются в обновленной группе.
В случае ошибки весь запрос отклоняется и сохраняется существующее состояние.
publishShoppingCarts
Этот API используется для публикации списка объектов ShoppingCart. Это применимо к партнерам-разработчикам, которые публикуют отдельные корзины для каждого продавца. При использовании этого API включайте в название название продавца.
Kotlin
client.publishShoppingCarts(
PublishShoppingCartClustersRequest.Builder()
.addShoppingCart(
ShoppingCart.Builder()
...
.build())
.build())
Java
client.publishShoppingCarts(
new PublishShoppingCartClustersRequest.Builder()
.addShoppingCart(
new ShoppingCart.Builder()
...
.build())
.build())
Когда сервис получает запрос, в рамках одной транзакции выполняются следующие действия:
- Существующие данные
ShoppingCartот партнера-разработчика удаляются. - Данные из запроса анализируются и сохраняются в обновленном кластере корзины.
В случае ошибки весь запрос отклоняется и сохраняется существующее состояние.
publishShoppingLists
Этот API используется для публикации списка объектов ShoppingList.
Kotlin
client.publishShoppingLists(
PublishShoppingListsRequest.Builder()
.addShoppingList(
ShoppingList.Builder()
...
.build())
.build())
Java
client.publishShoppingLists(
new PublishShoppingListsRequest.Builder()
.addShoppingList(
new ShoppingList.Builder()
...
.build())
.build());
Когда сервис получает запрос, в рамках одной транзакции выполняются следующие действия:
- Существующие данные
ShoppingListот партнера-разработчика удаляются. - Данные из запроса анализируются и сохраняются в обновленном кластере списка покупок.
В случае ошибки весь запрос отклоняется и сохраняется существующее состояние.
publishShoppingReorderCluster
Этот API используется для публикации объекта ShoppingReorderCluster.
Kotlin
client.publishShoppingReorderCluster(
PublishShoppingReorderClusterRequest.Builder()
.setReorderCluster(
ShoppingReorderCluster.Builder()
...
.build())
.build())
Java
client.publishShoppingReorderCluster(
new PublishShoppingReorderClusterRequest.Builder()
.setReorderCluster(
new ShoppingReorderCluster.Builder()
...
.build())
.build());
Когда сервис получает запрос, в рамках одной транзакции выполняются следующие действия:
- Существующие данные
ShoppingReorderClusterот партнера-разработчика удаляются. - Данные из запроса анализируются и сохраняются в обновленном кластере повторного заказа.
В случае ошибки весь запрос отклоняется и сохраняется существующее состояние.
publishShoppingOrderTrackingCluster
Этот API используется для публикации объекта ShoppingOrderTrackingCluster.
Kotlin
client.publishShoppingOrderTrackingCluster(
PublishShoppingOrderTrackingClusterRequest.Builder()
.setShoppingOrderTrackingCluster(
ShoppingOrderTrackingCluster.Builder()
...
.build())
.build())
Java
client.publishShoppingOrderTrackingCluster(
new PublishShoppingOrderTrackingClusterRequest.Builder()
.setShoppingOrderTrackingCluster(
new ShoppingOrderTrackingCluster.Builder()
...
.build())
.build());
Когда сервис получает запрос, в рамках одной транзакции выполняются следующие действия:
- Существующие данные
ShoppingOrderTrackingClusterот партнера-разработчика удаляются. - Данные из запроса анализируются и сохраняются в обновленном кластере отслеживания заказов в Покупках.
В случае ошибки весь запрос отклоняется и сохраняется существующее состояние.
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();
Когда сервис получает запрос, он удаляет существующие данные из кластеров рекомендаций. В случае ошибки весь запрос отклоняется и сохраняется существующее состояние.
deleteFeaturedCluster
Этот API используется для удаления контента из рекомендуемой группы.
Kotlin
client.deleteFeaturedCluster()
Java
client.deleteFeaturedCluster();
Когда сервис получает запрос, он удаляет существующие данные из рекомендуемого кластера. В случае ошибки весь запрос отклоняется и сохраняется существующее состояние.
deleteShoppingCartCluster
Этот API используется для удаления контента кластера корзины.
Kotlin
client.deleteShoppingCartCluster()
Java
client.deleteShoppingCartCluster();
Когда сервис получает запрос, он удаляет существующие данные из кластера корзины. В случае ошибки весь запрос отклоняется и сохраняется существующее состояние.
deleteShoppingListCluster
Этот API используется для удаления контента кластера списка покупок.
Kotlin
client.deleteShoppingListCluster()
Java
client.deleteShoppingListCluster();
Когда сервис получает запрос, он удаляет существующие данные из кластера списка покупок. В случае ошибки весь запрос отклоняется и сохраняется существующее состояние.
deleteReorderCluster
Этот API используется для удаления контента кластера повторного заказа в Покупках.
Kotlin
client.deleteReorderCluster()
Java
client.deleteReorderCluster();
Получив запрос, сервис удаляет существующие данные из кластера повторного заказа в Покупках. В случае ошибки весь запрос отклоняется и сохраняется существующее состояние.
deleteShoppingOrderTrackingCluster
Этот API используется для удаления контента кластера отслеживания заказов в Покупках.
Kotlin
client.deleteShoppingOrderTrackingCluster()
Java
client.deleteShoppingOrderTrackingCluster();
Получив запрос, сервис удаляет существующие данные из кластера отслеживания заказов в Покупках. В случае ошибки весь запрос отклоняется и сохраняется существующее состояние.
deleteUserManagementCluster
Этот API используется для удаления контента кластера UserAccountManagement.
Kotlin
client.deleteUserManagementCluster()
Java
client.deleteUserManagementCluster();
Когда сервис получает запрос, он удаляет существующие данные из кластера UserAccountManagement. В случае ошибки весь запрос отклоняется и сохраняется существующее состояние.
deleteClusters
Этот API используется для удаления контента кластера определенного типа.
Kotlin
client.deleteClusters(
DeleteClustersRequest.Builder()
.addClusterType(ClusterType.TYPE_FEATURED)
.addClusterType(ClusterType.TYPE_RECOMMENDATION)
...
.build())
Java
client.deleteClusters(
new DeleteClustersRequest.Builder()
.addClusterType(ClusterType.TYPE_FEATURED)
.addClusterType(ClusterType.TYPE_RECOMMENDATION)
...
.build());
Когда сервис получает запрос, он удаляет существующие данные из всех кластеров, соответствующих указанным типам. Клиенты могут передавать один или несколько типов кластеров. В случае ошибки весь запрос отклоняется, а существующее состояние сохраняется.
Обработка ошибок
Настоятельно рекомендуется отслеживать результаты выполнения задач, полученные от API публикации, чтобы можно было предпринять последующие действия по восстановлению и повторной отправке успешной задачи.
Kotlin
client.publishRecommendationClusters(
PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(..)
.build())
.addOnCompleteListener { task ->
if (task.isSuccessful) {
// do something
} else {
val exception = task.exception
if (exception is AppEngageException) {
@AppEngageErrorCode val errorCode = exception.errorCode
if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
// do something
}
}
}
}
Java
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 для получения запроса на публикацию контента.
Цель широковещательных намерений – повторная активация приложения и принудительная синхронизация данных. Широковещательные намерения не предназначены для частой отправки. Он запускается, только когда сервис Google Play Объекты определяет, что контент может быть устаревшим (например, ему неделя). Это позволяет пользователю видеть актуальный контент, даже если приложение не запускалось в течение длительного периода времени.
BroadcastReceiver необходимо настроить двумя способами:
Динамически зарегистрируйте экземпляр класса
BroadcastReceiverс помощьюContext.registerReceiver(). Это позволяет приложениям, которые все ещё находятся в памяти, обмениваться данными.
Kotlin
class AppEngageBroadcastReceiver : BroadcastReceiver(){
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION
// broadcast is received
// Trigger featured cluster publish when PUBLISH_FEATURED broadcast is
// received
// Trigger shopping cart cluster publish when PUBLISH_SHOPPING_CART broadcast
// is received
// Trigger shopping list cluster publish when PUBLISH_SHOPPING_LIST broadcast
// is received
// Trigger reorder cluster publish when PUBLISH_REORDER_CLUSTER broadcast is
// received
// Trigger shopping order tracking cluster publish when
// PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER 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)
// Register Featured Cluster Publish Intent
context.registerReceiver(AppEngageBroadcastReceiver(),
IntentFilter(Intents.ACTION_PUBLISH_FEATURED),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null)
// Register Shopping Cart Cluster Publish Intent
context.registerReceiver(AppEngageBroadcastReceiver(),
IntentFilter(Intents.ACTION_PUBLISH_SHOPPING_CART),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null)
// Register Shopping List Cluster Publish Intent
context.registerReceiver(AppEngageBroadcastReceiver(),
IntentFilter(Intents.ACTION_PUBLISH_SHOPPING_LIST),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null)
// Register Reorder Cluster Publish Intent
context.registerReceiver(AppEngageBroadcastReceiver(),
IntentFilter(Intents.ACTION_PUBLISH_REORDER_CLUSTER),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null)
// Register Shopping Order Tracking Cluster Publish Intent
context.registerReceiver(AppEngageBroadcastReceiver(),
IntentFilter(Intents.ACTION_PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER),
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
// Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received
// Trigger shopping cart cluster publish when PUBLISH_SHOPPING_CART broadcast is
// received
// Trigger shopping list cluster publish when PUBLISH_SHOPPING_LIST broadcast is
// received
// Trigger reorder cluster publish when PUBLISH_REORDER_CLUSTER broadcast is
// received
// Trigger reorder cluster publish when PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER
// 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);
// Register Featured Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null);
// Register Shopping Cart Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_SHOPPING_CART),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null);
// Register Shopping List Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_SHOPPING_LIST),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null);
// Register Reorder Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_REORDER_CLUSTER),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null);
// Register Shopping Order Tracking Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER),
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>
<intent-filter>
<action android:name="com.google.android.engage.action.PUBLISH_FEATURED" />
</intent-filter>
<intent-filter>
<action android:name="com.google.android.engage.action.shopping.PUBLISH_SHOPPING_CART" />
</intent-filter>
<intent-filter>
<action android:name="com.google.android.engage.action.shopping.PUBLISH_SHOPPING_LIST" />
</intent-filter>
<intent-filter>
<action android:name="com.google.android.engage.action.shopping.PUBLISH_REORDER_CLUSTER" />
</intent-filter>
<intent-filter>
<action android:name="com.google.android.engage.action.shopping.PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER" />
</intent-filter>
</receiver>
</application>
Сервис отправляет следующие намерения:
com.google.android.engage.action.PUBLISH_RECOMMENDATIONПри получении этого намерения рекомендуется начать вызовpublishRecommendationClusters.com.google.android.engage.action.PUBLISH_FEATUREDПри получении этого намерения рекомендуется запустить вызовpublishFeaturedCluster.com.google.android.engage.action.shopping.PUBLISH_SHOPPING_CARTПри получении этого намерения рекомендуется запустить вызовpublishShoppingCarts.com.google.android.engage.action.shopping.PUBLISH_SHOPPING_LISTПри получении этого намерения рекомендуется запустить вызовpublishShoppingLists.com.google.android.engage.action.shopping.PUBLISH_REORDER_CLUSTERПри получении этого намерения рекомендуется запустить вызовpublishReorderCluster.com.google.android.engage.action.shopping.PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTERПри получении этого намерения рекомендуется начать вызовpublishShoppingOrderTrackingCluster.
Процесс интеграции
Пошаговые инструкции по проверке интеграции после ее завершения можно найти в руководстве по интеграции для разработчиков.
Часто задаваемые вопросы
Часто задаваемые вопросы об Engage SDK
Контакт
Если у вас возникнут вопросы в процессе интеграции, обратитесь в engage-developers@google.com. Наши специалисты ответят вам как можно скорее.
Дальнейшие действия
После завершения интеграции выполните следующие действия:
- Отправьте письмо на адрес
engage-developers@google.comи прикрепите к нему интегрированный APK-файл, готовый к тестированию в Google. - Google выполняет проверку, чтобы убедиться, что интеграция работает правильно. Если потребуются изменения, Google свяжется с вами и сообщит необходимые сведения.
- Если тестирование прошло успешно и изменения не требуются, Google сообщит вам, что вы можете опубликовать обновленный APK-файл в Google Play.
- После того как Google подтвердит, что обновленный APK-файл опубликован в Google Play, ваши кластеры Рекомендации, Рекомендуемые, Корзина, Список покупок, Кластер повторных заказов и Кластер отслеживания заказов могут быть опубликованы и стать видны пользователям.