Google создает поверхность на устройстве, которая организует приложения пользователей по вертикалям и обеспечивает новый захватывающий опыт для персонализированного потребления и обнаружения контента приложений. Этот полноэкранный режим дает партнерам-разработчикам возможность продемонстрировать свой лучший насыщенный контент на специальном канале за пределами своего приложения.
В этом руководстве содержатся инструкции для партнеров-разработчиков по интеграции своего торгового контента с помощью Engage SDK для заполнения как этой новой области, так и существующих поверхностей Google, таких как Entertainment Space.
Детали интеграции
Терминология
Эта интеграция включает в себя следующие пять типов кластеров: «Рекомендации» , «Рекомендуемые» , «Корзина покупок », «Список покупок» , «Повторный заказ» и «Отслеживание заказов покупок» .
В кластерах рекомендаций отображаются персонализированные предложения по покупкам от отдельного партнера-разработчика. Эти рекомендации могут быть персонализированы для пользователя или обобщены (например, трендовые элементы). Используйте их для рекламы продуктов, событий, распродаж, промо-акций и подписок по своему усмотрению.
Ваши рекомендации имеют следующую структуру:
Кластер рекомендаций: представление пользовательского интерфейса, содержащее группу рекомендаций от одного и того же партнера-разработчика.
ShoppingEntity: объект, представляющий один элемент в кластере.
В кластере «Рекомендуемые» представлены объекты от нескольких партнеров-разработчиков в одной группе пользовательского интерфейса. Будет один кластер «Рекомендуемые», который будет отображаться в верхней части пользовательского интерфейса с приоритетом над всеми кластерами «Рекомендации». Каждому партнеру-разработчику будет разрешено транслировать до 10 объектов в избранном кластере.
Кластер «Корзина покупок» показывает краткий обзор корзин покупок от многих партнеров-разработчиков в одной группе пользовательского интерфейса, побуждая пользователей заполнить свои выдающиеся корзины. Существует один кластер корзины покупок, который отображается в верхней части пользовательского интерфейса и имеет приоритетное размещение над всеми кластерами рекомендаций. Каждому партнеру-разработчику разрешено транслировать до трех экземпляров
ShoppingCart
в кластере Shopping Cart.Ваша корзина покупок имеет следующую структуру:
Кластер корзин покупок: представление пользовательского интерфейса, содержащее группу предварительных просмотров корзин покупок от многих партнеров-разработчиков.
ShoppingCart: объект, представляющий предварительный просмотр корзины покупок для одного партнера-разработчика, который будет отображаться в кластере корзины покупок.
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 .
Краткое содержание
Проект основан на реализации привязанного сервиса .
На данные, которые клиент может публиковать, распространяются следующие ограничения для разных типов кластеров:
Тип кластера | Ограничения кластера | Максимальные ограничения объектов в кластере |
---|---|---|
Кластер(ы) рекомендаций | Максимум 5 | Не более 25 ShoppingEntity |
Рекомендуемый кластер | Максимум 1 | Не более 10 ShoppingEntity |
Кластер корзины покупок | Максимум 1 | Не более 3 ShoppingCart Несколько корзин ожидаются только для приложений с отдельными корзинами для каждого продавца. |
Кластер списков покупок | Максимум 1 | Не более 1 ShoppingListEntity |
Кластер повторного заказа покупок | Максимум 1 | Не более 1 ReorderEntity |
Кластер отслеживания заказов на покупки | Максимум 3 | Не более 3 ShoppingOrderTrackingEntity |
Шаг 1. Предоставьте данные об объекте
В SDK определены разные объекты для представления каждого типа элементов. Для категории «Покупки» поддерживаются следующие объекты:
-
ShoppingEntity
-
ShoppingCart
-
ShoppingList
-
Reorder
-
ShoppingOrderTracking
В таблицах ниже показаны доступные атрибуты и требования для каждого типа.
ShoppingEntity
Объект ShoppingEntity
представляет продукт, рекламную акцию, сделку, подписку или событие, которое партнеры-разработчики хотят опубликовать.
ShoppingEntity
Атрибут | Требование | Описание | Формат |
---|---|---|---|
Изображения для плакатов | Необходимый | Необходимо предоставить хотя бы одно изображение. | Дополнительные сведения см. в разделе «Спецификации изображения» . |
Действие Ури | Необходимый | Глубокая ссылка на страницу в приложении, отображающую подробную информацию об объекте. Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ | Ури |
Заголовок | Необязательный | Имя сущности. | Произвольный текст Рекомендуемый размер текста: до 90 символов (слишком длинный текст может содержать многоточие). |
Цена - текущая | Условно требуется | Текущая цена объекта. Должно быть указано, если указана зачеркнутая цена. | Произвольный текст |
Цена - зачеркнуто | Необязательный | Исходная цена объекта, которая будет перечеркнута в пользовательском интерфейсе. | Произвольный текст |
Вызывать | Необязательный | Выноска, чтобы рассказать о промо-акции, событии или обновлении для организации, если таковая имеется. | Произвольный текст Рекомендуемый размер текста: до 45 символов (слишком длинный текст может содержать многоточие). |
Выноска мелким шрифтом | Необязательный | Текст выноски мелким шрифтом. | Произвольный текст Рекомендуемый размер текста: до 45 символов (слишком длинный текст может содержать многоточие). |
Рейтинг (необязательно). Примечание. Все рейтинги отображаются с использованием нашей стандартной звездной системы. | |||
Рейтинг – максимальное значение | Необязательный | Максимальное значение рейтинговой шкалы. Должно быть указано, если также указано текущее значение рейтинга. | Число >= 0,0 |
Рейтинг - Текущее значение | Необязательный | Текущее значение оценочной шкалы. Должно быть указано, если также указано максимальное значение рейтинга. | Число >= 0,0 |
Рейтинг – подсчет | Необязательный | Количество рейтингов сущности. Примечание. Укажите это поле, если ваше приложение контролирует отображение счетчика пользователям. Используйте краткую строку. Например, если счетчик равен 1 000 000, рассмотрите возможность использования сокращения, например 1M, чтобы счетчик не обрезался на дисплеях меньшего размера. | Нить |
Рейтинг – значение подсчета | Необязательный | Количество рейтингов сущности. Примечание. Укажите это поле, если вы не обрабатываете логику сокращений дисплея самостоятельно. Если присутствуют и счетчик, и значение счетчика, пользователям отображается счетчик. | Длинный |
DisplayTimeWindow (необязательно) — установите временное окно для отображения содержимого на поверхности. | |||
Начальная отметка времени | Необязательный | Временная метка эпохи, после которой содержимое должно отображаться на поверхности. Если не установлено, контент может отображаться на поверхности. | Временная метка эпохи в миллисекундах |
Конечная временная метка | Необязательный | Временная метка эпохи, после которой содержимое больше не отображается на поверхности. Если не установлено, контент может отображаться на поверхности. | Временная метка эпохи в миллисекундах |
ShoppingCart
Атрибут | Требование | Описание | Формат |
---|---|---|---|
Действие Ури | Необходимый | Глубокая ссылка на корзину в партнерском приложении. Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ | Ури |
Количество предметов | Необходимый | Количество товаров (а не просто количество товаров) в корзине. Например: Если в корзине 3 одинаковых рубашки и 1 шляпа, это число должно быть 4. | Целое число >= 1 |
Текст действия | Необязательный | Текст призыва к действию кнопки в корзине покупок (например, «Ваша корзина» ). Если разработчик не предоставил текст действия, по умолчанию используется «Просмотр корзины» . Этот атрибут поддерживается начиная с версии 1.1.0. | Нить |
Заголовок | Необязательный | Название корзины (например, «Ваша сумка» ). Если разработчик не указал название, по умолчанию используется ваша корзина . Если партнер-разработчик публикует отдельную корзину для каждого продавца, укажите название продавца в заголовке. | Произвольный текст Рекомендуемый размер текста: до 25 символов (слишком длинный текст может содержать многоточие). |
Изображения корзины | Необязательный | Изображения каждого товара в корзине. Можно предоставить до 10 изображений в порядке приоритета; фактическое количество отображаемых изображений зависит от форм-фактора устройства. | Дополнительные сведения см. в разделе «Спецификации изображения» . |
Ярлыки предметов | Необязательный | Список меток для товаров в списке покупок. Фактическое количество отображаемых этикеток зависит от форм-фактора устройства. | Список меток произвольного текста Рекомендуемый размер текста: менее 20 символов (слишком длинный текст может содержать многоточие). |
Временная метка последнего взаимодействия с пользователем | Необязательный | Количество миллисекунд, прошедших с эпохи, определяющее последний раз, когда пользователь взаимодействовал с корзиной. Партнеры-разработчики будут передавать эту информацию в качестве входных данных, публикуя отдельную корзину для каждого продавца, и, возможно, использовать ее для ранжирования. | Временная метка эпохи в миллисекундах |
DisplayTimeWindow (необязательно) — установите временное окно для отображения содержимого на поверхности. | |||
Начальная отметка времени | Необязательный | Временная метка эпохи, после которой содержимое должно отображаться на поверхности. Если не установлено, контент может отображаться на поверхности. | Временная метка эпохи в миллисекундах |
Конечная временная метка | Необязательный | Временная метка эпохи, после которой содержимое больше не отображается на поверхности. Если не установлено, контент может отображаться на поверхности. | Временная метка эпохи в миллисекундах |
ShoppingList
Атрибут | Требование | Описание | Формат |
---|---|---|---|
Действие Ури | Необходимый | Глубокая ссылка на список покупок в приложении партнера. Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ | Ури |
Количество предметов | Необходимый | Количество товаров в списке покупок. | Целое число >= 1 |
Заголовок | Необязательный | Название списка (например, «Список покупок» ). Если разработчик не указал название, по умолчанию используется список покупок . | Произвольный текст Рекомендуемый размер текста: до 25 символов (слишком длинный текст может содержать многоточие). |
Ярлыки предметов | Необходимый | Список меток для товаров в списке покупок. Необходимо предоставить как минимум 1 ярлык, но можно указать до 10 ярлыков в порядке приоритета; фактическое количество отображаемых этикеток зависит от форм-фактора устройства. | Список меток произвольного текста Рекомендуемый размер текста: менее 20 символов (слишком длинный текст может содержать многоточие). |
ShoppingReorderCluster
Атрибут | Требование | Описание | Формат |
---|---|---|---|
Действие Ури | Необходимый | Глубокая ссылка для повторного заказа в приложении партнера. Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ | Ури |
Текст действия | Необязательный | Текст призыва к действию кнопки изменения порядка (например, «Заказать снова »). Если разработчик не предоставил текст действия, по умолчанию используется Reorder . Этот атрибут поддерживается начиная с версии 1.1.0. | Нить |
Количество предметов | Необходимый | Количество позиций (а не просто количество товаров) в предыдущем заказе. Например: если в предыдущем заказе было 3 маленьких порции кофе и 1 круассан, это число должно быть 4. | Целое число >= 1 |
Заголовок | Необходимый | Название элемента повторного заказа. | Произвольный текст Рекомендуемый размер текста: менее 40 символов (слишком длинный текст может содержать многоточие). |
Ярлыки предметов | Необязательный (Если не указано, необходимо предоставить изображения плакатов) | Список ярлыков товаров для предыдущего заказа. Можно предоставить до 10 меток в порядке приоритета; фактическое количество отображаемых этикеток зависит от форм-фактора устройства. | Список свободного текста Рекомендуемый размер текста на этикетке: менее 20 символов (слишком длинный текст может содержать многоточие). |
Изображения для плакатов | Необязательный (Если не указано, необходимо предоставить маркировку предметов) | Изображения товаров в предыдущем заказе. Можно предоставить до 10 изображений в порядке приоритета; фактическое количество отображаемых изображений зависит от форм-фактора устройства. | Дополнительные сведения см. в разделе «Спецификации изображения» . |
ShoppingOrderTrackingCluster
Атрибут | Требование | Описание | Формат |
---|---|---|---|
Заголовок | Необходимый | Краткое название отслеживаемой посылки/товаров или номер отслеживания. | Произвольный текст Рекомендуемый размер текста: 50 символов (слишком длинный текст будет отображаться в виде эллипсов). |
Тип заказа | Необходимый | Краткое название отслеживаемой посылки/товаров или номер отслеживания. | Перечисление: IN_STORE_PICKUP, SAME_DAY_DELIVERY, MULTI_DAY_DELIVERY |
Статус | Необходимый | Текущий статус заказа. Например: «Опоздание», «В пути», «Задержка», «Отправлено», «Доставлено», «Нет на складе», «Заказ готов». | Произвольный текст Рекомендуемый размер текста: 25 символов (слишком длинный текст будет отображаться в виде эллипсов). |
Время заказа | Необходимый | Временная метка эпохи в миллисекундах, когда был размещен заказ. Время заказа будет отображаться, если окно ожидаемого времени доставки отсутствует. | Временная метка эпохи в миллисекундах |
Действие Ури | Необходимый | Глубокая ссылка на отслеживание заказов в приложении партнера. | Ури |
OrderDeliveryTimeWindow (Необязательно) — установите временной интервал для заказа, который отслеживается с момента размещения заказа до времени ожидаемой/фактической доставки. | |||
OrderDeliveryTimeWindow — Время начала | Необязательный | Временная метка эпохи в миллисекундах, в которую или после которой заказ будет доставлен или готов к выдаче. | Временная метка эпохи в миллисекундах |
OrderDeliveryTimeWindow — время окончания | Необязательный | Временная метка эпохи в миллисекундах, в которую или до которой заказ будет доставлен или готов к выдаче. | Временная метка эпохи в миллисекундах |
Изображения для плакатов | Необязательный | Изображение одного товара/товара, входящего в заказ. Рекомендуемое соотношение сторон — 1:1. | Дополнительные сведения см. в разделе «Спецификации изображения» . |
Количество предметов | Необязательный | Количество позиций в заказе. | Целое число >= 1 |
Описание | Необязательный | Один абзац текста для описания элементов в заказе. Примечание. Пользователю будет отображаться либо описание, либо список субтитров, но не оба одновременно. | Произвольный текст Рекомендуемый размер текста: 180 символов. |
Список субтитров | Необязательный | До трех субтитров, каждый из которых представляет собой одну строку текста. Примечание. Пользователю будет отображаться либо описание, либо список субтитров, но не оба одновременно. | Произвольный текст Рекомендуемый размер текста для каждого субтитра: максимум 50 символов. |
Стоимость заказа — CurrentPrice | Необязательный | Текущая стоимость заказа. | Произвольный текст |
Номер заказа | Необязательный | Номер/идентификатор заказа, который можно использовать для уникальной идентификации заказа. | Произвольный текст Рекомендуемый размер текста: максимум 25 символов. |
Идентификационный номер | Необязательный | Номер отслеживания заказа/доставки посылки на случай, если заказ требует доставки. | Произвольный текст Рекомендуемый размер текста: максимум 25 символов. |
Характеристики изображения
Ниже перечислены необходимые характеристики для изображений.
Соотношение сторон | Минимум пикселей | Рекомендуемые пиксели |
---|---|---|
Квадрат (1x1) Предпочтительно для неосновных кластеров | 300х300 | 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 символов (слишком длинный текст может содержать многоточие). |
Субтитры | Необязательный | Подзаголовок кластера рекомендаций. |
Действие Ури | Необязательный | Глубокая ссылка на страницу партнерского приложения, где пользователи могут увидеть полный список рекомендаций. Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому 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
от партнера-разработчика удаляются. - Данные запроса анализируются и сохраняются в обновленном избранном кластере.
В случае ошибки весь запрос отклоняется и существующее состояние сохраняется.
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
от партнера-разработчика удаляются. - Данные запроса анализируются и сохраняются в обновленном кластере повторного заказа.
В случае ошибки весь запрос отклоняется и существующее состояние сохраняется.
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 используется для публикации карты входа. Действие входа направляет пользователей на страницу входа в приложение, чтобы приложение могло публиковать контент (или предоставлять более персонализированный контент).
Следующие метаданные являются частью карты входа:
Атрибут | Требование | Описание |
---|---|---|
Действие Ури | Необходимый | Глубокая ссылка на действие (т. е. переход на страницу входа в приложение) |
Изображение | Необязательно: если не указано, необходимо указать название. | Изображение на карте Изображения с соотношением сторон 16x9 и разрешением 1264x712. |
Заголовок | Необязательно: если не указано, необходимо предоставить изображение. | Титул на карте |
Текст действия | Необязательный | Текст, отображаемый в призыве к действию (т. е. войдите в систему) |
Субтитры | Необязательный | Дополнительный субтитр на карточке |
Котлин
var SIGN_IN_CARD_ENTITY = SignInCardEntity.Builder() .addPosterImage( Image.Builder() .setImageUri(Uri.parse("http://www.x.com/image.png")) .setImageHeightInPixel(500) .setImageWidthInPixel(500) .build()) .setActionText("Sign In") .setActionUri(Uri.parse("http://xx.com/signin")) .build() client.publishUserAccountManagementRequest( PublishUserAccountManagementRequest.Builder() .setSignInCardEntity(SIGN_IN_CARD_ENTITY) .build());
Ява
SignInCardEntity SIGN_IN_CARD_ENTITY = new SignInCardEntity.Builder() .addPosterImage( new Image.Builder() .setImageUri(Uri.parse("http://www.x.com/image.png")) .setImageHeightInPixel(500) .setImageWidthInPixel(500) .build()) .setActionText("Sign In") .setActionUri(Uri.parse("http://xx.com/signin")) .build(); client.publishUserAccountManagementRequest( new PublishUserAccountManagementRequest.Builder() .setSignInCardEntity(SIGN_IN_CARD_ENTITY) .build());
Когда сервис получает запрос, в рамках одной транзакции происходят следующие действия:
- Существующие данные
UserAccountManagementCluster
от партнера-разработчика удаляются. - Данные запроса анализируются и сохраняются в обновленном кластере UserAccountManagementCluster.
В случае ошибки весь запрос отклоняется и существующее состояние сохраняется.
updatePublishStatus
Если по каким-либо внутренним бизнес-причинам ни один из кластеров не опубликован, мы настоятельно рекомендуем обновить статус публикации с помощью API updatePublishStatus . Это важно, потому что:
- Предоставление статуса во всех сценариях, даже когда контент опубликован (СТАТУС == ПУБЛИКИРОВАНО), имеет решающее значение для заполнения панелей мониторинга, которые используют этот явный статус для передачи работоспособности и других показателей вашей интеграции.
- Если контент не опубликован, но статус интеграции не нарушен (STATUS == NOT_PUBLISHED), Google может избежать появления оповещений на панелях состояния приложения. Это подтверждает, что контент не публикуется по причине ожидаемой с точки зрения провайдера ситуации.
- Это помогает разработчикам получить представление о том, когда данные публикуются, а когда нет.
- Google может использовать коды состояния, чтобы подтолкнуть пользователя к выполнению определенных действий в приложении, чтобы он мог увидеть содержимое приложения или преодолеть его.
Список подходящих кодов статуса публикации:
// Content is published
AppEngagePublishStatusCode.PUBLISHED,
// Content is not published as user is not signed in
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN,
// Content is not published as user is not subscribed
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SUBSCRIPTION,
// Content is not published as user location is ineligible
AppEngagePublishStatusCode.NOT_PUBLISHED_INELIGIBLE_LOCATION,
// Content is not published as there is no eligible content
AppEngagePublishStatusCode.NOT_PUBLISHED_NO_ELIGIBLE_CONTENT,
// Content is not published as the feature is disabled by the client
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_FEATURE_DISABLED_BY_CLIENT,
// Content is not published as the feature due to a client error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_CLIENT_ERROR,
// Content is not published as the feature due to a service error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_SERVICE_ERROR,
// Content is not published due to some other reason
// Reach out to engage-developers@ before using this enum.
AppEngagePublishStatusCode.NOT_PUBLISHED_OTHER
Если контент не публикуется из-за того, что пользователь не вошел в систему, Google рекомендует опубликовать карту входа. Если по какой-либо причине поставщики не могут опубликовать карту входа, мы рекомендуем вызвать API updatePublishStatus с кодом состояния NOT_PUBLISHED_REQUIRES_SIGN_IN.
Котлин
client.updatePublishStatus( PublishStatusRequest.Builder() .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN) .build())
Ява
client.updatePublishStatus( new PublishStatusRequest.Builder() .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN) .build());
deleteRecommendationClusters
Этот API используется для удаления содержимого кластеров рекомендаций.
Котлин
client.deleteRecommendationClusters()
Ява
client.deleteRecommendationClusters();
Когда служба получает запрос, она удаляет существующие данные из кластеров рекомендаций. В случае ошибки весь запрос отклоняется и существующее состояние сохраняется.
deleteFeaturedCluster
Этот API используется для удаления содержимого избранного кластера.
Котлин
client.deleteFeaturedCluster()
Ява
client.deleteFeaturedCluster();
Когда служба получает запрос, она удаляет существующие данные из избранного кластера. В случае ошибки весь запрос отклоняется и существующее состояние сохраняется.
deleteShoppingCartCluster
Этот API используется для удаления содержимого кластера корзины покупок.
Котлин
client.deleteShoppingCartCluster()
Ява
client.deleteShoppingCartCluster();
Когда служба получает запрос, она удаляет существующие данные из кластера корзины покупок. В случае ошибки весь запрос отклоняется и существующее состояние сохраняется.
deleteShoppingListCluster
Этот API используется для удаления содержимого кластера списков покупок.
Котлин
client.deleteShoppingListCluster()
Ява
client.deleteShoppingListCluster();
Когда служба получает запрос, она удаляет существующие данные из кластера списков покупок. В случае ошибки весь запрос отклоняется и существующее состояние сохраняется.
deleteShoppingReorderCluster
Этот API используется для удаления содержимого кластера повторного заказа покупок.
Котлин
client.deleteShoppingReorderCluster()
Ява
client.deleteShoppingReorderCluster();
Когда служба получает запрос, она удаляет существующие данные из кластера повторного заказа покупок. В случае ошибки весь запрос отклоняется и существующее состояние сохраняется.
deleteShoppingOrderTrackingCluster
Этот API используется для удаления содержимого кластера отслеживания заказов покупок.
Котлин
client.deleteShoppingOrderTrackingCluster()
Ява
client.deleteShoppingOrderTrackingCluster();
Когда служба получает запрос, она удаляет существующие данные из кластера отслеживания заказов покупок. В случае ошибки весь запрос отклоняется и существующее состояние сохраняется.
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 определяет, что контент может быть устаревшим (например, недельной давности). Таким образом, появляется больше уверенности в том, что пользователь сможет получить новый контент, даже если приложение не запускалось в течение длительного периода времени.
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 SDK .
Контакт
Если в процессе интеграции возникнут вопросы, свяжитесь с нами по адресу Engage-developers@google.com . Наша команда отвечает как можно скорее.
Следующие шаги
После завершения интеграции ваши следующие шаги будут следующими:
- Отправьте электронное письмо на адрес Engage-developers@google.com и прикрепите интегрированный APK-файл, готовый к тестированию Google.
- Google выполняет внутреннюю проверку и проверку, чтобы убедиться, что интеграция работает должным образом. Если потребуются изменения, Google свяжется с вами и предоставит всю необходимую информацию.
- Когда тестирование будет завершено и никаких изменений не потребуется, Google свяжется с вами и уведомит вас о том, что вы можете начать публикацию обновленного и интегрированного APK в Play Store.
- После того как Google подтвердит, что обновленный APK-файл опубликован в Play Store, кластеры «Рекомендации» , «Избранное» , « Корзина покупок », «Список покупок» , «Кластер повторного заказа» и «Кластер отслеживания заказов покупок» могут быть опубликованы и видны пользователям.