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

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

В этом руководстве рассказывается, как партнеры-разработчики могут передавать контент для покупок на платформы Engage.

Поддерживаемые категории и платформы

Доступность платформ Engage SDK зависит от категории контента в приложении. В таблице ниже указано, какие требования нужно выполнить, чтобы ваши товары показывались на разных платформах.

Статус Категория контента или сценарий использования Поддерживаемые платформы
Поддерживается
(Доступно на всех платформах)
  • Покупка одежды
  • Интернет-магазины
  • Розничный магазин
  • Покупка продуктов и напитков
  • Скидки и купоны
  • Товары для животных
  • Жилье и дом / Недвижимость
  • Подборки
  • Вкладка "Приложения" в Google Play
  • Вкладка "Вы" в Google Play
  • Страница приложения в Google Play
Чего пользователь не может
  • Приложение Shopper
  • B2B-продажи
  • Приложение продавца
  • Бонусы за сканирование чеков
  • Телефонная связь
  • Покупка в рассрочку

Сведения об интеграции

В этом разделе описаны шаги, модели данных и терминология, необходимые для интеграции с Engage SDK для торгового контента.

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

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

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

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

    • Кластер рекомендаций. Раздел интерфейса, в котором собраны рекомендации от одного партнера-разработчика.

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

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

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

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

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

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

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

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

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

      • Изображения X товаров из предыдущего заказа пользователя.
      • Ярлыки для X товаров в предыдущем заказе пользователя.
  • Кластер Отслеживание заказов позволяет пользователям следить за статусом ожидающих или недавно выполненных заказов от разных партнеров-разработчиков.

    Кластер ShoppingOrderTracking находится в верхней части интерфейса, выше всех кластеров рекомендаций. Каждый партнер-разработчик может передавать несколько объектов ShoppingOrderTrackingEntity в кластере Shopping Order Tracking.

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

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

Подготовка

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

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

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

Подробнее о видимости пакетов в Android 11…

Сводка

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

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

Тип кластера Ограничения кластера Максимальное количество объектов в кластере
Кластеры рекомендаций Не более 7 Не более 50 ShoppingEntity
Рекомендуемый кластер Не более 1 Не более 20 ShoppingEntity
Кластер корзины покупок Не более 1 Не более 3 ShoppingCart

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

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

Шаг 1. Укажите данные о компании

В SDK определены разные объекты, представляющие каждый тип товара. Для категории "Покупки" поддерживаются следующие объекты:

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

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

ShoppingEntity

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

ShoppingEntity
Атрибут Требования Описание Формат
Постеры Обязательно Добавьте хотя бы одно изображение. Ознакомьтесь со спецификациями изображений.
URI действия Обязательно

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

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

URI
Название Необязательно Название объекта.

Произвольный текст

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

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

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

Обязателен, если указана зачеркнутая цена.

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

Произвольный текст

Рекомендуемая длина текста: до 45 символов. Если текст слишком длинный, он может быть сокращен.

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

Произвольный текст

Рекомендуемая длина текста: до 45 символов. Если текст слишком длинный, он может быть сокращен.

Оценка (необязательно). Примечание. Все оценки показываются в виде звездочек.
Оценка – максимальное значение Необязательно

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

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

Число >= 0,0
Оценка – текущее значение Необязательно

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

Обязательно, если указано максимальное значение оценки.

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

Количество оценок объекта.

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

Строка
Рейтинг – количество оценок Необязательно

Количество оценок объекта.

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

Долгота
DisplayTimeWindow (необязательно) – задает временной интервал, в течение которого контент будет показываться на платформе.
Временная метка начала Необязательно

Временная метка, после которой контент должен показываться на платформе.

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

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

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

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

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

ShoppingCart

Атрибут Требования Описание Формат
URI действия Обязательно

Ссылка на контент в приложении партнера, которая ведет к корзине.

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

URI
Количество элементов Обязательно

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

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

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

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

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

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

Строка
Название Необязательно

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

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

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

Произвольный текст

