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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Тип кластера Ограничения кластера Максимальные ограничения объектов в кластере
Кластер(ы) рекомендаций Максимум 5 Не более 25 ( ProductEntity , RecipeEntity или StoreEntity )
Рекомендуемый кластер Максимум 1 Не более 1 ( ProductEntity , RecipeEntity или StoreEntity ).
Кластер продовольственных корзин для покупок Максимум 1 Не более 1 ShoppingCartEntity
Кластер списков покупок продуктов питания Максимум 1 Не более 1 ShoppingListEntity
Кластер по перезаказу продуктов питания Максимум 1 Не более 1 ReorderEntity

Шаг 1. Предоставьте данные об объекте

В SDK определены разные объекты для представления каждого типа элементов. Мы поддерживаем следующие объекты в категории «Продовольствие»:

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

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

ProductEntity

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

Рис. : Атрибуты ProductEntity

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

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

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

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

Открытый текст

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

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

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

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

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

Открытый текст

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

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

Открытый текст

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

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

Максимальное значение рейтинговой шкалы.

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

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

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

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

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

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

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

Нить
Рейтинг – значение подсчета Необязательный

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

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

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

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

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

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

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

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

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

StoreEntity

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

Рис. : Атрибуты StoreEntity

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

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

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

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

Открытый текст

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

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

Открытый текст

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

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

Открытый текст

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

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

Открытый текст

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

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

Открытый текст

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

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

Максимальное значение рейтинговой шкалы.

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

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

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

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

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

Подсчет рейтингов магазина.

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

Нить
Рейтинг – значение подсчета Необязательный

Подсчет рейтингов магазина.

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

Длинный

RecipeEntity

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

Рис. : Атрибуты RecipeEntity

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

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

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

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

Открытый текст

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

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

Открытый текст

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

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

Открытый текст

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

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

Открытый текст

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

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

Открытый текст

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

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

Открытый текст

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

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

Максимальное значение рейтинговой шкалы.

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

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

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

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

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

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

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

Нить
Рейтинг – значение подсчета Необязательный

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

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

Длинный

FoodShoppingCart

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

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

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

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

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

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

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

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

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

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

Открытый текст

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

FoodShoppingList

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

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

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

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

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

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

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

Открытый текст

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

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

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

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

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

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

FoodReorderCluster

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

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

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

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

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

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

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

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

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

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

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

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

Открытый текст

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

Ярлыки предметов

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

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

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

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

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

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

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

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

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

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

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

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

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

Ниже перечислены необходимые характеристики для изображений.

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

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

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

300x300 1200x1200
Пейзаж (1,91x1) 600x314 1200x628
Портрет (4х5) 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 символов (слишком длинный текст может содержать многоточие).

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

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

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому 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 от партнера-разработчика удаляются.
  • Данные запроса анализируются и сохраняются в обновленном избранном кластере.

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

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

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

publishUserAccountManagementRequest

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

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

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

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

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

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

Котлин


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

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

Джава


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

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

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

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

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

updatePublishStatus

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

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

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

// Content is published
AppEngagePublishStatusCode.PUBLISHED,

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

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

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

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

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

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

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

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

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

Котлин


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

Джава


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

deleteRecommendationClusters

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

Котлин


client.deleteRecommendationClusters()

Джава


client.deleteRecommendationClusters();

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

deleteFeaturedCluster

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

Котлин


client.deleteFeaturedCluster()

Джава


client.deleteFeaturedCluster();

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

deleteFoodShoppingCartCluster

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

Котлин


client.deleteFoodShoppingCartCluster()

Джава


client.deleteFoodShoppingCartCluster();

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

deleteFoodShoppingListCluster

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

Котлин


client.deleteFoodShoppingListCluster()

Джава


client.deleteFoodShoppingListCluster();

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

deleteReorderCluster

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

Котлин


client.deleteReorderCluster()

Джава


client.deleteReorderCluster();

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

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

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

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

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

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

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

Контакт

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Тип кластера Ограничения кластера Максимальные ограничения объектов в кластере
Кластер(ы) рекомендаций Максимум 5 Не более 25 ( ProductEntity , RecipeEntity или StoreEntity )
Рекомендуемый кластер Максимум 1 Не более 1 ( ProductEntity , RecipeEntity или StoreEntity ).
Кластер продовольственных корзин Максимум 1 Не более 1 ShoppingCartEntity
Кластер списков покупок продуктов питания Максимум 1 Не более 1 ShoppingListEntity
Кластер по перезаказу продуктов питания Максимум 1 Не более 1 ReorderEntity

Шаг 1. Предоставьте данные об объекте

В SDK определены разные объекты для представления каждого типа элементов. Мы поддерживаем следующие объекты в категории «Продовольствие»:

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

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

ProductEntity

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

Рис. : Атрибуты ProductEntity

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

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

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

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

Открытый текст

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

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

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

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

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

Открытый текст

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

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

Открытый текст

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

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

Максимальное значение рейтинговой шкалы.

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

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

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

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

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

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

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

Нить
Рейтинг – значение подсчета Необязательный

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

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

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

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

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

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

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

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

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

StoreEntity

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

Рис. : Атрибуты StoreEntity

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

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

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

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

Открытый текст

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

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

Открытый текст

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

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

Открытый текст

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

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

Открытый текст

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

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

Открытый текст

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

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

Максимальное значение рейтинговой шкалы.

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

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

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

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

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

Подсчет рейтингов магазина.

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

Нить
Рейтинг – значение подсчета Необязательный

Подсчет рейтингов магазина.

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

Длинный

RecipeEntity

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

Рис. : Атрибуты RecipeEntity

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

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

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

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

Открытый текст

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

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

Открытый текст

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

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

Открытый текст

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

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

Открытый текст

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

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

Открытый текст

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

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

Открытый текст

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

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

Максимальное значение рейтинговой шкалы.

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

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

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

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

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

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

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

Нить
Рейтинг – значение подсчета Необязательный

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

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

Длинный

FoodShoppingCart

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

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

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

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

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

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

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

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

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

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

Открытый текст

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

FoodShoppingList

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

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

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

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

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

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

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

Открытый текст

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

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

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

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

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

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

FoodReorderCluster

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

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

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

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

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

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

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

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

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

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

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому 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 от партнера-разработчика удаляются.
  • Данные запроса анализируются и сохраняются в обновленном избранном кластере.

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

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

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

publishUserAccountManagementRequest

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

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

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

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

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

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

Котлин


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

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

Джава


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

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

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

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

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

updatePublishStatus

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

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

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

// Content is published
AppEngagePublishStatusCode.PUBLISHED,

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

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

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

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

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

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

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

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

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

Котлин


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

Джава


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

deleteRecommendationClusters

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

Котлин


client.deleteRecommendationClusters()

Джава


client.deleteRecommendationClusters();

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

deleteFeaturedCluster

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

Котлин


client.deleteFeaturedCluster()

Джава


client.deleteFeaturedCluster();

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

deleteFoodShoppingCartCluster

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

Котлин


client.deleteFoodShoppingCartCluster()

Джава


client.deleteFoodShoppingCartCluster();

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

deleteFoodShoppingListCluster

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

Котлин


client.deleteFoodShoppingListCluster()

Джава


client.deleteFoodShoppingListCluster();

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

deleteReorderCluster

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

Котлин


client.deleteReorderCluster()

Джава


client.deleteReorderCluster();

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

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

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

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

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

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

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

Контакт

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

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

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

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