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

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

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

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

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

Данная интеграция включает в себя следующие пять типов кластеров: Рекомендации , Рекомендуемые товары , Корзина покупок , Список покупок , Повторный заказ и Отслеживание заказов .

  • Кластеры рекомендаций отображают персонализированные предложения по покупкам от конкретного разработчика-партнера. Эти рекомендации могут быть персонализированы для пользователя или обобщены (например, популярные товары). Используйте их для отображения товаров, событий, распродаж, акций, подписок по своему усмотрению.

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

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

    • ShoppingEntity: Объект, представляющий отдельный элемент в кластере.

  • В разделе «Рекомендуемые» отображается подборка объектов от нескольких партнеров-разработчиков в одном интерфейсе. Будет создан единый раздел «Рекомендуемые», который будет отображаться в верхней части интерфейса с приоритетным размещением над всеми разделами «Рекомендуемые». Каждому партнеру-разработчику будет разрешено транслировать до 10 объектов в разделе «Рекомендуемые».

  • Кластер «Корзина покупок» отображает предварительный просмотр корзин покупок от множества партнеров-разработчиков в одном разделе пользовательского интерфейса, побуждая пользователей завершить оформление незавершенных заказов. Существует единый кластер «Корзина покупок», который отображается в верхней части пользовательского интерфейса и имеет приоритетное расположение над всеми кластерами рекомендаций. Каждому партнеру-разработчику разрешено транслировать до 3 экземпляров ShoppingCart в кластере «Корзина покупок».

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

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

    • ShoppingCart: Объект, представляющий собой предварительный просмотр корзины покупок для одного партнера-разработчика, который будет отображаться в кластере Shopping Cart. ShoppingCart должен отображать общее количество товаров в корзине и может также включать изображения для некоторых товаров в корзине пользователя.

  • В кластере «Список покупок» отображается предварительный просмотр списков покупок от нескольких партнеров-разработчиков в одном пользовательском интерфейсе, предлагая пользователям вернуться в соответствующее приложение для обновления и завершения своих списков. Существует один кластер «Список покупок».

  • В кластере «Повторный заказ» отображается предварительный просмотр предыдущих заказов от нескольких партнеров-разработчиков в одном пользовательском интерфейсе, предлагая пользователям повторно оформить заказ. Существует один кластер «Повторный заказ».

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

      • Изображения для 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.5.11'
}

Для получения дополнительной информации см. раздел «Видимость пакетов в Android 11» .

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

Данная архитектура основана на реализации привязанного сервиса .

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

Тип кластера Границы кластера Максимальное количество объектов в кластере.
Кластер(ы) рекомендаций Максимум 7 Максимум 50 ShoppingEntity
Выделенный кластер Не более 1 Максимум 20 ShoppingEntity
Кластер корзин покупок Не более 1 Не более 3 ShoppingCart

Наличие нескольких корзин ожидается только в приложениях, где для каждого продавца предусмотрена отдельная корзина.

Кластер списка покупок Не более 1 Не более 3 ShoppingList
Кластер повторных заказов покупок Не более 1 Не более 1 ReorderEntity
Кластер отслеживания заказов Максимум 3 Максимум 3 объекта ShoppingOrderTrackingEntity

Шаг 1: Предоставьте данные сущности.

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

  1. ShoppingEntity
  2. ShoppingCart
  3. ShoppingList
  4. Reorder
  5. ShoppingOrderTracking

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

ShoppingEntity

Объект ShoppingEntity представляет собой продукт, акцию, предложение, подписку или событие, которые партнеры-разработчики хотят опубликовать.

ShoppingEntity
Атрибут Требование Описание Формат
Изображения для плакатов Необходимый Необходимо предоставить как минимум одно изображение. См. раздел «Технические характеристики изображения» для получения дополнительной информации.
Action Uri Необходимый

Прямая ссылка на страницу в приложении, отображающую подробную информацию об объекте.

Примечание: Для указания источника можно использовать прямые ссылки. См. этот раздел часто задаваемых вопросов.

Ури
Заголовок Необязательный Название объекта.

Свободный текст

Рекомендуемый размер текста: менее 90 символов (слишком длинный текст может содержать многоточие).

Текущая цена Условно обязательно

Текущая цена объекта.

Необходимо указать, если указана перечеркнутая цена.

Свободный текст
Цена - зачеркнуто Необязательный Первоначальная цена объекта, которая будет зачеркнута в пользовательском интерфейсе. Свободный текст
Вызывать Необязательный При необходимости добавьте примечание для размещения рекламной акции, мероприятия или обновления, касающегося организации.

