Condition - Динамические условия для срабатывания сообщения
Данный документ описывает все доступные поля, которые можно использовать в условиях для отображения сообщений с использованием JsonLogic.
JsonLogic
JsonLogic — это язык для создания переносимых, сериализуемых правил, которые можно выполнять в различных языках программирования. В контексте условий показа сообщений, JsonLogic позволяет создавать сложные условия, которые можно легко передавать между клиентом и сервером в формате JSON.
Основные особенности JsonLogic:
- Правила представлены в виде JSON объектов
- Поддерживает логические операторы (
and
,or
,not
), операторы сравнения (>
,>=
,<
,<=
,==
,!=
), арифметические операции и другие функции - Позволяет обращаться к данным через оператор
var
- Поддерживает вложенные правила для создания сложных условий
Для доступа к данным в контексте используется оператор var
. Например, {"var": "app.version"}
извлекает значение версии приложения из контекста условия.
Более подробную информацию о синтаксисе и возможностях JsonLogic можно найти на официальном сайте: http://jsonlogic.com
Содержание
- Condition - Динамические условия для срабатывания сообщения
- JsonLogic
- Содержание
- Обзор
- Структура контекста условий
- Event Properties
- Context Properties
- Interactions
- Примеры использования JsonLogic
- Пример 1: Показать сообщение только подписчикам на iOS
- Пример 2: Показать сообщение только в темной теме с достаточной шириной экрана
- Пример 3: Показать сообщение только если разрешение на камеру предоставлено
- Пример 4: Показать сообщение только если пользователь не видел сообщение сегодня и уведомления отключены
- Пример 5: Сложное условие с версией приложения и событиями (из примера)
Обзор
Контекст условий предоставляет богатый набор данных, которые можно использовать для создания условной логики отображения сообщений. Он содержит информацию о текущем событии, состоянии приложения, профиле пользователя, настройках устройства и предыдущих взаимодействиях.
Структура контекста условий
{
'event': {
...properties,
'event_name': event,
},
'palette': palette.convert().toJson(),
'app': application.toJson(),
'user': user.toJson(),
'subscription': subscription.toJson(),
'permissions': permissions.toJson(),
'media': media.toJson(),
'feature_flags': featureFlags,
'config': config,
'theme': theme.convert().toJson(),
'interactions': {
'last_seen': context.interactions.seenEntries.lastOrNull?.toJson(),
'seen_entries': context.interactions.seenEntries.map((e) => e.toJson()).toList(),
}
};
Event Properties
Объект event
содержит информацию о событии, которое привело к оценке условия:
Поле | Тип | Описание |
---|---|---|
event_name | String | Название выполненного события |
properties | Object | Дополнительные свойства, переданные вместе с событием |
Context Properties
Palette
Объект palette
содержит переменные цветов для разных тем:
Поле | Тип | Описание |
---|---|---|
brand | Object | Цветовые переменные бренда |
light | Object | Цветовые переменные светлой темы |
dark | Object | Цветовые переменные темной темы |
App
Объект app
предоставляет информацию о приложении:
Поле | Тип | Описание |
---|---|---|
theme | String | Текущая тема приложения |
language | String | Текущий язык приложения |
version | String | Версия приложения |
platform | String | Платформа, на которой работает приложение |
divkit_version | String | Текущая версия DivKit |
widgets_version | String | Текущая версия Widgets |
build_type | String | Тип сборки (Production, ReleaseCandidate и т.д.) |
build_mode | String | Режим сборки (release, profile или debug) |
api_base_url | String | Базовый URL для API-запросов |
has_connection | Boolean | Указывает, имеет ли приложение активное интернет-соединение |
User
Объект user
содержит информацию о профиле пользователя:
Поле | Тип | Описание |
---|---|---|
is_logged_in | Boolean | Указывает, авторизован ли пользователь |
id | String | ID пользователя (null, если не авторизован) |
name | String | Имя пользователя (null, если не задано) |
avatar | String | URL аватара пользователя (null, если не задан) |
birthday | DateTime | Дата рождения пользователя (null, если не задана) |
is_adult | Boolean | Указывает, является ли пользователь совершеннолетним (null, если неизвестно) |
has_referral_id | Boolean | Указывает, имеет ли пользователь реферальный ID (null, если неизвестно) |
contacts | Object | Карта контактов пользователя (пары ключ-значение) |
Subscription
Объект subscription
предоставляет информацию о статусе подписки пользователя:
Поле | Тип | Описание |
---|---|---|
is_active | Boolean | Указывает, имеет ли пользователь активную подписку |
has_been_subscribed | Boolean | Указывает, была ли у пользователя подписка в прошлом |
is_external | Boolean | Указывает, управляется ли подписка извне (null, если не применимо) |
tariff | Object | Информация о тарифе подписки (null, если нет подписки) |
Permissions
Объект permissions
содержит статус различных разрешений устройства:
Поле | Тип | Описание |
---|---|---|
calendar | String | доступ к календарю |
camera | String | доступ к камере |
contacts | String | доступ к контактам |
media_library | String | доступ к медиабиблиотеке |
microphone | String | доступ к микрофону |
photos | String | доступ к фотографиям |
photos_add_only | String | разрешение только на добавление фотографий |
reminders | String | доступ к напоминаниям |
sensors | String | доступ к сенсорам |
sms | String | доступ к SMS |
speech | String | распознавание речи |
storage | String | доступ к хранилищу |
ignore_battery_optimizations | String | игнорирование оптимизации батареи |
notification | String | уведомления |
access_media_location | String | доступ к местоположению медиафайлов |
activity_recognition | String | распознавание активности |
manage_external_storage | String | управление внешним хранилищем |
system_alert_window | String | системные всплывающие окна |
request_install_packages | String | установку пакетов |
app_tracking_transparency | String | прозрачность отслеживания приложений |
critical_alerts | String | критические оповещения |
access_notification_policy | String | доступ к политике уведомлений |
bluetooth_scan | String | Bluetooth-сканирование |
bluetooth_advertise | String | рекламу Bluetooth |
bluetooth_connect | String | подключение Bluetooth |
nearby_wifi_devices | String | доступ к ближайшим Wi-Fi устройствам |
videos | String | доступ к видео |
audio | String | доступ к аудио |
schedule_exact_alarm | String | планирование точных будильников |
sensors_always | String | постоянный доступ к сенсорам |
calendar_write_only | String | запись в календарь |
calendar_full_access | String | полный доступ к календарю |
assistant | String | доступ к помощнику |
background_refresh | String | фоновое обновление |
Все значения разрешений по умолчанию установлены как "undefined"
и обычно могут быть одним из:
"granted"
- Разрешение предоставлено"denied"
- Разрешение не предоставлено, нужно запросить"permanently_denied"
- Разрешение явно отклонено, разрешение предоставляется только через настройки системы"restricted"
- Разрешение ограничено на уровне системы"limited"
- Разрешение предоставлено с ограничениями"undefined"
- Статус разрешения неизвестен, это статус разрешения за которыми не следит приложение
Media
Объект media
предоставляет информацию о дисплее устройства и макете:
Поле | Тип | Описание |
---|---|---|
breakpoint | String | Текущая контрольная точка для адаптивного макета |
orientation | String | Ориентация устройства (например, "portrait", "landscape") |
container_width | Number | Ширина контейнера в логических пикселях |
padding | Object | Значения отступов контейнера |
view_padding | Object | Значения отступов вида (учитывает элементы системного интерфейса) |
density | String | Плотность экрана в виде строкового значения целого числа |
Feature Flags
feature_flags
— это карта флагов функций, которые управляют поведением приложения:
{
"feature_name": true,
"another_feature": false,
// Дополнительные флаги функций
}
Где value
может быть только типа boolean
(true/false), что позволяет включать или отключать определенные функции приложения.
Config
config
— это карта настроек конфигурации для приложения:
{
"config_key": value,
// Дополнительные настройки конфигурации
}
Где value
может быть любого типа (boolean, string, number, object) в зависимости от реализации конфигурации.
Все ключи в объекте config
соответствуют значениям из Remote Config с префиксом widgets_config__
(при этом сам префикс в ключах объекта config
отсутствует). Для просмотра полного списка доступных ключей и их значений необходимо обратиться к настройкам Remote Config в Firebase консоли.
Theme
Объект theme
содержит цветовые переменные, связанные с темой:
Поле | Тип | Описание |
---|---|---|
colors | Object | Цветовые переменные, организованные по темам |
colors.brand | Object | Цветовые переменные бренда |
colors.light | Object | Цветовые переменные светлой темы |
colors.dark | Object | Цветовые переменные темной темы |
Interactions
Объект interactions
предоставляет данные о взаимодействии пользователя с сообщениями:
Поле | Тип | Описание |
---|---|---|
last_seen | Object | Информация о последнем просмотренном сообщении (null, если нет) |
seen_entries | Array | Список всех просмотренных сообщений |
Каждая запись просмотра содержит информацию о том, когда и как пользователь взаимодействовал с предыдущим сообщением.
Примеры использования JsonLogic
JsonLogic позволяет создавать сложные условия для отображения сообщений. Вот несколько примеров:
Пример 1: Показать сообщение только подписчикам на iOS
{
"and": [
{
"==": [
{ "var": "subscription.is_active" },
true
]
},
{
"==": [
{ "var": "app.platform" },
"ios"
]
}
]
}
Пример 2: Показать сообщение только в темной теме с достаточной шириной экрана
{
"and": [
{
"==": [
{ "var": "app.theme" },
"dark"
]
},
{
">": [
{ "var": "media.container_width" },
375
]
}
]
}
Пример 3: Показать сообщение только если разрешение на камеру предоставлено
{
"==": [
{ "var": "permissions.camera" },
"granted"
]
}
Пример 4: Показать сообщение только если пользователь не видел сообщение сегодня и уведомления отключены
{
"and": [
{
"or": [
{
"==": [
{ "var": "interactions.last_seen" },
null
]
},
{
"<": [
{
"date.truncate": [
{ "var": "interactions.last_seen.date" },
"days"
]
},
{
"date.truncate": [
{ "now": [] },
"days"
]
}
]
}
]
},
{
"==": [
{ "var": "permissions.notification" },
"denied"
]
}
]
}
Это условие показывает сообщение только если:
- Пользователь либо никогда не видел сообщение (interactions.last_seen равен null), ИЛИ видел его в предыдущие дни (не сегодня) - используется функция
date.truncate
для сравнения даты последнего просмотра с текущей датой, обрезанных до дней - И при этом разрешение на уведомления находится в статусе "denied" (пользователь отключил уведомления)
Данный пример соответствует реальному использованию в приложении для напоминания пользователям о важности включения уведомлений после определенных действий (например, отправки отзыва или закрытия достижений), показывая всплывающее окно не чаще одного раза в день.
Пример 5: Сложное условие с версией приложения и событиями (из примера)
{
"and": [
{
">=": [
{ "var": "app.version" },
"5.23.0"
]
},
{
"or": [
{
"!=": [
{ "var": "event.event_name" },
"first_feedback_sent"
]
},
{
"!=": [
{ "var": "permissions.notification" },
"denied"
]
}
]
}
]
}
Это условие показывает сообщение только если:
- Версия приложения не ниже 5.23.0, И
- Либо событие не является "first_feedback_sent", либо разрешение на уведомления не в статусе "denied"