Рекомендуемая длина текста: не более 25 символов. Если текст слишком длинный, он может быть сокращен.

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

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

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

Ознакомьтесь со спецификациями изображений.
Ярлыки объектов Необязательно

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

Фактическое количество ярлыков зависит от типа устройства.

Список ярлыков в виде текста

Рекомендуемая длина текста: не более 20 символов. Если текст слишком длинный, он может быть сокращен.

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

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

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

Временная метка, после которой контент должен показываться на платформе.

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

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

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

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

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

ShoppingList

Атрибут Требования Описание Формат
URI действия Обязательно

Ссылка на контент в приложении партнера, которая ведет к списку покупок.

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

URI
Количество элементов Обязательно Количество товаров в списке покупок. Целое число >= 1
Название Необязательно

Название списка, например Список покупок.

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

Произвольный текст

Рекомендуемая длина текста: не более 25 символов. Если текст слишком длинный, он может быть сокращен.

Ярлыки объектов Обязательно

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

Необходимо указать хотя бы один ярлык. Максимальное количество ярлыков – 10. Они должны быть перечислены в порядке приоритета. Количество ярлыков, которые будут показаны, зависит от типа устройства.

Список ярлыков в виде текста

Рекомендуемая длина текста: не более 20 символов. Если текст слишком длинный, он может быть сокращен.

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

ShoppingReorderCluster

Атрибут Требования Описание Формат
URI действия Обязательно

Ссылка на контент в приложении партнера, по которой можно повторить заказ.

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

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

Текст призыва к действию на кнопке повторного заказа, например Заказать снова.

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

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

Строка
Количество элементов Обязательно

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

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

Целое число >= 1
Название Обязательно Название товара, который вы хотите заказать повторно.

Произвольный текст

Рекомендуемая длина текста: не более 40 символов. Если текст слишком длинный, он может быть сокращен.

Ярлыки объектов

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

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

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

Можно указать до 10 ярлыков в порядке приоритета. Фактическое количество ярлыков зависит от типа устройства.

Список произвольного текста

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

Постеры

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

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

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

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

Ознакомьтесь со спецификациями изображений.

ShoppingOrderTrackingCluster

Атрибут Требования Описание Формат
Название Обязательно

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

Произвольный текст

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

Тип заказа Обязательно

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

Enum: IN_STORE_PICKUP, SAME_DAY_DELIVERY, MULTI_DAY_DELIVERY

Статус Обязательно

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

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

Произвольный текст

Рекомендуемая длина текста: 25 символов. Если текст слишком длинный, он будет сокращен и в конце появится многоточие.

Время заказа Обязательно

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

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

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

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

URI
OrderDeliveryTimeWindow (необязательно) – временной интервал для отслеживаемого заказа, от момента его размещения до ожидаемого или фактического времени доставки.
OrderDeliveryTimeWindow - Start Time Необязательно

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

Временная метка в миллисекундах с начала отсчета
OrderDeliveryTimeWindow - End Time Необязательно

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

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

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

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

Ознакомьтесь со спецификациями изображений.
Количество элементов Необязательно Количество товаров в заказе. Целое число >= 1
Описание Необязательно

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

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

Произвольный текст

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

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

До трех подзаголовков, каждый из которых состоит из одной строки текста.

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

Произвольный текст

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

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

Произвольный текст

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

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

Произвольный текст

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

Требования к картинкам

В таблице ниже приведены требования к объектам изображений.

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

Квадрат (1:1).

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

300x300 1200x1200

Горизонтальное (1,91:1)

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

600x314 1200x628
Вертикальное (4:5) 480x600 960x1200

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

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

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

5120 КБ

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

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

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

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

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

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

  • isServiceAvailable
  • publishRecommendationClusters
  • publishFeaturedCluster
  • publishShoppingCarts
  • publishShoppingLists
  • publishShoppingReorderCluster
  • publishShoppingOrderTrackingCluster
  • publishUserAccountManagementRequest
  • updatePublishStatus
  • deleteRecommendationsClusters
  • deleteFeaturedCluster
  • deleteShoppingCartCluster
  • deleteShoppingListCluster
  • deleteReorderCluster
  • deleteShoppingOrderTrackingCluster
  • deleteUserManagementCluster
  • deleteClusters

