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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Кластер ShoppingOrderTracking отображается в верхней части пользовательского интерфейса и имеет приоритет над всеми кластерами рекомендаций. Каждый партнёр-разработчик может транслировать несколько элементов ShoppingOrderTrackingEntity в кластере отслеживания заказов покупок.

    • Ваш ShoppingOrderTrackingCluster имеет следующую структуру:

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

Предварительная работа

Минимальный уровень API: 19

Добавьте библиотеку com.google.android.engage:engage-core в свое приложение:

dependencies {
    // Make sure you also include that repository in your project's build.gradle file.
    implementation 'com.google.android.engage:engage-core:1.5.2'
}

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

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

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

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

Тип кластера Пределы кластера Максимальные пределы сущностей в кластере
Кластер(ы) рекомендаций Максимум 7 Максимум 50 ShoppingEntity
Избранный кластер Максимум 1 Максимум 20 ShoppingEntity
Кластер корзины покупок Максимум 1 Максимум 3 ShoppingCart

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

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

Шаг 1: Предоставьте данные об организации

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

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

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

ShoppingEntity

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

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

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

Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы».

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

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

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

Цена - текущая Условно требуется

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

Обязательно должно быть указано, если указана зачеркнутая цена.

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

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

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

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

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

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

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

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

Обязательно, если указано текущее значение рейтинга.

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

Текущее значение шкалы оценки.

Обязательно должно быть указано, если также указано максимальное значение рейтинга.

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

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

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

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

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

Примечание: укажите это поле, если вы не управляете логикой отображения сокращений самостоятельно. Если указаны и Count, и Count Value, пользователям будет показано Count.

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

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

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

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

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

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

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

ShoppingCart

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

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

Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы».

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ShoppingList

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

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

Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы».

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

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

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

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

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

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

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

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

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

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

ShoppingReorderCluster

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

Глубокая ссылка для повторного заказа в приложении партнера.

Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы».

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

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

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

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

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

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

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

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

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

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

Этикетки предметов

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

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

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

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

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

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

Изображения постеров

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

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

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

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

Инструкции см. в разделе «Характеристики изображения» .

ShoppingOrderTrackingCluster

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

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

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

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

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

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

Перечисление: самовывоз из магазина, доставка в тот же день, многодневная доставка

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

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

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

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

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

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

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

Время заказа будет отображаться, если ожидаемое время доставки отсутствует.

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

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

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

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

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

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

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

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

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

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

Один абзац текста с описанием позиций в заказе.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Характеристики изображения

Требуемые характеристики изображений перечислены ниже:

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

Квадрат (1x1)

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

300x300 1200x1200

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

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

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

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

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

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

5120 КБ

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

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

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

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

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

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

  • isServiceAvailable
  • publishRecommendationClusters
  • publishFeaturedCluster
  • publishShoppingCart
  • publishShoppingCarts
  • publishShoppingList
  • publishShoppingReorderCluster
  • publishShoppingOrderTrackingCluster
  • publishUserAccountManagementRequest
  • updatePublishStatus
  • deleteRecommendationsClusters
  • deleteFeaturedCluster
  • deleteShoppingCartCluster
  • deleteShoppingListCluster
  • deleteShoppingReorderCluster
  • deleteShoppingOrderTrackingCluster
  • deleteUserManagementCluster
  • deleteClusters

isServiceAvailable

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

Котлин

client.isServiceAvailable.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        // Handle IPC call success
        if(task.result) {
          // Service is available on the device, proceed with content publish
          // calls.
        } else {
          // Service is not available, no further action is needed.
        }
    } else {
      // The IPC call itself fails, proceed with error handling logic here,
      // such as retry.
    }
}

Ява

client.isServiceAvailable().addOnCompleteListener(task - > {
    if (task.isSuccessful()) {
        // Handle success
        if(task.getResult()) {
          // Service is available on the device, proceed with content
          // publish calls.
        } else {
          // Service is not available, no further action is needed.
        }
    } else {
      // The IPC call itself fails, proceed with error handling logic here,
      // such as retry.
    }
});

publishRecommendationClusters

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

Объект RecommendationCluster может иметь следующие атрибуты:

