Контекст экранов и события Android
PageContext
PageContext описывает, где находится пользователь в приложении и в каком бизнес-контексте выполняется запрос.
Этот объект используется во всех основных интеграционных вызовах:
для передачи просмотров экранов;trackView(...) для передачи пользовательских действий;triggerEvent(...)getContentBySelector(...)для ручного получения контента.
Корректное заполнение PageContext влияет и на аналитику, и на подбор контента, и на активацию кампаний.
Поля PageContext
Бизнес-логика заполнения PageContext соответствует Page context.
Рекомендуемая схема:
HOMEPAGE:data = emptyList().PRODUCT: вdataпередается SKU товара ровно как в товарном фиде, без нормализации и с тем же регистром.CART: вdataпередаются SKU всех товаров, находящихся в корзине, ровно как в товарном фиде, без нормализации и с тем же регистром.CATEGORY: вdataпередается полная иерархия категорий от самой широкой до самой узкой ровно как в товарном фиде, без нормализации и с тем же регистром.SEARCH: вdataпередается поисковый запрос одной строкой. Для пустого поиска передается пустой список.OTHER: используется только для экранов, которые не подходят под остальные типы, например для статических страниц или категорий, не включенных в товарный фид.
Для любых значений в PageContext, которые должны матчиться с товарным фидом, действует единое правило: передавайте их идентично фиду. Нельзя менять написание, переименовывать значения или приводить их к upper/lower case.
lng используется в первую очередь для мультирегиональности. Это позволяет отдавать пользователю корректные региональные данные по товарам: цены, доступность и остатки.
Например, если пользователь находится в Новосибирске, значение lng может использоваться для того, чтобы в рекомендациях участвовали только товары, реально доступные для Новосибирска.
Важно:
- значения
lngв контексте и в товарном фиде должны совпадать полностью, включая регистр; lng, как и любые другие feed-derived значения, нужно передавать без преобразования к upper/lower case;lngнужно передавать только если проект использует региональные варианты данных в фиде.
utm и attributes технически не обязательны. Передавайте их, если эти поля используются в правилах таргетинга или аналитике вашего проекта.
Дополнительно:
- SDK автоматически дополняет
attributesслужебными значениямиapp_version,sdk_versionиapp_platform(android); при совпадении ключей служебное значение заменяет переданное приложением; sdk_versionберётся из строкового ресурса AAR, для1.0.4это"1.0.4";pageNumber,referrerиutmсохраняются при сборке запросов;- блок
deviceформируется самим SDK, вручную его заполнять не нужно.
Настройка кампаний по этим значениям описана в разделе Таргетинг SDK-кампаний по платформе и версиям.
См. также:
trackView(...)triggerEvent(...)getContentBySelector(...)
Отслеживание просмотров экранов
trackView(...)
Метод отправляет событие просмотра экрана. В Android SDK этот вызов асинхронный, но сам метод не является suspend.
Для trackView(...) требуется корректно заполненный PageContext
Пример:
GravitySDK.instance.trackView(
pageContext = PageContext(
type = ContextType.PRODUCT,
data = listOf("product-sku-123"),
location = "app://product/123",
),
activityContext = this,
)
trackView(...) выполняет две задачи:
- передает в Gravity Field информацию о просмотре экрана;
- может инициировать загрузку и показ кампании, если для этого контекста настроен соответствующий сценарий.
Если для переданного контекста настроена in-app-кампания, SDK может сразу после запроса загрузить и показать ее.
Трекинг событий
События описывают действия пользователя: покупку, добавление в корзину, авторизацию и другие сценарии, которые должны попадать в аналитику или запускать кампании.
Бизнес-логика заполнения событий соответствует Настройке передачи событий, а Android SDK предоставляет типы и методы для их отправки.
Для e-commerce сценариев события PurchaseEvent и AddToCartEvent обязательны. Дополнительно рекомендуется внедрять остальные релевантные преднастроенные события, которые поддерживаются вашим сценарием интеграции.
Для всех полей событий, которые должны матчиться с товарным фидом, действует то же правило, что и для PageContext: передавайте значения идентично фиду. Это относится к productId, cart[*].productId и другим feed-derived значениям. Регистр является частью значения.
triggerEvent(...)
В Android SDK этот вызов асинхронный, но сам метод не является suspend.
Для triggerEvent(...) требуется корректно заполненный PageContext
triggerEvent(...) выполняет две задачи:
- передает в Gravity Field пользовательские действия для аналитики, сегментации и построения профиля;
- может инициировать загрузку и показ кампании, если событие используется как триггер в настройках платформы.
Пример:
GravitySDK.instance.triggerEvent(
events = listOf(
AddToCartEvent(
value = 1500.0,
productId = "sku-abc-1",
quantity = 1,
currency = "RUB",
)
),
pageContext = PageContext(
type = ContextType.PRODUCT,
data = listOf("sku-abc-1"),
location = "app://product/sku-abc-1",
),
activityContext = this,
)
Покупка (PurchaseEvent)
Отправляется после успешного завершения заказа.
val purchaseEvent = PurchaseEvent(
uniqueTransactionId = "ORDER-12345",
value = 2550.75,
currency = "RUB",
cart = listOf(
CartItem(productId = "sku-123", quantity = 1, itemPrice = 100.50),
CartItem(productId = "sku-456", quantity = 2, itemPrice = 1225.125),
),
)
Правила заполнения:
uniqueTransactionIdдолжен быть уникальным для каждой покупки.value- полная сумма заказа.currencyопциональна, но обязательна для мультивалютных проектов.cartсодержит фактический состав заказа.- каждый
cart[*].productIdдолжен совпадать со SKU в товарном фиде полностью, включая регистр. - товары в
cartрекомендуется передавать в порядке добавления: от самых старых к самым новым. - каждый
CartItem.itemPrice- стоимость одной единицы товара после применения скидок.
Добавление в корзину (AddToCartEvent)
Отправляйте событие в момент фактического добавления товара в корзину.
val addToCartEvent = AddToCartEvent(
value = 1500.0,
productId = "sku-abc-1",
quantity = 1,
currency = "RUB",
)
Правила заполнения:
value- сумма, добавляемая в корзину этим действием. Если добавляется несколько единиц одного товара, передаетсяquantity * itemPrice.quantity- количество единиц, добавленных именно этим действием, а не итоговое количество товара в корзине.productIdдолжен совпадать со SKU в товарном фиде полностью, включая регистр.currencyопциональна, но обязательна для мультивалютных проектов.cart, если передается, должен содержать актуальное состояние корзины, включая только что добавленный товар. Всеcart[*].productIdдолжны совпадать со SKU в товарном фиде полностью, включая регистр. Товары рекомендуется передавать в порядке добавления: от самых старых к самым новым.
Удаление из корзины (RemoveFromCartEvent) и синхронизация корзины (SyncCartEvent)
RemoveFromCartEventотправляйте в момент удаления товара из корзины или уменьшения количества.valueвRemoveFromCartEvent- сумма удаляемых единиц товара.quantityвRemoveFromCartEvent- количество единиц, удаленных этим действием.productIdвRemoveFromCartEventдолжен совпадать со SKU в товарном фиде полностью, включая регистр.SyncCartEventиспользуйте, когда нужно передать актуальное состояние корзины целиком: например, при пакетном изменении корзины, очистке корзины, объединении корзин после логина или серверном обновлении состава корзины.- в Android SDK
SyncCartEventтакже требуетvalue, поэтому передавайте общую стоимость актуального состава корзины. cartвSyncCartEventдолжен содержать полное текущее состояние корзины. Всеcart[*].productIdдолжны совпадать со SKU в товарном фиде полностью, включая регистр.- товары в
cartдляRemoveFromCartEventиSyncCartEventрекомендуется передавать в порядке добавления: от самых старых к самым новым. currencyдляRemoveFromCartEventиSyncCartEventопциональна, но обязательна для мультивалютных проектов.
Авторизация
Формирование CUID и пример LoginEvent — в Идентификации пользователя.
Добавление в избранное (AddToWishlistEvent)
val addToWishlistEvent = AddToWishlistEvent(
value = 1500.0,
productId = "sku-abc-1",
)
productId должен совпадать со SKU в товарном фиде полностью, включая регистр.
Кастомное событие (CustomEvent)
val customEvent = CustomEvent(
type = "survey-completed-v1",
name = "Survey completed",
customProps = mapOf(
"surveyId" to "summer-2025-feedback",
"rating" to "5",
),
)
Параметры всех типов событий собраны в справочнике API. При ошибке сети SDK не сохраняет событие в очередь: см. Сеть и жизненный цикл.