isServiceAvailable

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

Вы можете проверить доступность сервиса для каждого типа кластера, который вы собираетесь опубликовать. API isServiceAvailable принимает объект запроса ServiceAvailabilityRequest, который содержит типы кластеров, для которых необходимо проверить доступность сервиса. В таблице ниже приведены значения перечисления ClusterType, необходимые для ServiceAvailabilityRequest.

Тип кластера Константа типа кластера Целочисленное значение
Неизвестно TYPE_UNKNOWN 0
Кластер рекомендаций TYPE_RECOMMENDATION 1
Рекомендуемый кластер TYPE_FEATURED 2
Кластер продолжения TYPE_CONTINUATION 3
Кластер корзины покупок TYPE_SHOPPING_CART 4
Кластер управления пользователями TYPE_ENGAGEMENT 8
Кластер списка покупок TYPE_SHOPPING_LIST 9
Кластер повторного заказа в Покупках TYPE_SHOPPING_REORDER 10
Кластер отслеживания заказов в Покупках TYPE_SHOPPING_ORDER_TRACKING 11
Кластер подписок TYPE_SUBSCRIPTION 12

Kotlin

val request = ServiceAvailabilityRequest.Builder()
    .addIntendedClusterType(ClusterType.TYPE_CONTINUATION)
    .addIntendedClusterType(ClusterType.TYPE_RECOMMENDATION)
    .build()

client.isServiceAvailable(request).addOnCompleteListener { task ->
    if (task.isSuccessful) {
        val availabilityMap = task.result
        if (availabilityMap[ClusterType.TYPE_CONTINUATION] == true) {
            // Proceed with publishing continuation content
        }
        if (availabilityMap[ClusterType.TYPE_RECOMMENDATION] == true) {
            // Proceed with publishing recommendation content
        }
    } else {
        // The IPC call itself fails, proceed with error handling logic here,
        // such as retry.
    }
}

Java

ServiceAvailabilityRequest request =
    new ServiceAvailabilityRequest.Builder()
        .addIntendedClusterType(ClusterType.TYPE_CONTINUATION)
        .addIntendedClusterType(ClusterType.TYPE_RECOMMENDATION)
        .build();

client.isServiceAvailable(request).addOnCompleteListener(task -> {
    if (task.isSuccessful()) {
        Map<Integer, Boolean> availabilityMap = task.getResult();
        if (Boolean.TRUE.equals(availabilityMap.get(ClusterType.TYPE_CONTINUATION))) {
            // Proceed with publishing continuation content
        }
        if (Boolean.TRUE.equals(availabilityMap.get(ClusterType.TYPE_RECOMMENDATION))) {
            // Proceed with publishing recommendation content
        }
    } else {
        // The IPC call itself fails, proceed with error handling logic here,
        // such as retry.
    }
});
Функция условной доступности сервиса

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

Начиная с версии 1.6.0 Engage SDK позволяет проверять доступность определенных типов кластеров. Если ваше приложение использует прерывистую передачу данных:

  • Кластеры продолжения (например, "Корзина", "Список покупок", "Повторный заказ" и "Отслеживание заказа") по умолчанию включены на всех поддерживаемых устройствах.
  • Другие типы кластеров (например, рекомендации) включаются и отключаются периодически.

Если эта конфигурация по умолчанию вам не подходит, напишите на адрес engage-developers@google.com.

Для версий SDK до 1.6.0 (поддержка прекращена)

Kotlin

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

Java

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

publishRecommendationClusters

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

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

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

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

Рекомендуемая длина текста: до 25 символов. Если текст слишком длинный, он может быть сокращен.

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

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

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

Kotlin

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

Java

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

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

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

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

publishFeaturedCluster

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

Kotlin

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

Java

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

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

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

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

publishShoppingCarts

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

Kotlin

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