Атрибут Требование Описание
Список торговых объектов Необходимый Список объектов ShoppingEntity, которые составляют рекомендации для этого кластера рекомендаций.
Заголовок Необходимый

Название кластера рекомендаций.

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

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

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

Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы».

Котлин

client.publishRecommendationClusters(
            PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Black Friday Deals")
                        .build())
                .build())

Ява

client.publishRecommendationClusters(
            new PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    new RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Black Friday Deals")
                        .build())
                .build());

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

  • Все существующие данные кластера рекомендаций удаляются.
  • Данные из запроса анализируются и сохраняются в новых кластерах рекомендаций.

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

publishFeaturedCluster

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

Котлин

client.publishFeaturedCluster(
            PublishFeaturedClusterRequest.Builder()
                .setFeaturedCluster(
                    FeaturedCluster.Builder()
                        ...
                        .build())
                .build())

Ява

client.publishFeaturedCluster(
            new PublishFeaturedClusterRequest.Builder()
                .setFeaturedCluster(
                    new FeaturedCluster.Builder()
                        ...
                        .build())
                .build());

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

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

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

publishShoppingCart

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

Котлин

client.publishShoppingCart(
            PublishShoppingCartRequest.Builder()
                .setShoppingCart(
                    ShoppingCart.Builder()
                        ...
                        .build())
                .build())

Ява

client.publishShoppingCart(
            new PublishShoppingCartRequest.Builder()
                .setShoppingCart(
                    new ShoppingCart.Builder()
                        ...
                        .build())
                .build())

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

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

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

publishShoppingCarts

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

Котлин

client.publishShoppingCarts(
            PublishShoppingCartClustersRequest.Builder()
                .addShoppingCart(
                    ShoppingCart.Builder()
                        ...
                        .build())
                .build())

Ява

client.publishShoppingCarts(
            new PublishShoppingCartClustersRequest.Builder()
                .addShoppingCart(
                    new ShoppingCart.Builder()
                        ...
                        .build())
                .build())

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

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

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

publishShoppingList

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

Котлин

client.publishFoodShoppingList(
            PublishFoodShoppingListRequest.Builder()
                .setFoodShoppingList(
                    FoodShoppingListEntity.Builder()
                        ...
                        .build())
                .build())

Ява

client.publishFoodShoppingList(
            new PublishFoodShoppingListRequest.Builder()
                .setFoodShoppingList(
                    new FoodShoppingListEntity.Builder()
                        ...
                        .build())
                .build());

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

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

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

publishShoppingReorderCluster

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

Котлин

client.publishShoppingReorderCluster(
            PublishShoppingReorderClusterRequest.Builder()
                .setReorderCluster(
                    ShoppingReorderCluster.Builder()
                        ...
                        .build())
                .build())

Ява

client.publishShoppingReorderCluster(
            new PublishShoppingReorderClusterRequest.Builder()
                .setReorderCluster(
                    new ShoppingReorderCluster.Builder()
                        ...
                        .build())
                .build());

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

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

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

publishShoppingOrderTrackingCluster

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

Котлин

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

Ява

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

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

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

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

publishUserAccountManagementRequest

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

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

Атрибут Требование Описание
Действие Uri Необходимый Глубокая ссылка на действие (т. е. переход на страницу входа в приложение)
Изображение Необязательно. Если не указано, необходимо указать название.

Изображение, показанное на карте

Изображения с соотношением сторон 16x9 и разрешением 1264x712

Заголовок Необязательно. Если изображение не указано, его необходимо предоставить. Название карты
Текст действия Необязательный Текст, отображаемый в призыве к действию (например, «Войти»)
Подзаголовок Необязательный Дополнительный подзаголовок на карточке

Котлин