Свободный текст

Рекомендуемый размер текста: менее 45 символов (слишком длинный текст может содержать многоточие).

Мелкий шрифт в пояснительной записке Необязательный Текст, напечатанный мелким шрифтом для пояснения.

Свободный текст

Рекомендуемый размер текста: менее 45 символов (слишком длинный текст может содержать многоточие).

Оценка (необязательно) - Примечание: Все оценки отображаются с использованием нашей стандартной системы звездных оценок.
Рейтинг - Максимальное значение Необязательный

Максимальное значение шкалы оценок.

Этот параметр необходимо указать, если также предоставлено текущее значение рейтинга.

Число >= 0,0
Рейтинг - Текущая стоимость Необязательный

Текущее значение рейтинговой шкалы.

Этот параметр необходимо указать, если также указано максимальное значение рейтинга.

Число >= 0,0
Рейтинг - Количество Необязательный

Количество оценок для данной организации.

Примечание: Укажите это поле, если ваше приложение контролирует способ отображения количества для пользователей. Используйте краткую строку. Например, если количество равно 1 000 000, рассмотрите возможность использования сокращения, например, 1M, чтобы количество не обрезалось на экранах меньшего размера.

Нить
Рейтинг - Количество значений Необязательный

Количество оценок для данной организации.

Примечание: Укажите это поле, если вы не обрабатываете логику отображения сокращений самостоятельно. Если присутствуют поля «Количество» и «Значение количества», пользователям будет отображаться «Количество».

Длинный
DisplayTimeWindow (необязательно) — задайте временной интервал для отображения контента на поверхности.
Отметка времени начала Необязательный

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

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

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

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

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

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

ShoppingCart

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

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

Примечание: Для указания источника можно использовать прямые ссылки. См. этот раздел часто задаваемых вопросов.

Ури
Количество товаров Необходимый

Количество товаров (не просто число товаров) в корзине.

Например: если в корзине 3 одинаковые рубашки и 1 кепка, то это число должно быть равно 4.

Целое число >= 1
Текст действия Необязательный

Текст призыва к действию на кнопке в корзине покупок (например, «Ваша корзина »).

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

Этот атрибут поддерживается начиная с версии 1.1.0.

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

Название корзины (например, «Ваша корзина покупок »).

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

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

Свободный текст

Рекомендуемый размер текста: менее 25 символов (слишком длинный текст может содержать многоточие).

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

Изображения каждого товара в корзине.

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

См. раздел «Технические характеристики изображения» для получения дополнительной информации.
Этикетки товаров Необязательный

Список этикеток для товаров в списке покупок.

Фактическое количество отображаемых меток зависит от форм-фактора устройства.

Список свободных текстовых меток

Рекомендуемый размер текста: менее 20 символов (слишком длинный текст может содержать многоточие).

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

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

Временная метка эпохи в миллисекундах
DisplayTimeWindow (необязательно) — задайте временной интервал для отображения контента на поверхности.
Отметка времени начала Необязательный

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

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

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

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

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

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

ShoppingList

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

Прямая ссылка на список покупок в приложении партнера.

Примечание: Для указания источника можно использовать прямые ссылки. См. этот раздел часто задаваемых вопросов.

Ури
Количество товаров Необходимый Количество товаров в списке покупок. Целое число >= 1
Заголовок Необязательный

Заголовок списка (например, «Ваш список покупок »).

Если разработчик не указал название, по умолчанию используется «Список покупок» .

Свободный текст

Рекомендуемый размер текста: менее 25 символов (слишком длинный текст может содержать многоточие).

Этикетки товаров Необходимый

Список этикеток для товаров в списке покупок.

Необходимо предоставить как минимум одну этикетку, а максимальное количество этикеток может составлять 10 в порядке приоритета; фактическое количество отображаемых этикеток зависит от форм-фактора устройства.

Список свободных текстовых меток

Рекомендуемый размер текста: менее 20 символов (слишком длинный текст может содержать многоточие).

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

ShoppingReorderCluster

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

Прямая ссылка для повторного заказа в приложении партнера.

Примечание: Для указания источника можно использовать прямые ссылки. См. этот раздел часто задаваемых вопросов.

Ури
Текст действия Необязательный

Текст призыва к действию для кнопки «Повторный заказ» (например, «Заказать снова »).

Если разработчик не предоставил текст действия, по умолчанию используется параметр «Изменить порядок» .

Этот атрибут поддерживается начиная с версии 1.1.0.

