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

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

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

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

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

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

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

    • Кластер рекомендаций может состоять из списков ProductEntity , StoreEntity или RecipeEntity , но не из смеси различных типов сущностей.
    Рисунок: `ProductEntity`, `StoreEntity` и `RecipeEntity`. (*UI только для иллюстративных целей)
  • Кластер Featured демонстрирует выборку сущностей от нескольких партнеров-разработчиков в одной группе пользовательского интерфейса. Будет один кластер Featured, который будет отображаться в верхней части пользовательского интерфейса с приоритетным размещением над всеми кластерами Recommendation. Каждому партнеру-разработчику будет разрешено транслировать до 10 сущностей в кластере Featured.

    Рисунок: Избранный кластер с `RecipeEntity`. (*UI только для иллюстративных целей)
  • Кластер продовольственной корзины показывает краткий обзор корзин продуктовых покупок от нескольких партнеров-разработчиков в одной группировке пользовательского интерфейса, побуждая пользователей завершить свои невыполненные корзины. Существует один кластер продовольственной корзины.

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

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

    Рисунок: Кластер списка покупок продуктов питания от одного партнера. (*UI только для иллюстративных целей)
  • Кластер Reorder показывает краткий обзор предыдущих заказов от нескольких партнеров-разработчиков в одной группировке пользовательского интерфейса, побуждая пользователей сделать повторный заказ. Существует один кластер Reorder.

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

      • Изображения для X элементов в предыдущем заказе пользователя.
      • Метки для X элементов в предыдущем заказе пользователя.
    Рисунок: Кластер заказа продуктов питания от одного партнера. (*UI только для иллюстративных целей)

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

Минимальный уровень 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'
}

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

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

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

Тип кластера Ограничения кластера Максимальные пределы сущностей в кластере
Кластер(ы) рекомендаций Максимум 7 Максимум 50 ( ProductEntity , RecipeEntity или StoreEntity )
Избранный кластер Максимум 1 Максимум 20 ( ProductEntity , RecipeEntity или StoreEntity )
Кластер тележек для покупок продуктов питания Максимум 1 Максимум 1 ShoppingCartEntity
Кластер списка покупок продуктов питания Максимум 1 Максимум 1 ShoppingListEntity
Кластер перераспределения продуктов питания Максимум 1 Максимум 1 ReorderEntity

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

SDK определил различные сущности для представления каждого типа элемента. Мы поддерживаем следующие сущности для категории Food:

  1. ProductEntity
  2. StoreEntity
  3. RecipeEntity
  4. FoodShoppingCart
  5. FoodShoppingList
  6. FoodReorderCluster

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

ProductEntity

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

Рисунок: Атрибуты ProductEntity

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

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

Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ

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

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

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

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

Текущая цена товара.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

StoreEntity

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

Рисунок: Атрибуты StoreEntity

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

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

Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ

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

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

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

Расположение Необязательный Расположение магазина.

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

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

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

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

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

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

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

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

Описание Необязательный Описание магазина.

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

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

Категория Необязательный

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

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

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

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

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

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

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

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

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

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

Количество оценок магазина.

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

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

Количество оценок магазина.

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

Длинный

RecipeEntity

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

Рисунок: Атрибуты RecipeEntity

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

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

Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ

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

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

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

Автор Необязательный Автор рецепта.

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

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

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

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

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

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

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

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

Категория Необязательный Категория рецепта.

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

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

Описание Необязательный Описание рецепта.

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

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

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

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

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

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

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

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

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

Количество оценок рецепта.

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

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

Количество оценок рецепта.

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

Длинный

FoodShoppingCart

Рисунок: Атрибуты кластера «Корзина для покупок».

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

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

Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

FoodShoppingList

Рисунок: Кластер списка покупок продуктов питания.

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

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

Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ

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

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

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

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

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

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

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

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

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

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

FoodReorderCluster

Рисунок: Кластер «Пищевой реорганизатор».

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

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

Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Квадрат (1x1)

Предпочтительный

300x300 1200x1200
Пейзаж (1,91x1) 600x314 1200x628
Портрет (4x5) 480x600 960x1200

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

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

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

5120 КБ

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

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

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

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

AppEngageFoodClient отвечает за публикацию кластеров продуктов питания.

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

  • isServiceAvailable
  • publishRecommendationClusters
  • publishFeaturedCluster
  • publishFoodShoppingCart
  • publishFoodShoppingList
  • publishReorderCluster
  • publishUserAccountManagementRequest
  • updatePublishStatus
  • deleteRecommendationsClusters
  • deleteFeaturedCluster
  • deleteFoodShoppingCartCluster
  • deleteFoodShoppingListCluster
  • deleteReorderCluster
  • 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 может иметь следующие атрибуты:

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