Java

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

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

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

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

publishShoppingLists

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

Kotlin

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

Java

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

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

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

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

publishShoppingReorderCluster

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

Kotlin

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

Java

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

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

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

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

publishShoppingOrderTrackingCluster

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

Kotlin

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

Java

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

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

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

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

publishUserAccountManagementRequest

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

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

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

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

Изображения с соотношением сторон 16:9 и разрешением 1264 x 712.

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

Kotlin

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

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

Java

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

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

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

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

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

updatePublishStatus

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

  • Указывать статус нужно во всех случаях, даже когда контент опубликован (STATUS == PUBLISHED). Это необходимо для заполнения панелей управления, на которых статус используется для передачи данных о работоспособности и других показателей интеграции.
  • Если контент не опубликован, но статус интеграции не нарушен (STATUS == NOT_PUBLISHED), Google может не запускать оповещения на панелях мониторинга работоспособности приложения. Она подтверждает, что контент не опубликован по ожидаемой причине, известной поставщику.
  • Это помогает разработчикам понять, когда данные публикуются, а когда нет.
  • Google может использовать коды статуса, чтобы подсказать пользователю, как получить доступ к контенту приложения.

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

// Content is published
AppEngagePublishStatusCode.PUBLISHED,

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

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

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

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

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

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

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

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

Если контент не публикуется из-за того, что пользователь не вошел в аккаунт, Google рекомендует опубликовать карточку входа. Если по какой-либо причине поставщики не могут опубликовать карточку входа, мы рекомендуем вызвать API updatePublishStatus с кодом статуса NOT_PUBLISHED_REQUIRES_SIGN_IN.

Kotlin

client.updatePublishStatus(
   PublishStatusRequest.Builder()
     .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
     .build())

Java

client.updatePublishStatus(
    new PublishStatusRequest.Builder()
        .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
        .build());

deleteRecommendationsClusters

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

Kotlin

client.deleteRecommendationsClusters()

Java

client.deleteRecommendationsClusters();

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

deleteFeaturedCluster

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

Kotlin

client.deleteFeaturedCluster()

Java

client.deleteFeaturedCluster();

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

deleteShoppingCartCluster

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

Kotlin

client.deleteShoppingCartCluster()

Java

client.deleteShoppingCartCluster();

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

deleteShoppingListCluster

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

Kotlin

client.deleteShoppingListCluster()

Java

client.deleteShoppingListCluster();

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

deleteReorderCluster

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

Kotlin

client.deleteReorderCluster()

Java

client.deleteReorderCluster();

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

deleteShoppingOrderTrackingCluster

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

Kotlin

client.deleteShoppingOrderTrackingCluster()

Java

client.deleteShoppingOrderTrackingCluster();

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

deleteUserManagementCluster

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

Kotlin

client.deleteUserManagementCluster()

Java

client.deleteUserManagementCluster();

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

deleteClusters

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

Kotlin

client.deleteClusters(
    DeleteClustersRequest.Builder()
      .addClusterType(ClusterType.TYPE_FEATURED)
      .addClusterType(ClusterType.TYPE_RECOMMENDATION)
      ...
      .build())

Java

client.deleteClusters(
            new DeleteClustersRequest.Builder()
                .addClusterType(ClusterType.TYPE_FEATURED)
                .addClusterType(ClusterType.TYPE_RECOMMENDATION)
                ...
                .build());

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

Обработка ошибок

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

Kotlin

client.publishRecommendationClusters(
        PublishRecommendationClustersRequest.Builder()
          .addRecommendationCluster(..)
          .build())
      .addOnCompleteListener { task ->
        if (task.isSuccessful) {
          // do something
        } else {
          val exception = task.exception
          if (exception is AppEngageException) {
            @AppEngageErrorCode val errorCode = exception.errorCode
            if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
              // do something
            }
          }
        }
      }

Java