Нить
Количество товаров Необходимый

Количество товаров (а не просто количество продуктов) в предыдущем заказе.

Например: если в предыдущем заказе было 3 маленьких кофе и 1 круассан, то это число должно быть равно 4.

Целое число >= 1
Заголовок Необходимый Название товара для повторного заказа.

Свободный текст

Рекомендуемый размер текста: менее 40 символов (слишком длинный текст может содержать многоточие).

Этикетки товаров

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

(Если изображения плаката не предоставлены, их следует предоставить)

Список наименований товаров из предыдущего заказа.

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

Список свободного текста

Рекомендуемый размер текста на метку: менее 20 символов (слишком длинный текст может отображаться многоточием).

Изображения для плакатов

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

(Если этикетки не указаны, их следует предоставить)

Изображения товаров из предыдущего заказа.

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

См. раздел «Технические характеристики изображения» для получения дополнительной информации.

ShoppingOrderTrackingCluster

Атрибут Требование Описание Формат
Заголовок Необходимый

Краткое название отслеживаемой посылки/товаров или номер отслеживания.

Свободный текст

Рекомендуемый размер текста: 50 символов (слишком длинный текст будет отображаться многоточием).

Тип заказа Необходимый

Краткое название отслеживаемой посылки/товаров или номер отслеживания.

Перечисление: САМОВЫВОЗ ИЗ МАГАЗИНА, ДОСТАВКА В ТОТ ЖЕ ДЕНЬ, ДОСТАВКА В ТЕЧЕНИЕ НЕСКОЛЬКИХ ДНЕЙ

Статус Необходимый

Текущий статус заказа.

Например: "Опоздание", "В пути", "Задержка", "Отправлено", "Доставлено", "Нет в наличии", "Заказ готов"

Свободный текст

Рекомендуемый размер текста: 25 символов (слишком длинный текст будет отображаться многоточием).

Время заказа Необходимый

Временная метка в миллисекундах, в которую был размещен заказ.

Если ожидаемое время доставки не указано, будет отображено время оформления заказа.

Временная метка эпохи в миллисекундах
Action Uri Необходимый

Прямая ссылка на отслеживание заказа в приложении партнера.

Ури
OrderDeliveryTimeWindow (необязательно) — установите временной интервал для отслеживания заказа с момента его размещения до времени ожидаемой/фактической доставки.
Время начала доставки заказа (OrderDeliveryTimeWindow) Необязательный

Временная метка в миллисекундах, с которой заказ будет доставлен или готов к выдаче.

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

Временная метка в миллисекундах, с которой заказ будет доставлен или готов к выдаче (дата начала отсчета).

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

Изображение одного товара/продукта, входящего в заказ.

Рекомендуемое соотношение сторон — 1:1.

См. раздел «Технические характеристики изображения» для получения дополнительной информации.
Количество товаров Необязательный Количество товаров в заказе. Целое число >= 1
Описание Необязательный

Один абзац текста, описывающий товары в заказе.

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

Свободный текст

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

список субтитров Необязательный

До 3 субтитров, каждый из которых представляет собой отдельную строку текста.

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

Свободный текст

Рекомендуемый размер текста для каждого субтитра: максимум 50 символов.

Стоимость заказа - Текущая цена Необязательный Текущая стоимость заказа. Свободный текст
Номер заказа Необязательный Номер/идентификатор заказа, который позволяет однозначно идентифицировать заказ.

Свободный текст

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

Идентификационный номер Необязательный Номер для отслеживания заказа/посылки в случае, если заказ требует доставки.

Свободный текст

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

Технические характеристики изображения

Ниже перечислены необходимые спецификации для графических ресурсов:

Соотношение сторон Минимальное количество пикселей Рекомендуемые пиксели

Квадрат (1х1)

Предпочтительно для кластеров, не являющихся основными.

300x300 1200x1200

Пейзаж (1,91х1)

Предпочтительно для целевых кластеров

600x314 1200x628
Портрет (4x5) 480x600 960x1200

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

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

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

5120 КБ

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

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

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

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

AppEngageShoppingClient отвечает за публикацию кластеров товаров.

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

  • isServiceAvailable
  • publishRecommendationClusters
  • publishFeaturedCluster
  • publishShoppingCarts
  • publishShoppingLists
  • 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.
    }
}

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 символов (слишком длинный текст может содержать многоточие).

Субтитры Необязательный Подзаголовок для кластера рекомендаций.
Action Uri Необязательный

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