var SIGN_IN_CARD_ENTITY =
      SignInCardEntity.Builder()
          .addPosterImage(
              Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build()

client.publishUserAccountManagementRequest(
            PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

Ява

SignInCardEntity SIGN_IN_CARD_ENTITY =
      new SignInCardEntity.Builder()
          .addPosterImage(
              new Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build();

client.publishUserAccountManagementRequest(
            new PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

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

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

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

updatePublishStatus

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

  • Предоставление статуса во всех сценариях, даже если контент опубликован (СТАТУС == ОПУБЛИКОВАН), имеет решающее значение для заполнения панелей мониторинга, которые используют этот явный статус для отображения работоспособности и других показателей вашей интеграции.
  • Если контент не опубликован, но статус интеграции не нарушен (STATUS == NOT_PUBLISHED), Google может не выдавать оповещения на панелях мониторинга состояния приложения. Это подтверждает, что контент не опубликован из-за ожидаемой с точки зрения поставщика ситуации.
  • Это помогает разработчикам получать представление о том, когда данные публикуются, а когда нет.
  • Google может использовать коды статуса, чтобы подтолкнуть пользователя к выполнению определенных действий в приложении, чтобы он мог просмотреть содержимое приложения или преодолеть его.

Список допустимых кодов статуса публикации:

// Content is published
AppEngagePublishStatusCode.PUBLISHED,

// Content is not published as user is not signed in
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN,

// Content is not published as user is not subscribed
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SUBSCRIPTION,

// Content is not published as user location is ineligible
AppEngagePublishStatusCode.NOT_PUBLISHED_INELIGIBLE_LOCATION,

// Content is not published as there is no eligible content
AppEngagePublishStatusCode.NOT_PUBLISHED_NO_ELIGIBLE_CONTENT,

// Content is not published as the feature is disabled by the client
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_FEATURE_DISABLED_BY_CLIENT,

// Content is not published as the feature due to a client error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_CLIENT_ERROR,

// Content is not published as the feature due to a service error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_SERVICE_ERROR,

// Content is not published due to some other reason
// Reach out to engage-developers@ before using this enum.
AppEngagePublishStatusCode.NOT_PUBLISHED_OTHER

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

Котлин

client.deleteFeaturedCluster()

Ява

client.deleteFeaturedCluster();

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

deleteShoppingCartCluster

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

Котлин

client.deleteShoppingCartCluster()

Ява

client.deleteShoppingCartCluster();

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

deleteShoppingListCluster

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

Котлин

client.deleteShoppingListCluster()

Ява

client.deleteShoppingListCluster();

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

deleteShoppingReorderCluster

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

Котлин

client.deleteShoppingReorderCluster()

Ява

client.deleteShoppingReorderCluster();

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

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),
                           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)
}

Ява

class AppEngageBroadcastReceiver extends BroadcastReceiver {
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
// is received

// Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received

// Trigger shopping cart cluster publish when PUBLISH_SHOPPING_CART broadcast is
// received

// Trigger shopping list cluster publish when PUBLISH_SHOPPING_LIST broadcast is
// received

// Trigger reorder cluster publish when PUBLISH_REORDER_CLUSTER broadcast is
// received

// Trigger reorder cluster publish when PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER
// broadcast is received
}

public static void registerBroadcastReceivers(Context context) {

context = context.getApplicationContext();

// Register Recommendation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_RECOMMENDATION),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

// Register Featured Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

// Register Shopping Cart Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_SHOPPING_CART),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

// Register Shopping List Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_SHOPPING_LIST),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

// Register Reorder Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_REORDER_CLUSTER),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

// Register Shopping Order Tracking Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

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

<application>
   <receiver
      android:name=".AppEngageBroadcastReceiver"
      android:permission="com.google.android.engage.REQUEST_ENGAGE_DATA"
      android:exported="true"
      android:enabled="true">
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_RECOMMENDATION" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_FEATURED" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.shopping.PUBLISH_SHOPPING_CART" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.shopping.PUBLISH_SHOPPING_LIST" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.shopping.PUBLISH_REORDER_CLUSTER" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.shopping.PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER" />
      </intent-filter>
   </receiver>
</application>

Служба отправляет следующие намерения :

  • com.google.android.engage.action.PUBLISH_RECOMMENDATION Рекомендуется начать вызов publishRecommendationClusters при получении этого намерения.
  • com.google.android.engage.action.PUBLISH_FEATURED Рекомендуется начать вызов publishFeaturedCluster при получении этого намерения.
  • com.google.android.engage.action.shopping.PUBLISH_SHOPPING_CART Рекомендуется начать вызов 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, ваши кластеры «Рекомендации» , «Избранное» , «Корзина покупок» , «Список покупок» , «Кластер повторного заказа» и «Кластер отслеживания заказов покупок» могут быть опубликованы и видны пользователям.