client.publishRecommendationClusters(
              new PublishRecommendationClustersRequest.Builder()
                  .addRecommendationCluster(...)
                  .build())
          .addOnCompleteListener(
              task -> {
                if (task.isSuccessful()) {
                  // do something
                } else {
                  Exception exception = task.getException();
                  if (exception instanceof AppEngageException) {
                    @AppEngageErrorCode
                    int errorCode = ((AppEngageException) exception).getErrorCode();
                    if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
                      // do something
                    }
                  }
                }
              });

Ошибка возвращается как AppEngageException с указанием причины в виде кода ошибки.

Код ошибки Название ошибки Примечание
1 SERVICE_NOT_FOUND Сервис недоступен на этом устройстве.
2 SERVICE_NOT_AVAILABLE Сервис доступен на устройстве, но не в момент вызова (например, он отключен).
3 SERVICE_CALL_EXECUTION_FAILURE Не удалось выполнить задачу из-за проблем с потоками. В этом случае можно повторить попытку.
4 SERVICE_CALL_PERMISSION_DENIED Вызывающий абонент не может выполнить вызов сервиса.
5 SERVICE_CALL_INVALID_ARGUMENT Запрос содержит недопустимые данные (например, количество кластеров превышает допустимое).
6 SERVICE_CALL_INTERNAL Ошибка на стороне сервиса.
7 SERVICE_CALL_RESOURCE_EXHAUSTED Вызов сервиса выполняется слишком часто.

Шаг 3. Обработка намерений широковещательной рассылки

Помимо вызовов API для публикации контента через задание, также необходимо настроить BroadcastReceiver для получения запроса на публикацию контента.

Цель широковещательных намерений – повторная активация приложения и принудительная синхронизация данных. Широковещательные намерения не предназначены для частой отправки. Он запускается, только когда сервис Google Play Объекты определяет, что контент может быть устаревшим (например, ему неделя). Это позволяет пользователю видеть актуальный контент, даже если приложение не запускалось в течение длительного периода времени.

BroadcastReceiver необходимо настроить двумя способами:

  • Динамически зарегистрируйте экземпляр класса BroadcastReceiver с помощью Context.registerReceiver(). Это позволяет приложениям, которые все ещё находятся в памяти, обмениваться данными.

Kotlin

class AppEngageBroadcastReceiver : BroadcastReceiver(){
  // Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION
  // broadcast is received
  // Trigger featured cluster publish when PUBLISH_FEATURED broadcast is
  // received
  // Trigger shopping cart cluster publish when PUBLISH_SHOPPING_CART broadcast
  // is received
  // Trigger shopping list cluster publish when PUBLISH_SHOPPING_LIST broadcast
  // is received
  // Trigger reorder cluster publish when PUBLISH_REORDER_CLUSTER broadcast is
  // received
  // Trigger shopping order tracking cluster publish when
  // PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER broadcast is received
}

fun registerBroadcastReceivers(context: Context){
  var  context = context
  context = context.applicationContext

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

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

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

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

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

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

Java

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

// Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received

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

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

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

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

public static void registerBroadcastReceivers(Context context) {

context = context.getApplicationContext();

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

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

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

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

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

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

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

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

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

  • com.google.android.engage.action.PUBLISH_RECOMMENDATION При получении этого намерения рекомендуется начать вызов publishRecommendationClusters.
  • com.google.android.engage.action.PUBLISH_FEATURED При получении этого намерения рекомендуется запустить вызов publishFeaturedCluster.
  • com.google.android.engage.action.shopping.PUBLISH_SHOPPING_CART При получении этого намерения рекомендуется запустить вызов publishShoppingCarts.
  • com.google.android.engage.action.shopping.PUBLISH_SHOPPING_LIST При получении этого намерения рекомендуется запустить вызов publishShoppingLists.
  • com.google.android.engage.action.shopping.PUBLISH_REORDER_CLUSTER При получении этого намерения рекомендуется запустить вызов publishReorderCluster.
  • com.google.android.engage.action.shopping.PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER При получении этого намерения рекомендуется начать вызов publishShoppingOrderTrackingCluster.

Процесс интеграции

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

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

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

Контакт

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

Дальнейшие действия

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

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