Примечание: Для указания источника можно использовать прямые ссылки. См. этот раздел часто задаваемых вопросов.

Котлин

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 .

Котлин

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 указывайте название продавца в заголовке.

Котлин

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 .

Котлин

client.publishShoppingLists(
            PublishShoppingListsRequest.Builder()
                .addShoppingList(
                    ShoppingList.Builder()
                        ...
                        .build())
                .build())

Java

client.publishShoppingLists(
            new PublishShoppingListsRequest.Builder()
                .addShoppingList(
                    new ShoppingListEntity.Builder()
                        ...
                        .build())
                .build());

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

  • Существующие данные ShoppingList от партнера-разработчика удаляются.
  • Данные из запроса анализируются и сохраняются в обновленном кластере списков покупок.

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

publishShoppingReorderCluster

Этот API используется для публикации объекта ShoppingReorderCluster .

Котлин

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 .

Котлин

client.publishShoppingOrderTrackingCluster(
            PublishShoppingOrderTrackingClusterRequest.Builder()
                .setShoppingOrderTrackingCluster(
                    ShoppingOrderTrackingCluster.Builder()
                        ...
                        .build())
                .build())

Java

client.publishShoppingOrderTrackingCluster(
            new PublishShoppingOrderTrackingClusterRequest.Builder()
                .setShoppingOrderTrackingCluster(
                    new ShoppingOrderTrackingCluster.Builder()
                        ...
                        .build())
                .build());

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

  • Существующие данные ShoppingOrderTrackingCluster от партнера-разработчика удаляются.
  • Данные из запроса анализируются и сохраняются в обновленном кластере отслеживания заказов.

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

publishUserAccountManagementRequest

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

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

Атрибут Требование Описание
Action 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());

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.

Котлин

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

deleteRecommendationClusters

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

Котлин

client.deleteRecommendationClusters()

Java

client.deleteRecommendationClusters();

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

deleteFeaturedCluster

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

Котлин

client.deleteFeaturedCluster()

Java

client.deleteFeaturedCluster();

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

deleteShoppingCartCluster

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

Котлин

client.deleteShoppingCartCluster()

Java

client.deleteShoppingCartCluster();

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

deleteShoppingListCluster

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

Котлин

client.deleteShoppingListCluster()

Java

client.deleteShoppingListCluster();

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

deleteShoppingReorderCluster

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

Котлин

client.deleteShoppingReorderCluster()

Java

client.deleteShoppingReorderCluster();

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

deleteShoppingOrderTrackingCluster

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

Котлин

client.deleteShoppingOrderTrackingCluster()

Java

client.deleteShoppingOrderTrackingCluster();

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

deleteUserManagementCluster

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

Котлин

client.deleteUserManagementCluster()

Java

client.deleteUserManagementCluster();

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

deleteClusters

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

Котлин

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

Котлин

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 для приема запросов на публикацию контента.

Основная цель широковещательных интентов — повторная активация приложения и принудительная синхронизация данных. Широковещательные интенты не предназначены для частой отправки. Они срабатывают только тогда, когда служба 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),
                           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);

}
  • В файле AndroidManifest.xml статически объявите реализацию с помощью тега <receiver> . Это позволит приложению получать широковещательные интенты, когда оно не запущено, а также позволит приложению публиковать контент.

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

Часто задаваемые вопросы

Часто задаваемые вопросы по Engage SDK можно найти в разделе "Часто задаваемые вопросы".

Контакт

Если у вас возникнут вопросы в процессе интеграции, обращайтесь по адресу engage-developers@google.com . Наша команда ответит вам в кратчайшие сроки.

Следующие шаги

После завершения интеграции ваши дальнейшие действия будут следующими:

  • Отправьте электронное письмо на адрес engage-developers@google.com и прикрепите к нему свой интегрированный APK-файл, готовый к тестированию компанией Google.
  • Google проводит внутреннюю проверку и анализ, чтобы убедиться, что интеграция работает должным образом. Если потребуются изменения, Google свяжется с вами и предоставит всю необходимую информацию.
  • После завершения тестирования и если никаких изменений не потребуется, Google свяжется с вами, чтобы уведомить о возможности публикации обновленного и интегрированного APK-файла в Play Store.
  • После того, как Google подтвердит публикацию вашего обновленного APK-файла в Play Store, ваши разделы «Рекомендации» , «Рекомендуемые» , «Корзина покупок» , «Список покупок» , «Кластер повторного заказа» и «Кластер отслеживания заказов» могут быть опубликованы и видны пользователям.