Название кластера рекомендаций (например, Большие скидки на меню на День благодарения ).

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

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

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

Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ

Котлин

client.publishRecommendationClusters(
            PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Big savings on Thanksgiving menu")
                        .build())
                .build())

Ява

client.publishRecommendationClusters(
            new PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    new RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Big savings on Thanksgiving menu")
                        .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.

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

publishFoodShoppingCart

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

Котлин

client.publishFoodShoppingCart(
            PublishFoodShoppingCartClusterRequest.Builder()
                .setShoppingCart(
                    FoodShoppingCart.Builder()
                        ...
                        .build())
                .build())

Ява

client.publishFoodShoppingCart(
            new PublishFoodShoppingCartClusterRequest.Builder()
                .setShoppingCart(
                    new FoodShoppingCart.Builder()
                        ...
                        .build())
                .build());

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

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

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

publishFoodShoppingList

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

Котлин

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

Ява

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

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

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

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

publishReorderCluster

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

Котлин

client.publishReorderCluster(
            PublishReorderClusterRequest.Builder()
                .setReorderCluster(
                    FoodReorderCluster.Builder()
                        ...
                        .build())
                .build())

Ява

client.publishReorderCluster(
            new PublishReorderClusterRequest.Builder()
                .setReorderCluster(
                    new FoodReorderCluster.Builder()
                        ...
                        .build())
                .build());

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

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

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

publishUserAccountManagementRequest

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

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

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

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

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

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

Котлин

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

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

Ява

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

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

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

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

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

updatePublishStatus

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

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

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

// Content is published
AppEngagePublishStatusCode.PUBLISHED,

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

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

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

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

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

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

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

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

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

Котлин

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

Ява

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

deleteRecommendationClusters

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

Котлин

client.deleteRecommendationClusters()

Ява

client.deleteRecommendationClusters();

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

deleteFeaturedCluster

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

Котлин

client.deleteFeaturedCluster()

Ява

client.deleteFeaturedCluster();

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

deleteFoodShoppingCartCluster

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

Котлин

client.deleteFoodShoppingCartCluster()

Ява

client.deleteFoodShoppingCartCluster();

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

deleteFoodShoppingListCluster

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

Котлин

client.deleteFoodShoppingListCluster()

Ява

client.deleteFoodShoppingListCluster();

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

deleteReorderCluster

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

Котлин

client.deleteReorderCluster()

Ява

client.deleteReorderCluster();

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

deleteUserManagementCluster

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

Котлин

client.deleteUserManagementCluster()

Ява

client.deleteUserManagementCluster();

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

deleteClusters

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

Котлин

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

Ява

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

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

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

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

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

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

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

Шаг 3: Обработка намерений трансляции

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

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

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

  • Динамически зарегистрируйте экземпляр класса BroadcastReceiver с помощью Context.registerReceiver() . Это позволяет осуществлять связь из приложений, которые все еще находятся в памяти.
class AppEngageBroadcastReceiver 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_FOOD_SHOPPING_CART
// broadcast is received

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

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

public static void registerBroadcastReceivers(Context context) {

context = context.getApplicationContext();

// Register Recommendation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_RECOMMENDATION));

// Register Featured Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED));

// Register Shopping Cart Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.food.service.Intents.ACTION_PUBLISH_FOOD_SHOPPING_CART));

// Register Shopping List Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.food.service.Intents.ACTION_PUBLISH_FOOD_SHOPPING_LIST));

// Register Reorder Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.food.service.Intents.ACTION_PUBLISH_REORDER_CLUSTER));

}

  • Статически объявите реализацию с тегом <receiver> в вашем файле AndroidManifest.xml . Это позволяет приложению получать широковещательные намерения, когда оно не запущено, а также позволяет приложению публиковать контент.
<application>
   <receiver
      android:name=".AppEngageBroadcastReceiver"
      android:exported="true"
      android:enabled="true">
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_RECOMMENDATION" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_FEATURED" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.food.PUBLISH_FOOD_SHOPPING_CART" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.food.PUBLISH_FOOD_SHOPPING_LIST" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.food.PUBLISH_REORDER_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.food.PUBLISH_FOOD_SHOPPING_CART При получении этого намерения рекомендуется начать вызов publishFoodShoppingCart .
  • com.google.android.engage.action.food.PUBLISH_FOOD_SHOPPING_LIST При получении этого намерения рекомендуется начать вызов publishFoodShoppingList .
  • com.google.android.engage.action.food.PUBLISH_REORDER_CLUSTER При получении этого намерения рекомендуется начать вызов publishReorderCluster .

Рабочий процесс интеграции

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

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

См. раздел « Часто задаваемые вопросы по Engage SDK» .

Контакт

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

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

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

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