Повысьте вовлеченность пользователей в приложение, взаимодействуя с ними там, где они находятся. Интегрируйте Engage SDK, чтобы предоставлять персонализированные рекомендации и дополнительный контент непосредственно пользователям на различных платформах устройства, таких как «Коллекции» , «Развлекательное пространство » и Play Store. Интеграция добавляет менее 50 КБ (в сжатом виде) к среднему размеру APK-файла и занимает у большинства приложений около недели на разработку. Узнайте больше на нашем корпоративном сайте .
В этом руководстве содержатся инструкции для партнеров-разработчиков по размещению контента из социальных сетей на платформах Engage.
Детали интеграции
В следующем разделе подробно описана интеграция.
Терминология
Кластеры рекомендаций отображают персонализированные предложения от конкретного разработчика-партнера.
Ваши рекомендации имеют следующую структуру:
Кластер рекомендаций : элемент пользовательского интерфейса, содержащий группу рекомендаций от одного и того же партнера-разработчика.
Каждый кластер рекомендаций состоит из одного из следующих двух типов сущностей:
- PortraitMediaEntity
- SocialPostEntity
Объект PortraitMediaEntity должен содержать одно портретное изображение для публикации. Метаданные, относящиеся к профилю и взаимодействию, являются необязательными.
Почта
- Изображение в портретном режиме и с отметкой времени, или
- Изображение в портретном режиме + текстовое содержимое и метка времени.
Профиль
- Аватар, имя или никнейм, дополнительное изображение.
Взаимодействия
- Только подсчет и маркировка, или
- Подсчет и визуальное отображение (значок)
SocialPostEntity содержит метаданные, относящиеся к профилю, публикации и взаимодействиям.
Профиль
- Аватар, имя или никнейм, дополнительный текст, дополнительное изображение.
Почта
- Текст и отметка времени, или
- Мультимедийные файлы (изображение или расширенный URL) и метка времени, или
- Текст и мультимедийные элементы (изображение или расширенный URL) и метка времени, или
- Предварительный просмотр видео (миниатюра и продолжительность) и отметка времени.
Взаимодействия
- Только подсчет и маркировка, или
- Подсчет и визуальное отображение (значок)
Предварительная работа
Минимальный уровень 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.12'
}
Краткое содержание
Данная архитектура основана на реализации привязанного сервиса .
Для различных типов кластеров объем данных, которые может публиковать клиент, ограничен следующими лимитами:
| Тип кластера | Границы кластера | Минимальное количество объектов в кластере | Максимальное количество объектов в кластере. |
|---|---|---|---|
| Кластер(ы) рекомендаций | Максимум 7 | По крайней мере 1 ( PortraitMediaEntity или SocialPostEntity ) | Максимум 50 ( PortraitMediaEntity или SocialPostEntity ) |
Шаг 1: Предоставьте данные сущности.
В SDK определены различные сущности для представления каждого типа элементов. SDK поддерживает следующие сущности для категории «Социальные сети»:
-
PortraitMediaEntity -
SocialPostEntity
Приведенные ниже диаграммы описывают доступные характеристики и требования для каждого типа.
PortraitMediaEntity
| Атрибут | Требование | Описание | Формат |
|---|---|---|---|
| URI действия | Требуется для всех поверхностей, кроме Google TV. | Прямая ссылка на сущность в приложении поставщика. Примечание: Для указания источника можно использовать прямые ссылки. См. этот раздел часто задаваемых вопросов. | URI |
| Платформенноспецифическое воспроизведение | Требуется для Google TV Surface | Глубокая ссылка на объект в приложении поставщика для таких платформ, как Google TV и мобильные устройства. | Список объектов PlatformSpecificPlayback |
| Рекомендация. Причина | Необязательный | Обоснование рекомендации данного контента пользователю. | Объект RecommendationReason |
| Сводка комментариев | Необязательный | Сводка комментариев к публикации. | Нить |
| Метаданные, относящиеся к публикации (обязательно) | |||
| Изображение(я) | Необходимый | Изображение(я) должны быть в портретном соотношении сторон. При наличии нескольких изображений пользовательский интерфейс может отображать только одно изображение. Однако интерфейс может визуально указывать на наличие других изображений в приложении. Если публикация представляет собой видео, поставщик должен предоставить миниатюру видео для отображения в виде изображения. | См. раздел «Технические характеристики изображения» для получения дополнительной информации. |
| Текстовое содержимое | Необязательный | Основной текст сообщения, обновления и т. д. | Строка (рекомендуемая максимальная длина 140 символов) |
| Отметка времени | Необязательный | Время публикации поста. | Временная метка эпохи в миллисекундах |
| Это видеоконтент | Необязательный | Это видео в этом посте? | логический |
| Продолжительность видео | Необязательный | Длительность видео в миллисекундах. | Длинный |
| Метаданные, относящиеся к профилю (необязательно) | |||
| Имя | Необходимый | Имя профиля, идентификатор или никнейм, например, "John Doe", "@TeamPixel" | Строка (рекомендуемая длина не более 25 символов) |
| Аватар | Необходимый | Фотография профиля или аватар пользователя. Квадратное изображение 1:1 | См. раздел «Технические характеристики изображения» для получения дополнительной информации. |
| Дополнительное изображение | Необязательный | Значок профиля. Например, значок подтверждения. Квадратное изображение 1:1 | См. раздел «Технические характеристики изображения» для получения дополнительной информации. |
| Метаданные, связанные с взаимодействиями (необязательно) | |||
| Считать | Необязательный | Укажите количество взаимодействий, например, "3,7 млн". Примечание: Если указаны и значение Count, и значение Count, будет использовано значение Count. Примечание: Партнерам следует использовать либо Count , либо CountWithOptionalLabel . | Нить |
| CountWithOptionalLabel | Необязательный | Укажите количество взаимодействий с помощью необязательной метки, например: "3,7 млн лайков". Примечание: Если указаны значения CountWithOptionalLabel и Count Value, будет использовано одно из них. Примечание: Партнерам следует использовать либо Count , либо CountWithOptionalLabel . | Нить |
| Значение счетчика | Необязательный | Количество взаимодействий в виде значения. Примечание: Если ваше приложение не обрабатывает логику оптимизации больших чисел для разных размеров экрана, вместо Count следует указывать Count Value. Если указаны и Count, и Count Value, используется Count. | Длинный |
| Этикетка | Необязательный | Укажите, для чего предназначена метка взаимодействия. Например, «Нравится». | Нить |
| Визуальный | Необязательный | Укажите, для чего предназначено это взаимодействие. Например: изображение со значком «Нравится», эмодзи. Можно предоставить более одного изображения, однако не все из них могут отображаться на всех форм-факторах. Примечание: Изображение должно быть квадратным, в масштабе 1:1. | См. раздел «Технические характеристики изображения» для получения дополнительной информации. |
| DisplayTimeWindow (необязательно) — задайте временной интервал для отображения контента на поверхности. | |||
| Отметка времени начала | Необязательный | Временная метка эпохи, после которой контент должен отображаться на поверхности. Если параметр не задан, контент может отображаться на поверхности. | Временная метка эпохи в миллисекундах |
| Отметка времени окончания | Необязательный | Временная метка эпохи, после которой контент больше не отображается на поверхности. Если параметр не задан, контент может отображаться на поверхности. | Временная метка эпохи в миллисекундах |
SocialPostEntity
| Атрибут | Требование | Описание | Формат |
|---|---|---|---|
| URI действия | Необходимый | Прямая ссылка на сущность в приложении поставщика. Примечание: Для указания источника можно использовать прямые ссылки. См. этот раздел часто задаваемых вопросов. | URI |
| URI воспроизведения, специфичные для платформы | Требуется для Google TV Surface | Глубокая ссылка на объект в приложении поставщика для таких платформ, как Google TV и мобильные устройства. | Список объектов PlatformSpecificPlayback |
| Рекомендация. Причина | Необязательный | Обоснование рекомендации данного контента пользователю. | Объект RecommendationReason |
| Сводка комментариев | Необязательный | Сводка комментариев к публикации. | Нить |
Метаданные, относящиеся к публикации (обязательно) Требуется наличие хотя бы одного из следующих элементов: TextContent, Image или WebContent. | |||
| Изображение(я) | Необязательный | Изображение(я) должны быть в портретном соотношении сторон. При наличии нескольких изображений пользовательский интерфейс может отображать только одно изображение. Однако интерфейс может визуально указывать на наличие других изображений в приложении. Если публикация представляет собой видео, поставщик должен предоставить миниатюру видео для отображения в виде изображения. | См. раздел «Технические характеристики изображения» для получения дополнительной информации. |
| Текстовое содержимое | Необязательный | Основной текст сообщения, обновления и т. д. | Строка (рекомендуемая максимальная длина 140 символов) |
| Видеоконтент (необязательно) | |||
| Продолжительность | Необходимый | Длительность видео в миллисекундах. | Длинный |
| Изображение | Необходимый | Предварительный просмотр изображения видеоконтента. | См. раздел «Технические характеристики изображения» для получения дополнительной информации. |
| Предварительный просмотр ссылки (необязательно) | |||
| Предварительный просмотр ссылки - Заголовок | Необходимый | Текст, указывающий на заголовок содержимого веб-страницы. | Нить |
| Предварительный просмотр ссылки - Имя хоста | Необходимый | Текст, указывающий на владельца веб-страницы, например, «ИНСАЙДЕР». | Нить |
| Предварительный просмотр ссылки - Изображение | Необязательный | Главное изображение для веб-контента | См. раздел «Технические характеристики изображения» для получения дополнительной информации. |
| Отметка времени | Необязательный | Время публикации поста. | Временная метка эпохи в миллисекундах |
| Метаданные, относящиеся к профилю (необязательно) | |||
| Имя | Необходимый | Имя профиля, идентификатор или никнейм, например, "John Doe", "@TeamPixel". | Строка (рекомендуемая длина не более 25 символов) |
| Дополнительный текст | Необязательный | Может использоваться в качестве идентификатора профиля, никнейма или дополнительных метаданных. Например, "@John-Doe", "5 млн подписчиков", "Вам может понравиться", "В тренде", "5 новых постов" | Строка (рекомендуемая длина не более 40 символов) |
| Аватар | Необходимый | Фотография профиля или аватар пользователя. Квадратное изображение 1:1 | См. раздел «Технические характеристики изображения» для получения дополнительной информации. |
| Дополнительное изображение | Необязательный | Например, значок профиля — значок подтверждения. Квадратное изображение 1:1 | См. раздел «Технические характеристики изображения» для получения дополнительной информации. |
| Метаданные, связанные с взаимодействиями (необязательно) | |||
| Считать | Необходимый | Укажите количество взаимодействий, например, "3,7 млн." Примечание: Партнерам следует использовать либо Count , либо CountWithOptionalLabel . | Нить |
| CountWithOptionalLabel | Необходимый | Укажите количество взаимодействий с помощью необязательной метки, например: "3,7 млн лайков". Примечание: Партнерам следует использовать либо Count , либо CountWithOptionalLabel . | Нить |
| Этикетка | Необязательный Если изображение не предоставлено, его необходимо предоставить. | Укажите, для чего предназначено это взаимодействие. Например, «Лайки». | Строка (рекомендуемая максимальная длина 20 символов для суммирования количества символов и метки) |
| Визуальный | Необязательный Если этикетка не предоставлена, ее необходимо предоставить. | Укажите, для чего предназначено это взаимодействие. Например: изображение со значком «Нравится», эмодзи. Можно предоставить более одного изображения, однако не все из них могут отображаться на всех форм-факторах. Квадратное изображение 1:1 | См. раздел «Технические характеристики изображения» для получения дополнительной информации. |
| DisplayTimeWindow (необязательно) — задайте временной интервал для отображения контента на поверхности. | |||
| Отметка времени начала | Необязательный | Временная метка эпохи, после которой контент должен отображаться на поверхности. Если параметр не задан, контент может отображаться на поверхности. | Временная метка эпохи в миллисекундах |
| Отметка времени окончания | Необязательный | Временная метка эпохи, после которой контент больше не отображается на поверхности. Если параметр не задан, контент может отображаться на поверхности. | Временная метка эпохи в миллисекундах |
Технические характеристики изображения
Изображения необходимо размещать на общедоступных CDN-сетях, чтобы Google мог получить к ним доступ.
Форматы файлов
PNG, JPG, статический GIF, WebP
Максимальный размер файла
5120 КБ
Дополнительные рекомендации
- Безопасная зона изображения: разместите важный контент в центральных 80% изображения.
- Используйте прозрачный фон, чтобы изображение корректно отображалось в темной и светлой темах оформления.
Шаг 2: Предоставьте данные кластера.
Рекомендуется запускать задачу публикации контента в фоновом режиме (например, с помощью WorkManager ) и планировать ее выполнение на регулярной основе или по событию (например, каждый раз, когда пользователь открывает приложение или когда пользователь подписывается на новую учетную запись).
AppEngageSocialClient отвечает за публикацию социальных кластеров.
Для публикации кластеров на стороне клиента доступны следующие API:
-
isServiceAvailable -
publishRecommendationClusters -
publishUserAccountManagementRequest -
updatePublishStatus -
deleteRecommendationsClusters -
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.
}
}
Java
client.isServiceAvailable().addOnCompleteListener(task - > {
if (task.isSuccessful()) {
// Handle success
if(task.getResult()) {
// Service is available on the device, proceed with content
// publish calls.
} else {
// Service is not available, no further action is needed.
}
} else {
// The IPC call itself fails, proceed with error handling logic here,
// such as retry.
}
});
publishRecommendationClusters
Этот API используется для публикации списка объектов RecommendationCluster .
Объект RecommendationCluster может иметь следующие атрибуты:
| Атрибут | Требование | Описание |
|---|---|---|
| Список объектов SocialPostEntity или PortraitMediaEntity | Необходимый | Список объектов, составляющих рекомендации для данного кластера рекомендаций. Объекты в одном кластере должны быть одного типа. |
| Заголовок | Необходимый | Заголовок для группы рекомендаций (например, «Последние новости от ваших друзей »). Рекомендуемый размер текста: менее 25 символов (слишком длинный текст может содержать многоточие). |
| Субтитры | Необязательный | Подзаголовок для кластера рекомендаций. |
| Action Uri | Необязательный | Прямая ссылка на страницу в партнерском приложении, где пользователи могут увидеть полный список рекомендаций. Примечание: Для указания источника можно использовать прямые ссылки. См. этот раздел часто задаваемых вопросов. |
Котлин
client.publishRecommendationClusters(
PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(
RecommendationCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.setTitle("Latest from your friends")
.build())
.build())
Java
client.publishRecommendationClusters(
new PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(
new RecommendationCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.setTitle("Latest from your friends")
.build())
.build());
После получения запроса сервисом в рамках одной транзакции выполняются следующие действия:
- Все существующие данные кластера рекомендаций удалены.
- Данные из запроса анализируются и сохраняются в новых кластерах рекомендаций.
В случае ошибки весь запрос отклоняется, и сохраняется текущее состояние.
publishUserAccountManagementRequest
Этот API используется для публикации карточки входа. Действие входа перенаправляет пользователей на страницу авторизации приложения, чтобы приложение могло опубликовать контент (или предоставить более персонализированный контент).
Следующие метаданные являются частью карточки входа в систему:
| Атрибут | Требование | Описание |
|---|---|---|
| Action 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());
Java
SignInCardEntity SIGN_IN_CARD_ENTITY =
new SignInCardEntity.Builder()
.addPosterImage(
new Image.Builder()
.setImageUri(Uri.parse("http://www.x.com/image.png"))
.setImageHeightInPixel(500)
.setImageWidthInPixel(500)
.build())
.setActionText("Sign In")
.setActionUri(Uri.parse("http://xx.com/signin"))
.build();
client.publishUserAccountManagementRequest(
new PublishUserAccountManagementRequest.Builder()
.setSignInCardEntity(SIGN_IN_CARD_ENTITY)
.build());
После получения запроса сервисом в рамках одной транзакции выполняются следующие действия:
- Существующие данные
UserAccountManagementClusterот партнера-разработчика удаляются. - Данные из запроса анализируются и сохраняются в обновленном кластере UserAccountManagementCluster.
В случае ошибки весь запрос отклоняется, и сохраняется текущее состояние.
updatePublishStatus
Если по каким-либо внутренним причинам ни один из кластеров не опубликован, мы настоятельно рекомендуем обновить статус публикации с помощью API updatePublishStatus . Это важно, потому что:
- Указание статуса во всех сценариях, даже когда контент опубликован (STATUS == PUBLISHED), имеет решающее значение для заполнения панелей мониторинга, которые используют этот явный статус для отображения состояния и других показателей вашей интеграции.
- Если контент не опубликован, но статус интеграции не нарушен (STATUS == NOT_PUBLISHED), Google может избежать срабатывания оповещений на панелях мониторинга состояния приложения. Это подтверждает, что контент не опубликован из-за ожидаемой ситуации с точки зрения поставщика.
- Это помогает разработчикам получать информацию о том, когда данные публикуются, а когда нет.
- Google может использовать коды состояния, чтобы подтолкнуть пользователя к выполнению определенных действий в приложении, чтобы он мог увидеть контент приложения или обойти его ограничения.
Список допустимых кодов статуса публикации:
// Content is published
AppEngagePublishStatusCode.PUBLISHED,
// Content is not published as user is not signed in
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN,
// Content is not published as user is not subscribed
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SUBSCRIPTION,
// Content is not published as user location is ineligible
AppEngagePublishStatusCode.NOT_PUBLISHED_INELIGIBLE_LOCATION,
// Content is not published as there is no eligible content
AppEngagePublishStatusCode.NOT_PUBLISHED_NO_ELIGIBLE_CONTENT,
// Content is not published as the feature is disabled by the client
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_FEATURE_DISABLED_BY_CLIENT,
// Content is not published as the feature due to a client error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_CLIENT_ERROR,
// Content is not published as the feature due to a service error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_SERVICE_ERROR,
// Content is not published due to some other reason
// Reach out to engage-developers@ before using this enum.
AppEngagePublishStatusCode.NOT_PUBLISHED_OTHER
Если контент не публикуется из-за того, что пользователь не авторизован, Google рекомендует опубликовать карточку входа. Если по какой-либо причине поставщики не могут опубликовать карточку входа, мы рекомендуем вызвать API updatePublishStatus со статусом NOT_PUBLISHED_REQUIRES_SIGN_IN.
Котлин
client.updatePublishStatus(
PublishStatusRequest.Builder()
.setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
.build())
Java
client.updatePublishStatus(
new PublishStatusRequest.Builder()
.setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
.build());
deleteRecommendationClusters
Этот API используется для удаления содержимого кластеров рекомендаций.
Котлин
client.deleteRecommendationClusters()
Java
client.deleteRecommendationClusters();
Когда сервис получает запрос, он удаляет существующие данные из кластеров рекомендаций. В случае ошибки весь запрос отклоняется, и сохраняется текущее состояние.
deleteUserManagementCluster
Этот API используется для удаления содержимого кластера UserAccountManagement.
Котлин
client.deleteUserManagementCluster()
Java
client.deleteUserManagementCluster();
Когда служба получает запрос, она удаляет существующие данные из кластера UserAccountManagement. В случае ошибки весь запрос отклоняется, и сохраняется существующее состояние.
deleteClusters
Этот API используется для удаления содержимого кластера определенного типа.
Котлин
client.deleteClusters(
DeleteClustersRequest.Builder()
.addClusterType(ClusterType.TYPE_RECOMMENDATION)
...
.build())
Java
client.deleteClusters(
new DeleteClustersRequest.Builder()
.addClusterType(ClusterType.TYPE_RECOMMENDATION)
...
.build());
Когда сервис получает запрос, он удаляет существующие данные из всех кластеров, соответствующих указанным типам кластеров. Клиенты могут указать один или несколько типов кластеров. В случае ошибки весь запрос отклоняется, и сохраняется текущее состояние.
Обработка ошибок
Настоятельно рекомендуется отслеживать результаты выполнения задачи через API публикации, чтобы иметь возможность предпринять дальнейшие действия для восстановления и повторной отправки успешно выполненной задачи.
client.publishRecommendationClusters(
new PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(...)
.build())
.addOnCompleteListener(
task -> {
if (task.isSuccessful()) {
// do something
} else {
Exception exception = task.getException();
if (exception instanceof AppEngageException) {
@AppEngageErrorCode
int errorCode = ((AppEngageException) exception).getErrorCode();
if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
// do something
}
}
}
});
В результате возникает ошибка, которая возвращается как AppEngageException , при этом причина ошибки указывается в виде кода ошибки.
| Код ошибки | Название ошибки | Примечание |
|---|---|---|
1 | SERVICE_NOT_FOUND | Данная услуга недоступна на указанном устройстве. |
2 | SERVICE_NOT_AVAILABLE | Услуга доступна на данном устройстве, но недоступна в момент звонка (например, она явно отключена). |
3 | SERVICE_CALL_EXECUTION_FAILURE | Выполнение задачи завершилось с ошибкой из-за проблем с многопоточностью. В этом случае можно повторить попытку. |
4 | SERVICE_CALL_PERMISSION_DENIED | Звонившему не разрешается вызывать специалиста для оказания услуги. |
5 | SERVICE_CALL_INVALID_ARGUMENT | Запрос содержит недопустимые данные (например, большее количество кластеров, чем разрешено). |
6 | SERVICE_CALL_INTERNAL | На стороне сервиса произошла ошибка. |
7 | SERVICE_CALL_RESOURCE_EXHAUSTED | Вызов сервисной службы происходит слишком часто. |
Шаг 3: Обработка широковещательных намерений
Помимо выполнения вызовов API для публикации контента через задание, также необходимо настроить BroadcastReceiver для приема запросов на публикацию контента.
Основная цель широковещательных интентов — повторная активация приложения и принудительная синхронизация данных. Широковещательные интенты не предназначены для частой отправки. Они срабатывают только тогда, когда служба Engage определяет, что контент может быть устаревшим (например, недельной давности). Таким образом, обеспечивается большая уверенность в том, что пользователь получит актуальный контент, даже если приложение долгое время не запускалось.
Для настройки BroadcastReceiver необходимо использовать два следующих способа:
Динамически зарегистрируйте экземпляр класса
BroadcastReceiverс помощьюContext.registerReceiver(). Это позволит осуществлять связь с приложениями, которые всё ещё находятся в оперативной памяти.
Котлин
class AppEngageBroadcastReceiver : BroadcastReceiver(){
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION
// 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)
}
Java
class AppEngageBroadcastReceiver extends BroadcastReceiver {
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION 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);
}
В файле
AndroidManifest.xmlстатически объявите реализацию с помощью тега<receiver>. Это позволит приложению получать широковещательные интенты, когда оно не запущено, а также позволит приложению публиковать контент.
<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>
</receiver>
</application>
Сервис отправит следующие намерения :
-
com.google.android.engage.action.PUBLISH_RECOMMENDATIONРекомендуется инициировать вызовpublishRecommendationClustersпри получении этого намерения.
Рабочий процесс интеграции
Пошаговое руководство по проверке интеграции после ее завершения см. в разделе «Рабочий процесс интеграции для разработчиков Engage» .
Часто задаваемые вопросы
Часто задаваемые вопросы по Engage SDK можно найти в разделе "Часто задаваемые вопросы".
Контакт
Если у вас возникнут вопросы в процессе интеграции, обращайтесь по адресу engage-developers@google.com . Наша команда ответит вам в кратчайшие сроки.
Следующие шаги
После завершения интеграции ваши дальнейшие действия будут следующими:
- Отправьте электронное письмо на адрес
engage-developers@google.comи прикрепите к нему свой интегрированный APK-файл, готовый к тестированию компанией Google. - Google проводит внутреннюю проверку и анализ, чтобы убедиться, что интеграция работает должным образом. Если потребуются изменения, Google свяжется с вами и предоставит всю необходимую информацию.
- После завершения тестирования и если никаких изменений не потребуется, Google свяжется с вами, чтобы уведомить о возможности публикации обновленного и интегрированного APK-файла в Play Store.
- После того, как Google подтвердит публикацию вашего обновленного APK-файла в Play Store, ваши рекомендации и кластеры будут опубликованы и видны пользователям.