Повысьте вовлеченность приложения, охватывая пользователей там, где они находятся. Интегрируйте Engage SDK, чтобы доставлять персонализированные рекомендации и контент для продолжения напрямую пользователям через несколько поверхностей на устройстве, таких как Collections , Entertainment Space и 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.
Кластер Featured демонстрирует выборку сущностей от нескольких партнеров-разработчиков в одной группе пользовательского интерфейса. Будет один кластер Featured, который будет отображаться в верхней части пользовательского интерфейса с приоритетным размещением над всеми кластерами Recommendation. Каждому партнеру-разработчику будет разрешено транслировать до 10 сущностей в кластере Featured.
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 | Необходимый | Глубокая ссылка на сущность в приложении провайдера. Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ | Ури |
Изображения постеров | Необходимый | Мы покажем только 1 изображение, если предоставлено несколько изображений. Рекомендуемое соотношение сторон 16:9 Примечание: Если вы используете значок, пожалуйста, обеспечьте безопасное пространство в 24 dps сверху и снизу изображения. | Инструкции см. в разделе «Характеристики изображения» . |
Заголовок | Необязательный | Название организации. | Свободный текст Рекомендуемый размер текста: 50 символов. |
Описание | Необязательный | Один абзац текста, описывающий сущность. Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба варианта одновременно. | Свободный текст Рекомендуемый размер текста: 180 символов. |
Список субтитров | Необязательный | До 3 субтитров, каждый из которых представляет собой отдельную строку текста. Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба варианта одновременно. | Свободный текст Рекомендуемый размер текста для каждого субтитра: максимум 50 символов. |
Значки | Необязательный | Каждый значок представляет собой либо свободный текст (максимум 15 символов), либо небольшое изображение. Специальная обработка UX поверх изображения/видео, например, наложение значка на изображение
| |
Значок - Текст | Необязательный | Название значка Примечание: для значка требуется текст или изображение. | Свободный текст Рекомендуемый размер текста: максимум 15 символов. |
Значок - Изображение | Необязательный | Маленькое изображение Специальная обработка UX, например, наложение значка на миниатюру изображения/видео. Примечание: для значка требуется текст или изображение. | Инструкции см. в разделе «Характеристики изображения» . |
Категории контента | Необязательный | Опишите категорию контента в сущности. | Список перечислений Инструкции см. в разделе «Категория контента» . |
ArticleEntity
Атрибут | Требование | Описание | Формат |
---|---|---|---|
Действие Uri | Необходимый | Глубокая ссылка на сущность в приложении провайдера. Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ | Ури |
Заголовок | Необходимый | Название организации. | Свободный текст Рекомендуемый размер текста: максимум 50 символов. |
Изображения постеров | Необязательный | Мы покажем только 1 изображение, если предоставлено несколько изображений. Рекомендуемое соотношение сторон 16:9 Примечание: Изображение настоятельно рекомендуется. Если предоставляется значок, пожалуйста, обеспечьте безопасное пространство в 24 dps сверху и снизу изображения | Инструкции см. в разделе «Характеристики изображения» . |
Источник - Название | Необязательный | Имя автора, организации или репортера | Свободный текст Рекомендуемый размер текста: менее 25 символов. |
Источник - Изображение | Необязательный | Изображение источника, например автора, организации, репортера | Инструкции см. в разделе «Характеристики изображения» . |
Описание | Необязательный | Один абзац текста, описывающий сущность. Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба варианта одновременно. | Свободный текст Рекомендуемый размер текста: 180 символов. |
Список субтитров | Необязательный | До 3 субтитров, каждый из которых представляет собой отдельную строку текста. Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба варианта одновременно. | Свободный текст Рекомендуемый размер текста для каждого субтитра: максимум 50 символов. |
Значки | Необязательный | Каждый значок представляет собой либо свободный текст (максимум 15 символов), либо небольшое изображение. Специальная обработка UX поверх изображения/видео, например, наложение значка на изображение
| |
Значок - Текст | Необязательный | Название значка Примечание: для значка требуется текст или изображение. | Свободный текст Рекомендуемый размер текста: максимум 15 символов. |
Значок - Изображение | Необязательный | Маленькое изображение Специальная обработка UX, например, наложение значка на миниатюру изображения/видео. Примечание: для значка требуется текст или изображение. | Инструкции см. в разделе «Характеристики изображения» . |
Время публикации контента | Необязательный | Это временная метка эпохи в миллисекундах, когда контент был опубликован/обновлен в приложении. | Временная метка эпохи в миллисекундах |
Время последнего участия | Условно требуется | Временная метка эпохи в миллисекундах, когда пользователь взаимодействовал с этой сущностью в последний раз. Примечание: это поле обязательно, если данная сущность является частью кластера продолжения. | Временная метка эпохи в миллисекундах |
Процент прогресса | Условно требуется | Процент всего контента, потребленного пользователем на сегодняшний день. Примечание: это поле обязательно, если данная сущность является частью кластера продолжения. | Целое число от 0 до 100 включительно. |
Категории контента | Необязательный | Опишите категорию контента в сущности. | Список перечислений Инструкции см. в разделе «Категория контента» . |
PersonEntity
Атрибут | Требование | Описание | Формат |
---|---|---|---|
Действие Uri | Необходимый | Глубокая ссылка на сущность в приложении провайдера. Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ | Ури |
Профиль - Имя | Необходимый | Имя профиля, идентификатор или никнейм, например, «John Doe», «@TeamPixel» и т. д. | Нить Рекомендуемый размер текста: максимум 50 символов. |
Профиль - Аватар | Необходимый | Изображение профиля или аватара пользователя. Примечание: изображение должно быть квадратным и иметь соотношение сторон 1:1. | Инструкции см. в разделе «Характеристики изображения» . |
Профиль - Дополнительный текст | Необязательный | Свободный текст, например, имя пользователя профиля. | Свободный текст Рекомендуемый размер текста: максимум 15 символов. |
Профиль - Дополнительное изображение | Необязательный | Небольшое изображение, похожее на значок подтверждения. | Инструкции см. в разделе «Характеристики изображения» . |
Изображение заголовка | Необязательный | Мы покажем только 1 изображение, если предоставлено несколько изображений. Рекомендуемое соотношение сторон 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 | Необходимый | Глубокая ссылка на сущность в приложении провайдера. Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ | Ури |
Заголовок | Необходимый | Название организации. | Нить Рекомендуемый размер текста: максимум 50 символов. |
Время начала | Необходимый | Метка времени эпохи, когда ожидается начало события. Примечание: значение будет указано в миллисекундах. | Временная метка эпохи в миллисекундах |
Режим события | Необходимый | Поле для указания того, будет ли мероприятие виртуальным, очным или и тем, и другим. | Перечисление: VIRTUAL, IN_PERSON или HYBRID |
Изображения постеров | Необходимый | Мы покажем только 1 изображение, если предоставлено несколько изображений. Рекомендуемое соотношение сторон 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 | Необходимый | Глубокая ссылка на сущность в приложении провайдера. Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ | Ури |
Заголовок | Необходимый | Название организации. | Нить Рекомендуемый размер текста: максимум 50 символов. |
Время начала | Необходимый | Метка времени эпохи, когда ожидается начало события. Примечание: значение будет указано в миллисекундах. | Временная метка эпохи в миллисекундах |
Режим события | Необходимый | Поле для указания того, будет ли мероприятие виртуальным, очным или и тем, и другим. | Перечисление: VIRTUAL, IN_PERSON или HYBRID |
Местоположение - Страна | Условно требуется | Страна, в которой происходит событие. Примечание: это необходимо для событий IN_PERSON или HYBRID. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - Город | Условно требуется | Город, в котором происходит событие. Примечание: это необходимо для событий IN_PERSON или HYBRID. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - Отображение адреса | Условно требуется | Адрес или название места проведения мероприятия, которое должно отображаться пользователю. Примечание: это необходимо для событий IN_PERSON или HYBRID. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - почтовый адрес | Необязательный | Почтовый адрес (если применимо) места проведения мероприятия. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - Штат | Необязательный | Штат или провинция (если применимо), в которой проводится мероприятие. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Местоположение - почтовый индекс | Необязательный | Почтовый индекс (если применимо) места проведения мероприятия. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Расположение - Район | Необязательный | Район (если применимо), в котором проводится мероприятие. | Свободный текст Рекомендуемый размер текста: максимум ~20 символов. |
Изображения постеров | Необязательный | Мы покажем только 1 изображение, если предоставлено несколько изображений. Рекомендуемое соотношение сторон 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 , только подмножество этих категорий имеют право. Проверьте список категорий, имеющих право на тип сущности, прежде чем заполнять список.
Используйте определенный тип сущности для некоторых категорий контента вместо комбинации общих сущностей и 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 рекомендует опубликовать Sign In Card. Если по какой-либо причине поставщики не могут опубликовать Sign In Card, мы рекомендуем вызвать API updatePublishStatus с кодом статуса NOT_PUBLISHED_REQUIRES_SIGN_IN
Котлин
client.updatePublishStatus( PublishStatusRequest.Builder() .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN) .build())
Ява
client.updatePublishStatus( new PublishStatusRequest.Builder() .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN) .build());
deleteRecommendationClusters
Этот API используется для удаления содержимого кластеров рекомендаций.
Котлин
client.deleteRecommendationClusters()
Ява
client.deleteRecommendationClusters();
Когда служба получает запрос, она удаляет существующие данные из Recommendation Clusters. В случае ошибки весь запрос отклоняется, а существующее состояние сохраняется.
deleteFeaturedCluster
Этот API используется для удаления содержимого Featured Cluster.
Котлин
client.deleteFeaturedCluster()
Ява
client.deleteFeaturedCluster();
Когда служба получает запрос, она удаляет существующие данные из Featured Cluster. В случае ошибки весь запрос отклоняется, а существующее состояние сохраняется.
deleteContinuationCluster
Этот API используется для удаления содержимого Continuation Cluster.
Котлин
client.deleteContinuationCluster()
Ява
client.deleteContinuationCluster();
Когда служба получает запрос, она удаляет существующие данные из Continuation Cluster. В случае ошибки весь запрос отклоняется, а существующее состояние сохраняется.
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 } } } });
Ошибка возвращается как AppEngageException
с причиной, включенной в качестве кода ошибки.
Код ошибки | Имя ошибки | Примечание |
---|---|---|
1 | SERVICE_NOT_FOUND | Сервис недоступен на данном устройстве. |
2 | SERVICE_NOT_AVAILABLE | Служба доступна на данном устройстве, но он недоступен во время вызова (например, он явно отключен). |
3 | SERVICE_CALL_EXECUTION_FAILURE | Выполнение задачи не удалось из -за проблем с потоком. В этом случае его можно повторно. |
4 | SERVICE_CALL_PERMISSION_DENIED | Вызывающему не разрешено совершать сервисный звонок. |
5 | SERVICE_CALL_INVALID_ARGUMENT | Запрос содержит неверные данные (например, больше, чем разрешенное количество кластеров). |
6 | SERVICE_CALL_INTERNAL | Есть ошибка на стороне службы. |
7 | SERVICE_CALL_RESOURCE_EXHAUSTED | Сервисный звонок выполняется слишком часто. |
Шаг 3: Обработка вещания
В дополнение к созданию вызовов API публикации контента через работу, также необходимо настроить BroadcastReceiver
для получения запроса на публикацию контента.
Целью вещательных намерений является в основном для реактивации приложений и принуждения синхронизации данных. Намерения вещания не предназначены для того, чтобы отправляться очень часто. Это запускается только тогда, когда служба Engage определяет, что содержание может быть несвежим (например, неделя). Таким образом, есть больше уверенности в том, что пользователь может иметь новый опыт контента, даже если приложение не выполнялось в течение длительного периода времени.
BroadcastReceiver
должен быть настроен следующим двумя способами:
- Динамически зарегистрируйте экземпляр класса
BroadcastReceiver
с использованиемContext.registerReceiver()
. Это позволяет общаться из приложений, которые все еще живут в памяти.
Котлин
class AppEngageBroadcastReceiver : BroadcastReceiver(){ // Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast // is received // Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received // Trigger 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)) // Register Featured Cluster Publish Intent context.registerReceiver(AppEngageBroadcastReceiver(), IntentFilter(Intents.ACTION_PUBLISH_FEATURED)) // Register Continuation Cluster Publish Intent context.registerReceiver(AppEngageBroadcastReceiver(), IntentFilter(Intents.ACTION_PUBLISH_CONTINUATION)) }
Ява
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)); // Register Featured Cluster Publish Intent context.registerReceiver(new AppEngageBroadcastReceiver(), new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED)); // Register Continuation Cluster Publish Intent context.registerReceiver(new AppEngageBroadcastReceiver(), new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_CONTINUATION)); }
- Статически объявить реализацию с помощью тега
<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.PUBLISH_CONTINUATION" />
</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.PUBLISH_CONTINUATION
Рекомендуется начать вызовpublishContinuationCluster
при получении этого намерения.
Интеграционный рабочий процесс
Для пошагового руководства по проверке вашей интеграции после ее завершения см. Рабочий процесс интеграции разработчика Engage .
Часто задаваемые вопросы
См. Engage SDK часто задают вопросы о часто задаваемых вопросах.
Контакт
Свяжитесь с Engage-developers@google.com , если есть какие-либо вопросы в процессе интеграции.
Следующие шаги
После завершения этой интеграции ваши следующие шаги следующие:
- Отправьте электронное письмо на engage-developers@google.com и прикрепите свой интегрированный APK, который готов к тестированию Google.
- Google выполняет проверку и обзоры внутренне, чтобы убедиться, что интеграция работает, как и ожидалось. Если необходимы изменения, Google связывается с вами с любыми необходимыми деталями.
- Когда тестирование завершено, и никаких изменений не требуется, Google связывается с вами, чтобы уведомить вас, что вы можете начать публиковать обновленный и интегрированный APK в магазин Play.
- После того, как Google подтвердил, что ваш обновленный APK был опубликован в Play Store, ваша рекомендация , представленные и продолжительные кластеры могут быть опубликованы и видимы для пользователей.