Повысьте вовлеченность пользователей в приложении, обращаясь к ним там, где они находятся. Интегрируйте Engage SDK, чтобы доставлять персонализированные рекомендации и контент с продолжением прямо пользователям на различных устройствах, таких как «Коллекции» , «Развлечения» и Play Store. Интеграция добавляет менее 50 КБ (в сжатом виде) к среднему размеру APK-файла и занимает около недели времени разработки большинства приложений. Узнайте больше на нашем бизнес-сайте .
В этом руководстве содержатся инструкции для партнеров-разработчиков по размещению контента о здоровье и фитнесе на контентных площадках Engage.
Детали интеграции
Терминология
Эта интеграция включает следующие три типа кластеров: Рекомендация , Избранное и Продолжение .
Кластеры рекомендаций отображают персонализированные рекомендации по здоровью и фитнесу от конкретного разработчика. Эти рекомендации могут быть персонализированными для пользователя или обобщёнными (например, тренды в фитнесе и здоровье). Используйте их для поиска статей или людей, связанных со здоровьем и фитнесом.
- Кластер рекомендаций может состоять из
ArticleEntity
,PersonEntity
илиEventEntity
, но не из смеси различных типов сущностей.
Ваши рекомендации имеют следующую структуру:
Кластер рекомендаций: представление пользовательского интерфейса, содержащее группу рекомендаций от одного и того же партнера-разработчика.
Сущность: объект, представляющий отдельный элемент в кластере. Эта интеграция предлагает несколько сущностей, которые будут отображаться с помощью кластера рекомендаций:
ArticleEntity : ArticleEntity представляет собой рекомендацию текстового контента, связанного со здоровьем и фитнесом. Его можно использовать для статей, публикаций в блогах, маркетингового контента, новостных фрагментов и т. д.
Рисунок 1: Пользовательский интерфейс, показывающий одну ArticleEntity в кластере рекомендаций. PersonEntity : PersonEntity представляет человека. Рекомендации могут включать в себя тренера или любого человека, связанного со здоровьем и фитнесом, и т. д.
Рисунок 2: Пользовательский интерфейс, показывающий один объект PersonEntity в кластере рекомендаций. EventEntity : EventEntity представляет событие, которое произойдет в будущем. Время начала события — критически важная информация, которую необходимо донести до пользователей. Эта сущность может использоваться для отображения мероприятий, связанных со здоровьем и фитнесом, таких как сбор крови, тренировки, занятия в спортзале или йогой и т. д.
Рисунок 3: Пользовательский интерфейс, показывающий один EventEntity в кластере рекомендаций.
- Кластер рекомендаций может состоять из
Кластер Continuation отображает контент, недавно просмотренный пользователями от нескольких партнёров-разработчиков в единой группе пользовательского интерфейса. Каждому партнёру-разработчику будет разрешено транслировать не более 10 объектов в кластере Continuation.
Ваш дополнительный контент может иметь следующую структуру:
ArticleEntity : ArticleEntity представляет собой рекомендацию текстового контента, связанного со здоровьем и фитнесом. Эта сущность может использоваться для представления незаконченных новостных статей или другого контента, который пользователь хотел бы продолжить читать с того места, где остановился. Например: фрагмент новости, фрагмент записи в блоге на темы, связанные со здоровьем или фитнесом.
Рисунок 6. Пользовательский интерфейс, показывающий одну ArticleEntity в кластере Continuation. EventReservationEntity : EventReservationEntity представляет собой резервирование для мероприятия и помогает пользователям отслеживать предстоящие или текущие бронирования для занятий фитнесом и оздоровительных мероприятий. Пример: Тренировки.
Рисунок 8. Пользовательский интерфейс, показывающий один EventReservationEntity в кластере Continuation.
Кластер «Избранное» отображает избранные сущности от нескольких партнёров-разработчиков в одной группе пользовательского интерфейса. Будет создан один кластер «Избранное», который будет отображаться в верхней части пользовательского интерфейса и будет иметь приоритет над всеми кластерами «Рекомендации». Каждому партнёру-разработчику будет разрешено транслировать до 10 сущностей в кластере «Избранное».
GenericFeaturedEntity : GenericFeaturedEntity отличается от элемента «Рекомендация» тем, что элемент «Избранное» должен использоваться для одного самого популярного контента от разработчиков и должен представлять собой самый важный контент, который будет интересен и актуален для пользователей.
Рисунок 12: пользовательский интерфейс, отображающий карту GenericFeaturedEntity одного героя в кластере Featured
Предварительная работа
Минимальный уровень 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 | По крайней мере 1 | Не более 50 ( ArticleEntity , PersonEntity или EventEntity ) |
Продолжение кластера | Максимум 1 | По крайней мере 1 | Максимум 20 ( ArticleEntity или EventReservationEntity ) |
Избранный кластер | Максимум 1 | По крайней мере 1 | Максимум 20 ( GenericFeaturedEntity ) |
Шаг 1: Предоставьте данные об организации
В SDK определены различные сущности для представления каждого типа товаров. Для категории «Здоровье и фитнес» поддерживаются следующие сущности:
-
GenericFeaturedEntity
-
ArticleEntity
-
PersonEntity
-
EventEntity
-
EventReservationEntity
В приведенных ниже диаграммах представлены доступные атрибуты и требования для каждого типа.
GenericFeaturedEntity
Атрибут | Требование | Описание | Формат |
---|---|---|---|
Действие Uri | Необходимый | Глубокая ссылка на сущность в приложении поставщика. Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы». | Ури |
Изображения постеров | Необходимый | При наличии нескольких изображений будет показано только одно. Рекомендуемое соотношение сторон — 16:9. Примечание: Если вы используете значок, пожалуйста, оставьте свободное пространство размером 24 dps сверху и снизу изображения. | Инструкции см. в разделе «Характеристики изображения» . |
Заголовок | Необязательный | Название организации. | Свободный текст Рекомендуемый размер текста: 50 символов. |
Описание | Необязательный | Один абзац текста, описывающий сущность. Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу. | Свободный текст Рекомендуемый размер текста: 180 символов. |
Список субтитров | Необязательный | До 3 субтитров, каждый из которых представляет собой отдельную строку текста. Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу. | Свободный текст Рекомендуемый размер текста для каждого субтитра: не более 50 символов. |
Значки | Необязательный | Каждый значок представляет собой либо свободный текст (максимум 15 символов), либо небольшое изображение. Специальная UX-обработка поверх изображения/видео, например, наложение значка на изображение
| |
Значок - Текст | Необязательный | Название значка Примечание: для значка требуется текст или изображение. | Свободный текст Рекомендуемый размер текста: не более 15 символов. |
Значок - Изображение | Необязательный | Маленькое изображение Специальная обработка UX, например, наложение значка на миниатюру изображения/видео. Примечание: для значка требуется текст или изображение. | Инструкции см. в разделе «Характеристики изображения» . |
Категории контента | Необязательный | Опишите категорию контента в сущности. | Список перечислений Инструкции см. в разделе «Категория контента» . |
ArticleEntity
Атрибут | Требование | Описание | Формат |
---|---|---|---|
Действие Uri | Необходимый | Глубокая ссылка на сущность в приложении поставщика. Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы». | Ури |
Заголовок | Необходимый | Название организации. | Свободный текст Рекомендуемый размер текста: максимум 50 символов. |
Изображения постеров | Необязательный | При наличии нескольких изображений будет показано только одно. Рекомендуемое соотношение сторон — 16:9. Примечание: настоятельно рекомендуется использовать изображение. Если вы используете бейдж, пожалуйста, оставьте свободное пространство 24 dps сверху и снизу изображения. | Инструкции см. в разделе «Характеристики изображения» . |
Источник - Название | Необязательный | Имя автора, организации или репортера | Свободный текст Рекомендуемый размер текста: менее 25 символов. |
Источник - Изображение | Необязательный | Изображение источника, например автора, организации, репортера | Инструкции см. в разделе «Характеристики изображения» . |
Описание | Необязательный | Один абзац текста, описывающий сущность. Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу. | Свободный текст Рекомендуемый размер текста: 180 символов. |
Список субтитров | Необязательный | До 3 субтитров, каждый из которых представляет собой отдельную строку текста. Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу. | Свободный текст Рекомендуемый размер текста для каждого субтитра: не более 50 символов. |
Значки | Необязательный | Каждый значок представляет собой либо свободный текст (максимум 15 символов), либо небольшое изображение. Специальная UX-обработка поверх изображения/видео, например, наложение значка на изображение
| |
Значок - Текст | Необязательный | Название значка Примечание: для значка требуется текст или изображение. | Свободный текст Рекомендуемый размер текста: не более 15 символов. |
Значок - Изображение | Необязательный | Маленькое изображение Специальная обработка UX, например, наложение значка на миниатюру изображения/видео. Примечание: для значка требуется текст или изображение. | Инструкции см. в разделе «Характеристики изображения» . |
Время публикации контента | Необязательный | Это временная метка эпохи в миллисекундах, когда контент был опубликован/обновлен в приложении. | Метка времени эпохи в миллисекундах |
Время последнего участия | Условно требуется | Метка времени в миллисекундах, когда пользователь последний раз взаимодействовал с этой сущностью. Примечание: это поле обязательно для заполнения, если данная сущность является частью кластера продолжения. | Метка времени эпохи в миллисекундах |
Процент прогресса | Условно требуется | Процент всего контента, потребленного пользователем на текущий момент. Примечание: это поле обязательно для заполнения, если данная сущность является частью кластера продолжения. | Целочисленное значение от 0 до 100 включительно. |
Категории контента | Необязательный | Опишите категорию контента в сущности. | Список перечислений Инструкции см. в разделе «Категория контента» . |
PersonEntity
Атрибут | Требование | Описание | Формат |
---|---|---|---|
Действие Uri | Необходимый | Глубокая ссылка на сущность в приложении поставщика. Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы». | Ури |
Профиль - Имя | Необходимый | Имя, идентификатор или никнейм профиля, например «John Doe», «@TeamPixel» и т. д. | Нить Рекомендуемый размер текста: максимум 50 символов. |
Профиль - Аватар | Необходимый | Изображение профиля или аватара пользователя. Примечание: изображение должно быть квадратным и иметь соотношение сторон 1:1. | Инструкции см. в разделе «Характеристики изображения» . |
Профиль - Дополнительный текст | Необязательный | Свободный текст, как в имени профиля. | Свободный текст Рекомендуемый размер текста: максимум 15 символов. |
Профиль - Дополнительное изображение | Необязательный | Небольшое изображение, похожее на значок подтверждения. | Инструкции см. в разделе «Характеристики изображения» . |
Изображение заголовка | Необязательный | При наличии нескольких изображений будет показано только одно. Рекомендуемое соотношение сторон — 16:9. Примечание: настоятельно рекомендуется использовать изображение. Если вы используете бейдж, пожалуйста, оставьте свободное пространство 24 dps сверху и снизу изображения. | Инструкции см. в разделе «Характеристики изображения» . |
Популярность - Количество | Необязательный | Укажите количество подписчиков или показатель популярности, например - «3,7 млн». Примечание: если указаны и количество, и значение количества, будет использоваться количество. | Нить Рекомендуемый размер текста: не более 20 символов для количества и метки. |
Популярность - значение количества | Необязательный | Количество подписчиков или показатель популярности. Примечание: укажите значение Count, если ваше приложение не обрабатывает логику оптимизации больших чисел для разных размеров экрана. Если указаны и Count, и Count Value, будет использоваться Count. | Длинный |
Популярность - Метка | Необязательный | Укажите метку популярности. Например, «Нравится». | Нить Рекомендуемый размер текста: максимум 20 символов для количества и метки. |
Популярность - Визуальная | Необязательный | Укажите цель взаимодействия. Например, изображение значка «Нравится», эмодзи. Можно предоставить более одного изображения, хотя не все из них могут быть отображены на всех форм-факторах. Примечание: изображение должно быть квадратным и иметь соотношение сторон 1:1. | Инструкции см. в разделе «Характеристики изображения» . |
Рейтинг - Максимальное значение | Необходимый | Максимальное значение шкалы оценок. Обязательно, если указано текущее значение рейтинга. | Число >= 0,0 |
Рейтинг - Текущее значение | Необходимый | Текущее значение шкалы оценки. Обязательно должно быть указано, если также указано максимальное значение рейтинга. | Число >= 0,0 |
Рейтинг - Количество | Необязательный | Количество рейтингов для объекта. Примечание: укажите это поле, если ваше приложение управляет отображением счётчика для пользователей. Используйте краткую строку. Например, если счётчик равен 1 000 000, рассмотрите возможность использования сокращения, например, 1M, чтобы счётчик не обрезался на экранах с меньшим разрешением. | Нить |
Рейтинг - Количество | Необязательный | Количество рейтингов для объекта. Примечание: укажите это поле, если вы не управляете логикой отображения сокращений самостоятельно. Если указаны и Count, и Count Value, пользователям будет показано Count. | Длинный |
Местоположение - Страна | Необязательный | Страна, в которой находится или служит данное лицо. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - Город | Необязательный | Город, в котором находится или служит человек. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - Отображение адреса | Необязательный | Адрес, по которому находится или работает человек, будет отображаться пользователю. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - Уличный адрес | Необязательный | Адрес (если применимо), по которому проживает или работает данное лицо. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - Штат | Необязательный | Штат (если применимо), в котором находится или служит лицо. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - почтовый индекс | Необязательный | Почтовый индекс (если применимо), где находится или служит данное лицо. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Расположение - Район | Необязательный | Район (если применимо), в котором находится или работает данное лицо. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Значки | Необязательный | Каждый значок представляет собой либо свободный текст (максимум 15 символов), либо небольшое изображение. | |
Значок - Текст | Необязательный | Название значка Примечание: для значка требуется текст или изображение. | Свободный текст Рекомендуемый размер текста: не более 15 символов. |
Значок - Изображение | Необязательный | Маленькое изображение Специальная обработка UX, например, наложение значка на миниатюру изображения/видео. Примечание: для значка требуется текст или изображение. | Инструкции см. в разделе «Характеристики изображения» . |
Описание | Необязательный | Один абзац текста, описывающий сущность. Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу. | Свободный текст Рекомендуемый размер текста: 180 символов. |
Список субтитров | Необязательный | До 3 субтитров, каждый из которых представляет собой отдельную строку текста. Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу. | Свободный текст Рекомендуемый размер текста для каждого субтитра: не более 50 символов. |
Категории контента | Необязательный | Опишите категорию контента в сущности. | Список допустимых перечислений
Инструкции см. в разделе «Категория контента» . |
EventEntity
Атрибут | Требование | Описание | Формат |
---|---|---|---|
Действие Uri | Необходимый | Глубокая ссылка на сущность в приложении поставщика. Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы». | Ури |
Заголовок | Необходимый | Название организации. | Нить Рекомендуемый размер текста: максимум 50 символов. |
Время начала | Необходимый | Метка времени эпохи, когда ожидается начало события. Примечание: данные будут представлены в миллисекундах. | Метка времени эпохи в миллисекундах |
Режим событий | Необходимый | Поле для указания того, будет ли мероприятие виртуальным, очным или и тем, и другим. | Перечисление: VIRTUAL, IN_PERSON или HYBRID |
Изображения постеров | Необходимый | При наличии нескольких изображений будет показано только одно. Рекомендуемое соотношение сторон — 16:9. Примечание: настоятельно рекомендуется использовать изображение. Если вы используете бейдж, пожалуйста, оставьте свободное пространство 24 dps сверху и снизу изображения. | Инструкции см. в разделе «Характеристики изображения» . |
Местоположение - Страна | Условно требуется | Страна, в которой происходит событие. Примечание: это требуется для мероприятий IN_PERSON или HYBRID. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - Город | Условно требуется | Город, в котором происходит событие. Примечание: это требуется для мероприятий IN_PERSON или HYBRID. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - Отображение адреса | Условно требуется | Адрес или название места проведения мероприятия, которое должно отображаться пользователю. Примечание: это требуется для мероприятий IN_PERSON или HYBRID. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - Уличный адрес | Необязательный | Укажите почтовый адрес (если применимо) места проведения мероприятия. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - Штат | Необязательный | Штат или провинция (если применимо), в которой проводится мероприятие. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - почтовый индекс | Необязательный | Почтовый индекс (если применимо) места проведения мероприятия. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Расположение - Район | Необязательный | Район (если применимо), в котором проводится мероприятие. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Время окончания | Необязательный | Метка времени эпохи, когда ожидается окончание события. Примечание: данные будут представлены в миллисекундах. | Метка времени эпохи в миллисекундах |
Описание | Необязательный | Один абзац текста, описывающий сущность. Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу. | Свободный текст Рекомендуемый размер текста: 180 символов. |
Список субтитров | Необязательный | До 3 субтитров, каждый из которых представляет собой отдельную строку текста. Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу. | Свободный текст Рекомендуемый размер текста для каждого субтитра: не более 50 символов. |
Значки | Необязательный | Каждый значок представляет собой либо свободный текст (максимум 15 символов), либо небольшое изображение. | |
Значок - Текст | Необязательный | Название значка Примечание: для значка требуется текст или изображение. | Свободный текст Рекомендуемый размер текста: не более 15 символов. |
Значок - Изображение | Необязательный | Маленькое изображение Специальная обработка UX, например, наложение значка на миниатюру изображения/видео. Примечание: для значка требуется текст или изображение. | Инструкции см. в разделе «Характеристики изображения» . |
Цена - Текущая цена | Условно требуется | Текущая цена билета/пропуска на мероприятие. Обязательно должно быть указано, если указана зачеркнутая цена. | Свободный текст |
Цена - ЗачеркнутаяЦена | Необязательный | Первоначальная цена билета/пропуска на мероприятие. | Свободный текст |
Вызов цены | Необязательный | Указание цены с указанием акции, события, скидки для участников (если таковая имеется). | Свободный текст Рекомендуемый размер текста: менее 45 символов (слишком длинный текст может содержать многоточия) |
Категории контента | Необязательный | Опишите категорию контента в сущности. | Список допустимых перечислений
Инструкции см. в разделе «Категория контента» . |
EventReservationEntity
Атрибут | Требование | Описание | Формат |
---|---|---|---|
Действие Uri | Необходимый | Глубокая ссылка на сущность в приложении поставщика. Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы». | Ури |
Заголовок | Необходимый | Название организации. | Нить Рекомендуемый размер текста: максимум 50 символов. |
Время начала | Необходимый | Метка времени эпохи, когда ожидается начало события. Примечание: данные будут представлены в миллисекундах. | Метка времени эпохи в миллисекундах |
Режим событий | Необходимый | Поле для указания того, будет ли мероприятие виртуальным, очным или и тем, и другим. | Перечисление: VIRTUAL, IN_PERSON или HYBRID |
Местоположение - Страна | Условно требуется | Страна, в которой происходит событие. Примечание: это требуется для мероприятий IN_PERSON или HYBRID. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - Город | Условно требуется | Город, в котором происходит событие. Примечание: это требуется для мероприятий IN_PERSON или HYBRID. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - Отображение адреса | Условно требуется | Адрес или название места проведения мероприятия, которое должно отображаться пользователю. Примечание: это требуется для мероприятий IN_PERSON или HYBRID. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - Уличный адрес | Необязательный | Укажите почтовый адрес (если применимо) места проведения мероприятия. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - Штат | Необязательный | Штат или провинция (если применимо), в которой проводится мероприятие. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - почтовый индекс | Необязательный | Почтовый индекс (если применимо) места проведения мероприятия. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Расположение - Район | Необязательный | Район (если применимо), в котором проводится мероприятие. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Изображения постеров | Необязательный | При наличии нескольких изображений будет показано только одно. Рекомендуемое соотношение сторон — 16:9. Примечание: настоятельно рекомендуется использовать изображение. Если вы используете бейдж, пожалуйста, оставьте свободное пространство 24 dps сверху и снизу изображения. | Инструкции см. в разделе «Характеристики изображения» . |
Время окончания | Необязательный | Метка времени эпохи, когда ожидается окончание события. Примечание: данные будут представлены в миллисекундах. | Метка времени эпохи в миллисекундах |
Поставщик услуг - Имя | Необязательный | Название поставщика услуг. Примечание: для поставщика услуг требуется текст или изображение. | Свободный текст. Например, название организатора мероприятия/тура. |
Поставщик услуг - Изображение | Необязательный | Логотип/изображение поставщика услуг. Примечание: для поставщика услуг требуется текст или изображение. | Инструкции см. в разделе «Характеристики изображения» . |
Описание | Необязательный | Один абзац текста, описывающий сущность. Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу. | Свободный текст Рекомендуемый размер текста: 180 символов. |
Список субтитров | Необязательный | До 3 субтитров, каждый из которых представляет собой отдельную строку текста. Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу. | Свободный текст Рекомендуемый размер текста для каждого субтитра: не более 50 символов. |
Значки | Необязательный | Каждый значок представляет собой либо свободный текст (максимум 15 символов), либо небольшое изображение. | |
Значок - Текст | Необязательный | Название значка Примечание: для значка требуется текст или изображение. | Свободный текст Рекомендуемый размер текста: не более 15 символов. |
Значок - Изображение | Необязательный | Маленькое изображение Специальная обработка UX, например, наложение значка на миниатюру изображения/видео. Примечание: для значка требуется текст или изображение. | Инструкции см. в разделе «Характеристики изображения» . |
Идентификатор бронирования | Необязательный | Идентификатор бронирования для бронирования мероприятия. | Свободный текст |
Цена - Текущая цена | Условно требуется | Текущая цена билета/пропуска на мероприятие. Обязательно должно быть указано, если указана зачеркнутая цена. | Свободный текст |
Цена - ЗачеркнутаяЦена | Необязательный | Первоначальная цена билета/пропуска на мероприятие. | Свободный текст |
Вызов цены | Необязательный | Указание цены с указанием акции, события, скидки для участников (если таковая имеется). | Свободный текст Рекомендуемый размер текста: менее 45 символов (слишком длинный текст может содержать многоточия) |
Рейтинг - Максимальное значение | Необязательный | Максимальное значение шкалы оценок. Обязательно, если указано текущее значение рейтинга. | Число >= 0,0 |
Рейтинг - Текущее значение | Необязательный | Текущее значение шкалы оценки. Обязательно должно быть указано, если также указано максимальное значение рейтинга. | Число >= 0,0 |
Рейтинг - Количество | Необязательный | Количество оценок события. Примечание: укажите это поле, если ваше приложение хочет управлять отображением этого значения для пользователей. Укажите краткую строку, которая будет отображаться для пользователя. Например, если значение равно 1 000 000, используйте сокращения вроде 1M, чтобы оно не обрезалось на экранах с меньшим разрешением. | Нить |
Рейтинг - Количество | Необязательный | Количество оценок события. Примечание: укажите это поле, если вы не хотите самостоятельно обрабатывать логику отображения сокращений. Если указаны и Count, и Count Value, мы будем использовать Count для отображения пользователям. | Длинный |
Категории контента | Необязательный | Опишите категорию контента в сущности. | Список допустимых перечислений
Инструкции см. в разделе «Категория контента» . |
Характеристики изображения
Требуемые характеристики изображений приведены в этой таблице:
Соотношение сторон | Минимальное количество пикселей | Рекомендуемые пиксели |
---|---|---|
Квадрат (1x1) Предпочтительный | 300x300 | 1200x1200 |
Пейзаж (1,91x1) | 600x314 | 1200x628 |
Портрет (4x5) | 480x600 | 960x1200 |
Изображения должны размещаться на публичных CDN, чтобы Google мог получить к ним доступ.
Форматы файлов
PNG, JPG, статический GIF, WebP
Максимальный размер файла
5120 КБ
Дополнительные рекомендации
- Безопасная область изображения: разместите важный контент в центре изображения (80%).
- Используйте прозрачный фон, чтобы изображение корректно отображалось в настройках темной и светлой темы.
Категория контента
Категория контента позволяет приложениям публиковать контент, относящийся к нескольким категориям. Это позволяет сопоставить контент с некоторыми предопределёнными категориями, а именно:
-
TYPE_EDUCATION
-
TYPE_SPORTS
-
TYPE_MOVIES_AND_TV_SHOWS
-
TYPE_BOOKS
-
TYPE_AUDIOBOOKS
-
TYPE_MUSIC
-
TYPE_DIGITAL_GAMES
-
TYPE_TRAVEL_AND_LOCAL
-
TYPE_HOME_AND_AUTO
-
TYPE_BUSINESS
-
TYPE_NEWS
-
TYPE_FOOD_AND_DRINK
-
TYPE_SHOPPING
-
TYPE_HEALTH_AND_FITENESS
-
TYPE_MEDICAL
-
TYPE_PARENTING
-
TYPE_DATING
Изображения должны размещаться на публичных CDN, чтобы Google мог получить к ним доступ.
Рекомендации по использованию категорий контента
- Некоторые сущности, такие как ArticleEntity и GenericFeaturedEntity, могут использовать любую категорию контента. Для других сущностей, таких как EventEntity , EventReservationEntity , PersonEntity , допускается только подмножество этих категорий. Перед заполнением списка проверьте список категорий, подходящих для данного типа сущности.
Use the specific entity type for some content categories over a combination of the Generic entities and the ContentCategory:
- TYPE_MOVIES_AND_TV_SHOWS - Перед использованием универсальных сущностей ознакомьтесь с сущностями из руководства по интеграции Watch .
- TYPE_BOOKS — проверьте EbookEntity перед использованием универсальных сущностей.
- TYPE_AUDIOBOOKS — проверьте AudiobookEntity перед использованием универсальных сущностей.
- TYPE_SHOPPING - Проверьте ShoppingEntity перед использованием универсальных сущностей.
- TYPE_FOOD_AND_DRINK — перед использованием универсальных сущностей ознакомьтесь с сущностями из руководства по интеграции продуктов питания .
Поле ContentCategory является необязательным и должно оставаться пустым, если контент не принадлежит ни к одной из упомянутых ранее категорий.
Если указано несколько категорий контента, укажите их в порядке релевантности контенту, при этом наиболее релевантная категория контента должна быть размещена первой в списке.
Шаг 2: Предоставьте данные кластера
Рекомендуется, чтобы задание по публикации контента выполнялось в фоновом режиме (например, с помощью WorkManager ) и планировалось на регулярной основе или на основе события (например, каждый раз, когда пользователь открывает приложение или когда пользователь только что добавил что-то в свою корзину).
AppEngagePublishClient
отвечает за публикацию кластеров.
Для публикации кластеров в клиенте имеются следующие API:
-
isServiceAvailable
-
publishRecommendationClusters
-
publishFeaturedCluster
-
publishContinuationCluster
-
publishUserAccountManagementRequest
-
updatePublishStatus
-
deleteRecommendationsClusters
-
deleteFeaturedCluster
-
deleteContinuationCluster
-
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
.
Котлин
client.publishRecommendationClusters(
PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(
RecommendationCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.setTitle("Top Picks For You")
.build()
)
.build()
)
Ява
client.publishRecommendationClusters(
new PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(
new RecommendationCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.setTitle("Top Picks For You")
.build())
.build());
При получении запроса сервисом в рамках одной транзакции выполняются следующие действия:
- Существующие данные
RecommendationCluster
от партнера-разработчика удаляются. - Данные из запроса анализируются и сохраняются в обновленном кластере рекомендаций.
В случае ошибки весь запрос отклоняется и сохраняется текущее состояние.
publishFeaturedCluster
Этот API используется для публикации списка объектов FeaturedCluster
.
Котлин
client.publishFeaturedCluster(
PublishFeaturedClusterRequest.Builder()
.setFeaturedCluster(
FeaturedCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.build())
.build())
Ява
client.publishFeaturedCluster(
new PublishFeaturedClustersRequest.Builder()
.addFeaturedCluster(
new FeaturedCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.build())
.build());
При получении запроса сервисом в рамках одной транзакции выполняются следующие действия:
- Существующие данные
FeaturedCluster
от партнера-разработчика удаляются. - Данные из запроса анализируются и сохраняются в обновленном Featured Cluster.
В случае ошибки весь запрос отклоняется и сохраняется текущее состояние.
publishContinuationCluster
Этот API используется для публикации объекта ContinuationCluster
.
Котлин
client.publishContinuationCluster(
PublishContinuationClusterRequest.Builder()
.setContinuationCluster(
ContinuationCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.build())
.build())
Ява
client.publishContinuationCluster(
new PublishContinuationClusterRequest.Builder()
.setContinuationCluster(
new ContinuationCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.build())
.build());
При получении запроса сервисом в рамках одной транзакции выполняются следующие действия:
- Существующие данные
ContinuationCluster
от партнера-разработчика удаляются. - Данные из запроса анализируются и сохраняются в обновленном кластере продолжения.
В случае ошибки весь запрос отклоняется и сохраняется текущее состояние.
publishUserAccountManagementRequest
Этот API используется для публикации карточки входа. Действие входа перенаправляет пользователей на страницу входа в приложение, где приложение может опубликовать контент (или предоставить более персонализированный контент).
Следующие метаданные являются частью карты входа:
Атрибут | Требование | Описание |
---|---|---|
Действие Uri | Необходимый | Глубокая ссылка на действие (т. е. переход на страницу входа в приложение) |
Изображение | Необязательно. Если не указано, необходимо указать название. | Изображение, показанное на карте Изображения с соотношением сторон 16x9 и разрешением 1264x712 |
Заголовок | Необязательно. Если изображение не указано, его необходимо предоставить. | Название карты |
Текст действия | Необязательный | Текст, отображаемый в призыве к действию (например, «Войти») |
Подзаголовок | Необязательный | Дополнительный подзаголовок на карточке |
Котлин
var SIGN_IN_CARD_ENTITY =
SignInCardEntity.Builder()
.addPosterImage(
Image.Builder()
.setImageUri(Uri.parse("http://www.x.com/image.png"))
.setImageHeightInPixel(500)
.setImageWidthInPixel(500)
.build())
.setActionText("Sign In")
.setActionUri(Uri.parse("http://xx.com/signin"))
.build()
client.publishUserAccountManagementRequest(
PublishUserAccountManagementRequest.Builder()
.setSignInCardEntity(SIGN_IN_CARD_ENTITY)
.build());
Ява
SignInCardEntity SIGN_IN_CARD_ENTITY =
new SignInCardEntity.Builder()
.addPosterImage(
new Image.Builder()
.setImageUri(Uri.parse("http://www.x.com/image.png"))
.setImageHeightInPixel(500)
.setImageWidthInPixel(500)
.build())
.setActionText("Sign In")
.setActionUri(Uri.parse("http://xx.com/signin"))
.build();
client.publishUserAccountManagementRequest(
new PublishUserAccountManagementRequest.Builder()
.setSignInCardEntity(SIGN_IN_CARD_ENTITY)
.build());
При получении запроса сервисом в рамках одной транзакции выполняются следующие действия:
- Существующие данные
UserAccountManagementCluster
от партнера-разработчика удаляются. - Данные из запроса анализируются и сохраняются в обновленном кластере UserAccountManagementCluster.
В случае ошибки весь запрос отклоняется и сохраняется текущее состояние.
updatePublishStatus
Если по каким-либо внутренним бизнес-причинам ни один из кластеров не опубликован, мы настоятельно рекомендуем обновить статус публикации с помощью API updatePublishStatus . Это важно, поскольку:
- Предоставление статуса во всех сценариях, даже если контент опубликован (СТАТУС == ОПУБЛИКОВАН), имеет решающее значение для заполнения панелей мониторинга, которые используют этот явный статус для отображения работоспособности и других показателей вашей интеграции.
- Если контент не опубликован, но статус интеграции не нарушен (STATUS == NOT_PUBLISHED), Google может не выдавать оповещения на панелях мониторинга состояния приложения. Это подтверждает, что контент не опубликован из-за ожидаемой с точки зрения поставщика ситуации.
- Это помогает разработчикам получать представление о том, когда данные публикуются, а когда нет.
- Google может использовать коды статуса, чтобы подтолкнуть пользователя к выполнению определенных действий в приложении, чтобы он мог просмотреть содержимое приложения или преодолеть его.
Список допустимых кодов статуса публикации:
// Content is published
AppEngagePublishStatusCode.PUBLISHED,
// Content is not published as user is not signed in
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN,
// Content is not published as user is not subscribed
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SUBSCRIPTION,
// Content is not published as user location is ineligible
AppEngagePublishStatusCode.NOT_PUBLISHED_INELIGIBLE_LOCATION,
// Content is not published as there is no eligible content
AppEngagePublishStatusCode.NOT_PUBLISHED_NO_ELIGIBLE_CONTENT,
// Content is not published as the feature is disabled by the client
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_FEATURE_DISABLED_BY_CLIENT,
// Content is not published as the feature due to a client error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_CLIENT_ERROR,
// Content is not published as the feature due to a service error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_SERVICE_ERROR,
// Content is not published due to some other reason
// Reach out to engage-developers@ before using this enum.
AppEngagePublishStatusCode.NOT_PUBLISHED_OTHER
Если контент не опубликован из-за того, что пользователь не вошел в систему, Google рекомендует опубликовать карту входа. Если по какой-либо причине поставщики не могут опубликовать карту входа, мы рекомендуем вызвать API updatePublishStatus с кодом статуса NOT_PUBLISHED_REQUIRES_SIGN_IN.
Котлин
client.updatePublishStatus(
PublishStatusRequest.Builder()
.setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
.build())
Ява
client.updatePublishStatus(
new PublishStatusRequest.Builder()
.setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
.build());
deleteRecommendationClusters
Этот API используется для удаления содержимого кластеров рекомендаций.
Котлин
client.deleteRecommendationClusters()
Ява
client.deleteRecommendationClusters();
При получении запроса сервис удаляет существующие данные из кластеров рекомендаций. В случае ошибки весь запрос отклоняется, и текущее состояние сохраняется.
deleteFeaturedCluster
Этот API используется для удаления содержимого Featured Cluster.
Котлин
client.deleteFeaturedCluster()
Ява
client.deleteFeaturedCluster();
Получив запрос, сервис удаляет существующие данные из Featured Cluster. В случае ошибки запрос отклоняется полностью, а текущее состояние сохраняется.
deleteContinuationCluster
Этот API используется для удаления содержимого Continuation Cluster.
Котлин
client.deleteContinuationCluster()
Ява
client.deleteContinuationCluster();
Получив запрос, сервис удаляет существующие данные из кластера продолжения. В случае ошибки запрос отклоняется полностью, а текущее состояние сохраняется.
deleteUserManagementCluster
Этот API используется для удаления содержимого кластера UserAccountManagement.
Котлин
client.deleteUserManagementCluster()
Ява
client.deleteUserManagementCluster();
Получив запрос, сервис удаляет существующие данные из кластера UserAccountManagement. В случае ошибки запрос отклоняется полностью, а текущее состояние сохраняется.
deleteClusters
Этот API используется для удаления содержимого заданного типа кластера.
Котлин
client.deleteClusters(
DeleteClustersRequest.Builder()
.addClusterType(ClusterType.TYPE_CONTINUATION)
.addClusterType(ClusterType.TYPE_FEATURED)
.addClusterType(ClusterType.TYPE_RECOMMENDATION)
.build())
Ява
client.deleteClusters(
new DeleteClustersRequest.Builder()
.addClusterType(ClusterType.TYPE_CONTINUATION)
.addClusterType(ClusterType.TYPE_FEATURED)
.addClusterType(ClusterType.TYPE_RECOMMENDATION)
.build());
Получив запрос, сервис удаляет существующие данные из всех кластеров, соответствующих указанным типам. Клиенты могут выбрать один или несколько типов кластеров. В случае ошибки весь запрос отклоняется, и текущее состояние сохраняется.
Обработка ошибок
Настоятельно рекомендуется прослушивать результаты выполнения задачи из API публикации, чтобы можно было предпринять последующие действия для восстановления и повторной отправки успешно выполненной задачи.
Котлин
client.publishRecommendationClusters(
PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(..)
.build())
.addOnCompleteListener { task ->
if (task.isSuccessful) {
// do something
} else {
val exception = task.exception
if (exception is AppEngageException) {
@AppEngageErrorCode val errorCode = exception.errorCode
if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
// do something
}
}
}
}
Ява
client.publishRecommendationClusters(
new PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(...)
.build())
.addOnCompleteListener(
task -> {
if (task.isSuccessful()) {
// do something
} else {
Exception exception = task.getException();
if (exception instanceof AppEngageException) {
@AppEngageErrorCode
int errorCode = ((AppEngageException) exception).getErrorCode();
if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
// do something
}
}
}
});
The error is returned as an AppEngageException
with the cause included as an error code.
Код ошибки | Имя ошибки | Примечание |
---|---|---|
1 | SERVICE_NOT_FOUND | The service is not available on the given device. |
2 | SERVICE_NOT_AVAILABLE | The service is available on the given device, but it is not available at the time of the call (for example, it is explicitly disabled). |
3 | SERVICE_CALL_EXECUTION_FAILURE | The task execution failed due to threading issues. In this case, it can be retried. |
4 | SERVICE_CALL_PERMISSION_DENIED | The caller is not allowed to make the service call. |
5 | SERVICE_CALL_INVALID_ARGUMENT | The request contains invalid data (for example, more than the allowed number of clusters). |
6 | SERVICE_CALL_INTERNAL | There is an error on the service side. |
7 | SERVICE_CALL_RESOURCE_EXHAUSTED | The service call is made too frequently. |
Step 3: Handle broadcast intents
In addition to making publish content API calls through a job, it is also required to set up a BroadcastReceiver
to receive the request for a content publish.
The goal of broadcast intents is mainly for app reactivation and forcing data sync. Broadcast intents are not designed to be sent very frequently. It is only triggered when the Engage Service determines the content might be stale (for example, a week old). That way, there is more confidence that the user can have a fresh content experience, even if the application has not been executed for a long period of time.
The BroadcastReceiver
must be set up in the following two ways:
Dynamically register an instance of the
BroadcastReceiver
class usingContext.registerReceiver()
. This enables communication from applications that are still live in memory.
Котлин
class AppEngageBroadcastReceiver : BroadcastReceiver(){
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
// is received
// Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received
// Trigger continuation cluster publish when PUBLISH_CONTINUATION broadcast is
// received
}
fun registerBroadcastReceivers(context: Context){
var context = context
context = context.applicationContext
// Register Recommendation Cluster Publish Intent
context.registerReceiver(AppEngageBroadcastReceiver(),
IntentFilter(Intents.ACTION_PUBLISH_RECOMMENDATION),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null)
// Register Featured Cluster Publish Intent
context.registerReceiver(AppEngageBroadcastReceiver(),
IntentFilter(Intents.ACTION_PUBLISH_FEATURED),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null)
// Register Continuation Cluster Publish Intent
context.registerReceiver(AppEngageBroadcastReceiver(),
IntentFilter(Intents.ACTION_PUBLISH_CONTINUATION),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null)
}
Ява
class AppEngageBroadcastReceiver extends BroadcastReceiver {
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
// is received
// Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received
// Trigger continuation cluster publish when PUBLISH_CONTINUATION broadcast is
// received
}
public static void registerBroadcastReceivers(Context context) {
context = context.getApplicationContext();
// Register Recommendation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_RECOMMENDATION),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null);
// Register Featured Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null);
// Register Continuation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_CONTINUATION),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null);
}
Statically declare an implementation with the
<receiver>
tag in yourAndroidManifest.xml
file. This allows the application to receive broadcast intents when it is not running, and also allows the application to publish the content.
<application>
<receiver
android:name=".AppEngageBroadcastReceiver"
android:permission="com.google.android.engage.REQUEST_ENGAGE_DATA"
android:exported="true"
android:enabled="true">
<intent-filter>
<action android:name="com.google.android.engage.action.PUBLISH_RECOMMENDATION" />
</intent-filter>
<intent-filter>
<action android:name="com.google.android.engage.action.PUBLISH_FEATURED" />
</intent-filter>
<intent-filter>
<action android:name="com.google.android.engage.action.PUBLISH_CONTINUATION" />
</intent-filter>
</receiver>
</application>
The following intents is sent by the service:
-
com.google.android.engage.action.PUBLISH_RECOMMENDATION
It is recommended to start apublishRecommendationClusters
call when receiving this intent. -
com.google.android.engage.action.PUBLISH_FEATURED
It is recommended to start apublishFeaturedCluster
call when receiving this intent. -
com.google.android.engage.action.PUBLISH_CONTINUATION
It is recommended to start apublishContinuationCluster
call when receiving this intent.
Рабочий процесс интеграции
For a step-by-step guide on verifying your integration after it is complete, see Engage developer integration workflow .
FAQs
See Engage SDK Frequently Asked Questions for FAQs.
Контакт
Contact engage-developers@google.com
if there are any questions during the integration process.
Следующие шаги
After completing this integration, your next steps are as follows:
- Send an email to
engage-developers@google.com
and attach your integrated APK that is ready for testing by Google. - Google performs a verification and reviews internally to make sure the integration works as expected. If changes are needed, Google contacts you with any necessary details.
- When testing is complete and no changes are needed, Google contacts you to notify you that you can start publishing the updated and integrated APK to the Play Store.
- After Google has confirmed that your updated APK has been published to the Play Store, your Recommendation , Featured , and Continuation clusters may be published and visible to users.