Повысьте вовлеченность приложения, охватывая пользователей там, где они находятся. Интегрируйте Engage SDK, чтобы доставлять персонализированные рекомендации и контент для продолжения пользователям напрямую через несколько поверхностей на устройстве, таких как Collections , Entertainment Space и Play Store. Интеграция добавляет менее 50 КБ (сжатый) к среднему APK и занимает у большинства приложений около недели времени разработчика. Узнайте больше на нашем бизнес-сайте .
В этом руководстве содержатся инструкции для партнеров-разработчиков по размещению торгового контента на контент-площадках Engage.
Детали интеграции
Терминология
Эта интеграция включает в себя следующие пять типов кластеров: Рекомендация , Избранное , Корзина покупок , Список покупок , Повторный заказ и Отслеживание заказа покупок .
Кластеры рекомендаций показывают персонализированные предложения по покупкам от отдельного партнера-разработчика. Эти рекомендации могут быть персонализированы для пользователя или обобщены (например, трендовые товары). Используйте их для отображения продуктов, событий, распродаж, акций, подписок по вашему усмотрению.
Ваши рекомендации имеют следующую структуру:
Кластер рекомендаций: представление пользовательского интерфейса, содержащее группу рекомендаций от одного и того же партнера-разработчика.
ShoppingEntity: объект, представляющий отдельный элемент в кластере.
Кластер Featured демонстрирует выборку сущностей от нескольких партнеров-разработчиков в одной группе пользовательского интерфейса. Будет один кластер Featured, который будет отображаться в верхней части пользовательского интерфейса с приоритетным размещением над всеми кластерами Recommendation. Каждому партнеру-разработчику будет разрешено транслировать до 10 сущностей в кластере Featured.
Кластер Shopping Cart показывает краткий обзор корзин покупок от многих партнеров-разработчиков в одной группе пользовательского интерфейса, подталкивая пользователей к завершению своих невыполненных корзин. Существует один кластер Shopping Cart, который отображается в верхней части пользовательского интерфейса с приоритетным размещением над всеми кластерами рекомендаций. Каждому партнеру-разработчику разрешено транслировать до 3 экземпляров
ShoppingCart
в кластере Shopping Cart.Ваша корзина покупок имеет следующую структуру:
Кластер корзины покупок: представление пользовательского интерфейса, содержащее группу предварительных просмотров корзины покупок от многих партнеров-разработчиков.
ShoppingCart: Объект, представляющий предварительный просмотр корзины покупок для одного партнера-разработчика, который будет отображаться в кластере Shopping Cart.
ShoppingCart
должен отображать общее количество товаров в корзине и может также включать изображения для некоторых товаров в корзине пользователя.
Кластер списка покупок показывает краткий обзор списков покупок от нескольких партнеров-разработчиков в одной группировке пользовательского интерфейса, побуждая пользователей вернуться в соответствующее приложение, чтобы обновить и завершить свои списки. Существует один кластер списка покупок.
Кластер Reorder показывает краткий обзор предыдущих заказов от нескольких партнеров-разработчиков в одной группировке пользовательского интерфейса, побуждая пользователей сделать повторный заказ. Существует один кластер Reorder.
Кластер повторного заказа должен отображать общее количество элементов в предыдущем заказе пользователя, а также должен включать одно из следующих:
- Изображения для X элементов в предыдущем заказе пользователя.
- Метки для X элементов в предыдущем заказе пользователя.
Кластер отслеживания заказов покупок отображает краткий обзор ожидающих обработки или недавно завершенных заказов от многих партнеров-разработчиков в одной группе пользовательского интерфейса, что позволяет пользователям отслеживать свои заказы.
Существует один кластер ShoppingOrderTracking, который отображается в верхней части пользовательского интерфейса, с приоритетным размещением над всеми кластерами рекомендаций. Каждому партнеру-разработчику разрешено транслировать несколько элементов ShoppingOrderTrackingEntity в кластере отслеживания заказов покупок.
Ваш 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.5.2'
}
Более подробную информацию см. в разделе Видимость пакетов в Android 11 .
Краткое содержание
Проект основан на реализации связанной службы .
На данные, которые клиент может публиковать, распространяются следующие ограничения для разных типов кластеров:
Тип кластера | Ограничения кластера | Максимальные пределы сущностей в кластере |
---|---|---|
Кластер(ы) рекомендаций | Максимум 7 | Максимум 50 ShoppingEntity |
Избранный кластер | Максимум 1 | Максимум 20 ShoppingEntity |
Кластер корзины покупок | Максимум 1 | Максимум 3 ShoppingCart Несколько корзин ожидаются только для приложений с отдельными корзинами для каждого продавца. |
Кластер списка покупок | Максимум 1 | Максимум 1 ShoppingListEntity |
Кластер повторного заказа покупок | Максимум 1 | Максимум 1 ReorderEntity |
Кластер отслеживания заказов покупок | Максимум 3 | Максимум 3 ShoppingOrderTrackingEntity |
Шаг 1: Предоставьте данные об организации
SDK определил различные сущности для представления каждого типа элемента. Следующие сущности поддерживаются для категории «Покупки»:
-
ShoppingEntity
-
ShoppingCart
-
ShoppingList
-
Reorder
-
ShoppingOrderTracking
В таблицах ниже представлены доступные атрибуты и требования для каждого типа.
ShoppingEntity
Объект ShoppingEntity
представляет продукт, акцию, сделку, подписку или событие, которые партнеры-разработчики хотят опубликовать.
ShoppingEntity
Атрибут | Требование | Описание | Формат |
---|---|---|---|
Изображения постеров | Необходимый | Необходимо предоставить хотя бы одно изображение. | Инструкции см. в разделе «Характеристики изображения» . |
Действие Uri | Необходимый | Глубокая ссылка на страницу в приложении, отображающую сведения о сущности. Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ | Ури |
Заголовок | Необязательный | Название сущности. | Свободный текст Рекомендуемый размер текста: менее 90 символов (слишком длинный текст может содержать многоточия) |
Цена - текущая | Условно требуется | Текущая цена объекта. Обязательно, если указана зачеркнутая цена. | Свободный текст |
Цена - зачеркнутая | Необязательный | Первоначальная цена объекта, которая будет зачеркнута в пользовательском интерфейсе. | Свободный текст |
Вызывать | Необязательный | Призыв к объявлению рекламной акции, события или обновления для организации, если таковые имеются. | Свободный текст Рекомендуемый размер текста: менее 45 символов (слишком длинный текст может содержать многоточия) |
Выноска мелким шрифтом | Необязательный | Текст выноски, набранный мелким шрифтом. | Свободный текст Рекомендуемый размер текста: менее 45 символов (слишком длинный текст может содержать многоточия) |
Рейтинг (необязательно) — Примечание: все рейтинги отображаются с использованием нашей стандартной системы звездного рейтинга. | |||
Рейтинг - Максимальное значение | Необязательный | Максимальное значение шкалы оценок. Необходимо указать, если также указано текущее значение рейтинга. | Число >= 0.0 |
Рейтинг - Текущее значение | Необязательный | Текущее значение рейтинговой шкалы. Необходимо указать, если также указано максимальное значение рейтинга. | Число >= 0.0 |
Рейтинг - Количество | Необязательный | Количество рейтингов для объекта. Примечание: укажите это поле, если ваше приложение управляет тем, как счетчик отображается для пользователей. Используйте краткую строку. Например, если счетчик равен 1 000 000, рассмотрите возможность использования сокращения вроде 1M, чтобы счетчик не обрезался на экранах меньшего размера. | Нить |
Рейтинг - Количество Значение | Необязательный | Количество рейтингов для объекта. Примечание: Укажите это поле, если вы не обрабатываете логику отображения сокращений самостоятельно. Если присутствуют и Count, и Count Value, пользователям отображается Count. | Длинный |
DisplayTimeWindow (необязательно) — установка временного интервала для отображения содержимого на поверхности. | |||
Начало отметки времени | Необязательный | Временная метка эпохи, после которой содержимое должно быть отображено на поверхности. Если не установлено, содержимое может быть отображено на поверхности. | Временная метка эпохи в миллисекундах |
Конечная временная метка | Необязательный | Временная метка эпохи, после которой содержимое больше не отображается на поверхности. Если не установлено, содержимое может быть отображено на поверхности. | Временная метка эпохи в миллисекундах |
ShoppingCart
Атрибут | Требование | Описание | Формат |
---|---|---|---|
Действие Uri | Необходимый | Глубокая ссылка на корзину покупок в приложении партнера. Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ | Ури |
Количество предметов | Необходимый | Количество товаров (а не просто количество продуктов) в корзине. Например: если в корзине 3 одинаковые рубашки и 1 шляпа, то это число должно быть 4. | Целое число >= 1 |
Текст действия | Необязательный | Текст призыва к действию на кнопке «Корзина» (например, «Ваша корзина »). Если разработчик не предоставил текст действия, по умолчанию используется «Просмотр корзины» . Этот атрибут поддерживается начиная с версии 1.1.0. | Нить |
Заголовок | Необязательный | Название корзины (например, «Ваша корзина »). Если разработчик не предоставил заголовок, по умолчанию используется «Ваша корзина» . Если партнер-разработчик публикует отдельную корзину для каждого продавца, укажите в заголовке название продавца . | Свободный текст Рекомендуемый размер текста: менее 25 символов (слишком длинный текст может содержать многоточия) |
Изображения корзины | Необязательный | Изображения каждого товара в корзине. Можно предоставить до 10 изображений в порядке приоритета; фактическое количество отображаемых изображений зависит от форм-фактора устройства. | Инструкции см. в разделе «Характеристики изображения» . |
Этикетки товаров | Необязательный | Список этикеток для товаров в списке покупок. Фактическое количество отображаемых меток зависит от форм-фактора устройства. | Список бесплатных текстовых меток Рекомендуемый размер текста: менее 20 символов (слишком длинный текст может содержать многоточия) |
Временная метка последнего взаимодействия пользователя | Необязательный | Количество миллисекунд, прошедших с момента начала эпохи, определяющее время последнего взаимодействия пользователя с корзиной. Эти данные будут переданы в качестве входных данных партнерам-разработчикам, публикующим отдельную корзину для каждого продавца, и могут быть использованы для ранжирования. | Временная метка эпохи в миллисекундах |
DisplayTimeWindow (необязательно) — установка временного интервала для отображения содержимого на поверхности. | |||
Начало отметки времени | Необязательный | Временная метка эпохи, после которой содержимое должно быть отображено на поверхности. Если не установлено, содержимое может быть отображено на поверхности. | Временная метка эпохи в миллисекундах |
Конечная временная метка | Необязательный | Временная метка эпохи, после которой содержимое больше не отображается на поверхности. Если не установлено, содержимое может быть отображено на поверхности. | Временная метка эпохи в миллисекундах |
ShoppingList
Атрибут | Требование | Описание | Формат |
---|---|---|---|
Действие Uri | Необходимый | Глубокая ссылка на список покупок в приложении партнера. Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ | Ури |
Количество предметов | Необходимый | Количество товаров в списке покупок. | Целое число >= 1 |
Заголовок | Необязательный | Название списка (например, «Ваш список покупок» ). Если разработчик не указал заголовок, по умолчанию используется «Список покупок» . | Свободный текст Рекомендуемый размер текста: менее 25 символов (слишком длинный текст может содержать многоточия) |
Этикетки товаров | Необходимый | Список этикеток для товаров в списке покупок. Необходимо предоставить не менее 1 метки и можно предоставить до 10 меток в порядке приоритета; фактическое количество отображаемых меток зависит от форм-фактора устройства. | Список бесплатных текстовых меток Рекомендуемый размер текста: менее 20 символов (слишком длинный текст может содержать многоточия) |
ShoppingReorderCluster
Атрибут | Требование | Описание | Формат |
---|---|---|---|
Действие Uri | Необходимый | Глубокая ссылка для повторного заказа в приложении партнера. Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ | Ури |
Текст действия | Необязательный | Текст призыва к действию на кнопке «Повторный заказ» (например, «Заказать снова »). Если разработчик не предоставил текст действия, по умолчанию используется действие «Изменить порядок» . Этот атрибут поддерживается начиная с версии 1.1.0. | Нить |
Количество предметов | Необходимый | Количество товаров (а не просто количество продуктов) в предыдущем заказе. Например: если в предыдущем заказе было 3 маленьких кофе и 1 круассан, то это число должно быть 4. | Целое число >= 1 |
Заголовок | Необходимый | Название товара для повторного заказа. | Свободный текст Рекомендуемый размер текста: менее 40 символов (слишком длинный текст может содержать многоточия) |
Этикетки товаров | Необязательный (Если не предоставлено, необходимо предоставить изображения постеров) | Список этикеток товаров для предыдущего заказа. Можно предоставить до 10 меток в порядке приоритета; фактическое количество отображаемых меток зависит от форм-фактора устройства. | Список свободного текста Рекомендуемый размер текста на этикетке: менее 20 символов (слишком длинный текст может содержать многоточия) |
Изображения постеров | Необязательный (Если не указано иное, необходимо предоставить этикетки товаров) | Изображения товаров в предыдущем заказе. Можно предоставить до 10 изображений в порядке приоритета; фактическое количество отображаемых изображений зависит от форм-фактора устройства. | Инструкции см. в разделе «Характеристики изображения» . |
ShoppingOrderTrackingCluster
Атрибут | Требование | Описание | Формат |
---|---|---|---|
Заголовок | Необходимый | Краткое название отслеживаемой посылки/товаров или номер отслеживания. | Свободный текст Рекомендуемый размер текста: 50 символов (слишком длинный текст будет отображаться с многоточиями) |
Тип заказа | Необходимый | Краткое название отслеживаемой посылки/товаров или номер отслеживания. | Перечисление: САМОВЫВОЗ_ИЗ_МАГАЗИНА, ДОСТАВКА_В ТОТ ЖЕ ДЕНЬ, ДОСТАВКА_В ТЕЧЕНИЕ МНОГОДНЯ |
Статус | Необходимый | Текущий статус заказа. Например: «Опоздание», «В пути», «Задержка», «Отправлено», «Доставлено», «Нет в наличии», «Заказ готов» | Свободный текст Рекомендуемый размер текста: 25 символов (слишком длинный текст будет отображаться с многоточиями) |
Время заказа | Необходимый | Временная метка эпохи в миллисекундах, в которую был размещен заказ. Время заказа будет отображаться, если ожидаемое время доставки отсутствует. | Временная метка эпохи в миллисекундах |
Действие Uri | Необходимый | Глубокая ссылка на отслеживание заказа в приложении партнера. | Ури |
OrderDeliveryTimeWindow (необязательно) — установите временное окно для отслеживаемого заказа с момента размещения заказа до времени ожидаемой/фактической доставки. | |||
OrderDeliveryTimeWindow - Время начала | Необязательный | Временная метка эпохи в миллисекундах, через которую/после которой заказ будет доставлен или готов к самовывозу. | Временная метка эпохи в миллисекундах |
OrderDeliveryTimeWindow - Время окончания | Необязательный | Временная метка эпохи в миллисекундах, до которой/когда заказ будет доставлен или готов к самовывозу. | Временная метка эпохи в миллисекундах |
Изображения постеров | Необязательный | Изображение одного товара/продукта, входящего в заказ. Рекомендуемое соотношение сторон 1:1. | Инструкции см. в разделе «Характеристики изображения» . |
Количество предметов | Необязательный | Количество товаров в заказе. | Целое число >= 1 |
Описание | Необязательный | Один абзац текста с описанием позиций в заказе. Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба варианта одновременно. | Свободный текст Рекомендуемый размер текста: 180 символов. |
Список субтитров | Необязательный | До 3 субтитров, каждый из которых представляет собой отдельную строку текста. Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба варианта одновременно. | Свободный текст Рекомендуемый размер текста для каждого субтитра: максимум 50 символов. |
Стоимость заказа - ТекущаяЦена | Необязательный | Текущая стоимость заказа. | Свободный текст |
Номер заказа | Необязательный | Номер/идентификатор заказа, который можно использовать для уникальной идентификации заказа. | Свободный текст Рекомендуемый размер текста: максимум 25 символов. |
Идентификационный номер | Необязательный | Номер отслеживания заказа/посылки в случае, если заказ требует доставки. | Свободный текст Рекомендуемый размер текста: максимум 25 символов. |
Характеристики изображения
Требуемые характеристики для графических ресурсов перечислены ниже:
Соотношение сторон | Минимальное количество пикселей | Рекомендуемые пиксели |
---|---|---|
Квадрат (1x1) Предпочтительно для неизданных кластеров | 300x300 | 1200x1200 |
Пейзаж (1,91x1) Предпочтительно для избранных кластеров | 600x314 | 1200x628 |
Портрет (4x5) | 480x600 | 960x1200 |
Форматы файлов
PNG, JPG, статический GIF, WebP
Максимальный размер файла
5120 КБ
Дополнительные рекомендации
- Безопасная область изображения: разместите важный контент в центре изображения (80%).
- Используйте прозрачный фон, чтобы изображение корректно отображалось в настройках темной и светлой темы.
Шаг 2: Предоставьте данные кластера
Рекомендуется, чтобы задание по публикации контента выполнялось в фоновом режиме (например, с помощью WorkManager ) и планировалось на регулярной основе или на основе события (например, каждый раз, когда пользователь открывает приложение или когда пользователь просто добавляет что-то в свою корзину).
AppEngageShoppingClient
отвечает за публикацию торговых кластеров.
Для публикации кластеров в клиенте доступны следующие API:
-
isServiceAvailable
-
publishRecommendationClusters
-
publishFeaturedCluster
-
publishShoppingCart
-
publishShoppingCarts
-
publishShoppingList
-
publishShoppingReorderCluster
-
publishShoppingOrderTrackingCluster
-
publishUserAccountManagementRequest
-
updatePublishStatus
-
deleteRecommendationsClusters
-
deleteFeaturedCluster
-
deleteShoppingCartCluster
-
deleteShoppingListCluster
-
deleteShoppingReorderCluster
-
deleteShoppingOrderTrackingCluster
-
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
может иметь следующие атрибуты:
Атрибут | Требование | Описание |
---|---|---|
Список торговых объектов | Необходимый | Список объектов ShoppingEntity, которые составляют рекомендации для этого кластера рекомендаций. |
Заголовок | Необходимый | Название кластера рекомендаций. Рекомендуемый размер текста: менее 25 символов (слишком длинный текст может содержать многоточия) |
Подзаголовок | Необязательный | Подзаголовок для кластера рекомендаций. |
Действие Uri | Необязательный | Глубокая ссылка на страницу в партнерском приложении, где пользователи могут увидеть полный список рекомендаций. Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ |
Котлин
client.publishRecommendationClusters( PublishRecommendationClustersRequest.Builder() .addRecommendationCluster( RecommendationCluster.Builder() .addEntity(entity1) .addEntity(entity2) .setTitle("Black Friday Deals") .build()) .build())
Ява
client.publishRecommendationClusters( new PublishRecommendationClustersRequest.Builder() .addRecommendationCluster( new RecommendationCluster.Builder() .addEntity(entity1) .addEntity(entity2) .setTitle("Black Friday Deals") .build()) .build());
При получении запроса сервисом в рамках одной транзакции выполняются следующие действия:
- Все существующие данные кластера рекомендаций удаляются.
- Данные из запроса анализируются и сохраняются в новых кластерах рекомендаций.
В случае ошибки весь запрос отклоняется и сохраняется текущее состояние.
publishFeaturedCluster
Этот API используется для публикации объекта FeaturedCluster
.
Котлин
client.publishFeaturedCluster( PublishFeaturedClusterRequest.Builder() .setFeaturedCluster( FeaturedCluster.Builder() ... .build()) .build())
Ява
client.publishFeaturedCluster( new PublishFeaturedClusterRequest.Builder() .setFeaturedCluster( new FeaturedCluster.Builder() ... .build()) .build());
При получении запроса сервисом в рамках одной транзакции выполняются следующие действия:
- Существующие данные
FeaturedCluster
от партнера-разработчика удаляются. - Данные из запроса анализируются и сохраняются в обновленном Featured Cluster.
В случае ошибки весь запрос отклоняется и сохраняется текущее состояние.
publishShoppingCart
Этот API используется для публикации объекта ShoppingCartCluster
.
Котлин
client.publishShoppingCart( PublishShoppingCartRequest.Builder() .setShoppingCart( ShoppingCart.Builder() ... .build()) .build())
Ява
client.publishShoppingCart( new PublishShoppingCartRequest.Builder() .setShoppingCart( new ShoppingCart.Builder() ... .build()) .build())
При получении запроса сервисом в рамках одной транзакции выполняются следующие действия:
- Существующие данные
ShoppingCart
от партнера-разработчика удаляются. - Данные из запроса анализируются и сохраняются в обновленном кластере корзины покупок.
В случае ошибки весь запрос отклоняется и сохраняется текущее состояние.
publishShoppingCarts
Этот API используется для публикации нескольких объектов ShoppingCart
. Это применимо к партнерам-разработчикам, публикующим отдельные корзины для каждого продавца. При использовании этого API включите в заголовок имя продавца.
Котлин
client.publishShoppingCarts( PublishShoppingCartClustersRequest.Builder() .addShoppingCart( ShoppingCart.Builder() ... .build()) .build())
Ява
client.publishShoppingCarts( new PublishShoppingCartClustersRequest.Builder() .addShoppingCart( new ShoppingCart.Builder() ... .build()) .build())
При получении запроса сервисом в рамках одной транзакции выполняются следующие действия:
- Существующие данные
ShoppingCart
от партнера-разработчика удаляются. - Данные из запроса анализируются и сохраняются в обновленном кластере корзины покупок.
В случае ошибки весь запрос отклоняется и сохраняется текущее состояние.
publishShoppingList
Этот API используется для публикации объекта FoodShoppingList
.
Котлин
client.publishFoodShoppingList( PublishFoodShoppingListRequest.Builder() .setFoodShoppingList( FoodShoppingListEntity.Builder() ... .build()) .build())
Ява
client.publishFoodShoppingList( new PublishFoodShoppingListRequest.Builder() .setFoodShoppingList( new FoodShoppingListEntity.Builder() ... .build()) .build());
При получении запроса сервисом в рамках одной транзакции выполняются следующие действия:
- Существующие данные
FoodShoppingList
от партнера-разработчика удалены. - Данные из запроса анализируются и сохраняются в обновленном кластере списка покупок.
В случае ошибки весь запрос отклоняется и сохраняется текущее состояние.
publishShoppingReorderCluster
Этот API используется для публикации объекта ShoppingReorderCluster
.
Котлин
client.publishShoppingReorderCluster( PublishShoppingReorderClusterRequest.Builder() .setReorderCluster( ShoppingReorderCluster.Builder() ... .build()) .build())
Ява
client.publishShoppingReorderCluster( new PublishShoppingReorderClusterRequest.Builder() .setReorderCluster( new ShoppingReorderCluster.Builder() ... .build()) .build());
При получении запроса сервисом в рамках одной транзакции выполняются следующие действия:
- Существующие данные
ShoppingReorderCluster
от партнера-разработчика удаляются. - Данные из запроса анализируются и сохраняются в обновленном кластере Reorder.
В случае ошибки весь запрос отклоняется и сохраняется текущее состояние.
publishShoppingOrderTrackingCluster
Этот API используется для публикации объекта ShoppingOrderTrackingCluster
.
Котлин
client.publishShoppingOrderTrackingCluster( PublishShoppingOrderTrackingClusterRequest.Builder() .setShoppingOrderTrackingCluster( ShoppingOrderTrackingCluster.Builder() ... .build()) .build())
Ява
client.publishShoppingOrderTrackingCluster( new PublishShoppingOrderTrackingClusterRequest.Builder() .setShoppingOrderTrackingCluster( new ShoppingOrderTrackingCluster.Builder() ... .build()) .build());
При получении запроса сервисом в рамках одной транзакции выполняются следующие действия:
- Существующие данные
ShoppingOrderTrackingCluster
от партнера-разработчика удаляются. - Данные из запроса анализируются и сохраняются в обновленном кластере отслеживания заказов.
В случае ошибки весь запрос отклоняется и сохраняется текущее состояние.
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 рекомендует опубликовать Sign In Card. Если по какой-либо причине поставщики не могут опубликовать Sign In Card, мы рекомендуем вызвать 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();
Когда служба получает запрос, она удаляет существующие данные из Recommendation Clusters. В случае ошибки весь запрос отклоняется, а существующее состояние сохраняется.
deleteFeaturedCluster
Этот API используется для удаления содержимого Featured Cluster.
Котлин
client.deleteFeaturedCluster()
Ява
client.deleteFeaturedCluster();
Когда служба получает запрос, она удаляет существующие данные из Featured Cluster. В случае ошибки весь запрос отклоняется, а существующее состояние сохраняется.
deleteShoppingCartCluster
Этот API используется для удаления содержимого кластера корзины покупок.
Котлин
client.deleteShoppingCartCluster()
Ява
client.deleteShoppingCartCluster();
Когда служба получает запрос, она удаляет существующие данные из кластера корзины покупок. В случае ошибки весь запрос отклоняется, а существующее состояние сохраняется.
deleteShoppingListCluster
Этот API используется для удаления содержимого кластера списка покупок.
Котлин
client.deleteShoppingListCluster()
Ява
client.deleteShoppingListCluster();
Когда служба получает запрос, она удаляет существующие данные из кластера списка покупок. В случае ошибки весь запрос отклоняется и существующее состояние сохраняется.
deleteShoppingReorderCluster
Этот API используется для удаления содержимого кластера повторного заказа покупок.
Котлин
client.deleteShoppingReorderCluster()
Ява
client.deleteShoppingReorderCluster();
Когда служба получает запрос, она удаляет существующие данные из Shopping Reorder Cluster. В случае ошибки весь запрос отклоняется, а существующее состояние сохраняется.
deleteShoppingOrderTrackingCluster
Этот API используется для удаления содержимого кластера отслеживания заказов покупок.
Котлин
client.deleteShoppingOrderTrackingCluster()
Ява
client.deleteShoppingOrderTrackingCluster();
Когда служба получает запрос, она удаляет существующие данные из Shopping Order Tracking Cluster. В случае ошибки весь запрос отклоняется, а существующее состояние сохраняется.
deleteUserManagementCluster
Этот API используется для удаления содержимого кластера UserAccountManagement.
Котлин
client.deleteUserManagementCluster()
Ява
client.deleteUserManagementCluster();
Когда служба получает запрос, она удаляет существующие данные из кластера UserAccountManagement. В случае ошибки весь запрос отклоняется, а существующее состояние сохраняется.
deleteClusters
Этот API используется для удаления содержимого заданного типа кластера.
Котлин
client.deleteClusters( DeleteClustersRequest.Builder() .addClusterType(ClusterType.TYPE_FEATURED) .addClusterType(ClusterType.TYPE_RECOMMENDATION) ... .build())
Ява
client.deleteClusters( new DeleteClustersRequest.Builder() .addClusterType(ClusterType.TYPE_FEATURED) .addClusterType(ClusterType.TYPE_RECOMMENDATION) ... .build());
Когда служба получает запрос, она удаляет существующие данные из всех кластеров, соответствующих указанным типам кластеров. Клиенты могут выбрать передачу одного или нескольких типов кластеров. В случае ошибки весь запрос отклоняется, а существующее состояние сохраняется.
Обработка ошибок
Настоятельно рекомендуется прослушивать результаты выполнения задачи из API публикации, чтобы можно было предпринять последующие действия для восстановления и повторной отправки успешно выполненной задачи.
Котлин
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 } } } }
Ява
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 Service определяет, что контент может быть устаревшим (например, недельной давности). Таким образом, есть больше уверенности в том, что пользователь может получить свежий контент, даже если приложение не запускалось в течение длительного периода времени.
BroadcastReceiver
необходимо настроить следующими двумя способами:
- Динамически зарегистрируйте экземпляр класса
BroadcastReceiver
с помощьюContext.registerReceiver()
. Это позволяет осуществлять связь из приложений, которые все еще находятся в памяти.
Котлин
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)) // Register Featured Cluster Publish Intent context.registerReceiver(AppEngageBroadcastReceiver(), IntentFilter(Intents.ACTION_PUBLISH_FEATURED)) // Register Shopping Cart Cluster Publish Intent context.registerReceiver(AppEngageBroadcastReceiver(), IntentFilter(Intents.ACTION_PUBLISH_SHOPPING_CART)) // Register Shopping List Cluster Publish Intent context.registerReceiver(AppEngageBroadcastReceiver(), IntentFilter(Intents.ACTION_PUBLISH_SHOPPING_LIST)) // Register Reorder Cluster Publish Intent context.registerReceiver(AppEngageBroadcastReceiver(), IntentFilter(Intents.ACTION_PUBLISH_REORDER_CLUSTER)) // Register Shopping Order Tracking Cluster Publish Intent context.registerReceiver(AppEngageBroadcastReceiver(), IntentFilter(Intents.ACTION_PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER)) }
Ява
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)); // Register Featured Cluster Publish Intent context.registerReceiver(new AppEngageBroadcastReceiver(), new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED)); // Register Shopping Cart Cluster Publish Intent context.registerReceiver(new AppEngageBroadcastReceiver(), new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_SHOPPING_CART)); // Register Shopping List Cluster Publish Intent context.registerReceiver(new AppEngageBroadcastReceiver(), new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_SHOPPING_LIST)); // Register Reorder Cluster Publish Intent context.registerReceiver(new AppEngageBroadcastReceiver(), new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_REORDER_CLUSTER)); // 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)); }
- Статически объявите реализацию с тегом
<receiver>
в вашем файлеAndroidManifest.xml
. Это позволяет приложению получать широковещательные намерения, когда оно не запущено, а также позволяет приложению публиковать контент.
<application>
<receiver
android:name=".AppEngageBroadcastReceiver"
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
Рекомендуется начать вызовpublishShoppingCart
при получении этого намерения. -
com.google.android.engage.action.shopping.PUBLISH_SHOPPING_LIST
Рекомендуется начать вызовpublishShoppingList
при получении этого намерения. -
com.google.android.engage.action.shopping.PUBLISH_REORDER_CLUSTER
Рекомендуется начать вызовpublishReorderCluster
при получении этого намерения. -
com.google.android.engage.action.shopping.PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER
Рекомендуется начать вызовpublishShoppingOrderTrackingCluster
при получении этого намерения.
Рабочий процесс интеграции
Пошаговое руководство по проверке интеграции после ее завершения см. в разделе Рабочий процесс интеграции Engage developer .
Часто задаваемые вопросы
См. раздел « Часто задаваемые вопросы по Engage SDK» .
Контакт
Если в процессе интеграции возникнут какие-либо вопросы, свяжитесь с Engage-Developers@google.com . Наша команда ответит как можно скорее.
Следующие шаги
После завершения этой интеграции ваши дальнейшие шаги будут следующими:
- Отправьте электронное письмо на адрес Engage-developers@google.com и прикрепите свой интегрированный APK-файл, готовый к тестированию Google.
- Google выполняет проверку и внутренние обзоры, чтобы убедиться, что интеграция работает так, как ожидалось. Если необходимы изменения, Google свяжется с вами, чтобы предоставить необходимые данные.
- После завершения тестирования и отсутствия необходимости внесения изменений Google свяжется с вами, чтобы уведомить вас о том, что вы можете начать публикацию обновленного и интегрированного APK в Play Store.
- После того, как Google подтвердит, что ваш обновленный APK был опубликован в Play Store, ваши кластеры «Рекомендации» , «Избранное» , «Корзина покупок» , «Список покупок» , «Кластер повторного заказа» и «Кластер отслеживания заказов покупок» могут быть опубликованы и видны пользователям.