Skip to content

Condition - Динамические условия для срабатывания сообщения

Данный документ описывает все доступные поля, которые можно использовать в условиях для отображения сообщений с использованием JsonLogic.

JsonLogic

JsonLogic — это язык для создания переносимых, сериализуемых правил, которые можно выполнять в различных языках программирования. В контексте условий показа сообщений, JsonLogic позволяет создавать сложные условия, которые можно легко передавать между клиентом и сервером в формате JSON.

Основные особенности JsonLogic:

  • Правила представлены в виде JSON объектов
  • Поддерживает логические операторы (and, or, not), операторы сравнения (>, >=, <, <=, ==, !=), арифметические операции и другие функции
  • Позволяет обращаться к данным через оператор var
  • Поддерживает вложенные правила для создания сложных условий

Для доступа к данным в контексте используется оператор var. Например, {"var": "app.version"} извлекает значение версии приложения из контекста условия.

Более подробную информацию о синтаксисе и возможностях JsonLogic можно найти на официальном сайте: http://jsonlogic.com

Содержание

Обзор

Контекст условий предоставляет богатый набор данных, которые можно использовать для создания условной логики отображения сообщений. Он содержит информацию о текущем событии, состоянии приложения, профиле пользователя, настройках устройства и предыдущих взаимодействиях.

Структура контекста условий

dart
{
  '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_nameStringНазвание выполненного события
propertiesObjectДополнительные свойства, переданные вместе с событием

Context Properties

Palette

Объект palette содержит переменные цветов для разных тем:

ПолеТипОписание
brandObjectЦветовые переменные бренда
lightObjectЦветовые переменные светлой темы
darkObjectЦветовые переменные темной темы

App

Объект app предоставляет информацию о приложении:

ПолеТипОписание
themeStringТекущая тема приложения
languageStringТекущий язык приложения
versionStringВерсия приложения
platformStringПлатформа, на которой работает приложение
divkit_versionStringТекущая версия DivKit
widgets_versionStringТекущая версия Widgets
build_typeStringТип сборки (Production, ReleaseCandidate и т.д.)
build_modeStringРежим сборки (release, profile или debug)
api_base_urlStringБазовый URL для API-запросов
has_connectionBooleanУказывает, имеет ли приложение активное интернет-соединение

User

Объект user содержит информацию о профиле пользователя:

ПолеТипОписание
is_logged_inBooleanУказывает, авторизован ли пользователь
idStringID пользователя (null, если не авторизован)
nameStringИмя пользователя (null, если не задано)
avatarStringURL аватара пользователя (null, если не задан)
birthdayDateTimeДата рождения пользователя (null, если не задана)
is_adultBooleanУказывает, является ли пользователь совершеннолетним (null, если неизвестно)
has_referral_idBooleanУказывает, имеет ли пользователь реферальный ID (null, если неизвестно)
contactsObjectКарта контактов пользователя (пары ключ-значение)

Subscription

Объект subscription предоставляет информацию о статусе подписки пользователя:

ПолеТипОписание
is_activeBooleanУказывает, имеет ли пользователь активную подписку
has_been_subscribedBooleanУказывает, была ли у пользователя подписка в прошлом
is_externalBooleanУказывает, управляется ли подписка извне (null, если не применимо)
tariffObjectИнформация о тарифе подписки (null, если нет подписки)

Permissions

Объект permissions содержит статус различных разрешений устройства:

ПолеТипОписание
calendarStringдоступ к календарю
cameraStringдоступ к камере
contactsStringдоступ к контактам
media_libraryStringдоступ к медиабиблиотеке
microphoneStringдоступ к микрофону
photosStringдоступ к фотографиям
photos_add_onlyStringразрешение только на добавление фотографий
remindersStringдоступ к напоминаниям
sensorsStringдоступ к сенсорам
smsStringдоступ к SMS
speechStringраспознавание речи
storageStringдоступ к хранилищу
ignore_battery_optimizationsStringигнорирование оптимизации батареи
notificationStringуведомления
access_media_locationStringдоступ к местоположению медиафайлов
activity_recognitionStringраспознавание активности
manage_external_storageStringуправление внешним хранилищем
system_alert_windowStringсистемные всплывающие окна
request_install_packagesStringустановку пакетов
app_tracking_transparencyStringпрозрачность отслеживания приложений
critical_alertsStringкритические оповещения
access_notification_policyStringдоступ к политике уведомлений
bluetooth_scanStringBluetooth-сканирование
bluetooth_advertiseStringрекламу Bluetooth
bluetooth_connectStringподключение Bluetooth
nearby_wifi_devicesStringдоступ к ближайшим Wi-Fi устройствам
videosStringдоступ к видео
audioStringдоступ к аудио
schedule_exact_alarmStringпланирование точных будильников
sensors_alwaysStringпостоянный доступ к сенсорам
calendar_write_onlyStringзапись в календарь
calendar_full_accessStringполный доступ к календарю
assistantStringдоступ к помощнику
background_refreshStringфоновое обновление

Все значения разрешений по умолчанию установлены как "undefined" и обычно могут быть одним из:

  • "granted" - Разрешение предоставлено
  • "denied" - Разрешение не предоставлено, нужно запросить
  • "permanently_denied" - Разрешение явно отклонено, разрешение предоставляется только через настройки системы
  • "restricted" - Разрешение ограничено на уровне системы
  • "limited" - Разрешение предоставлено с ограничениями
  • "undefined" - Статус разрешения неизвестен, это статус разрешения за которыми не следит приложение

Media

Объект media предоставляет информацию о дисплее устройства и макете:

ПолеТипОписание
breakpointStringТекущая контрольная точка для адаптивного макета
orientationStringОриентация устройства (например, "portrait", "landscape")
container_widthNumberШирина контейнера в логических пикселях
paddingObjectЗначения отступов контейнера
view_paddingObjectЗначения отступов вида (учитывает элементы системного интерфейса)
densityStringПлотность экрана в виде строкового значения целого числа

Feature Flags

feature_flags — это карта флагов функций, которые управляют поведением приложения:

dart
{
  "feature_name": true,
  "another_feature": false,
  // Дополнительные флаги функций
}

Где value может быть только типа boolean (true/false), что позволяет включать или отключать определенные функции приложения.

Config

config — это карта настроек конфигурации для приложения:

dart
{
  "config_key": value,
  // Дополнительные настройки конфигурации
}

Где value может быть любого типа (boolean, string, number, object) в зависимости от реализации конфигурации.

Все ключи в объекте config соответствуют значениям из Remote Config с префиксом widgets_config__ (при этом сам префикс в ключах объекта config отсутствует). Для просмотра полного списка доступных ключей и их значений необходимо обратиться к настройкам Remote Config в Firebase консоли.

Theme

Объект theme содержит цветовые переменные, связанные с темой:

ПолеТипОписание
colorsObjectЦветовые переменные, организованные по темам
colors.brandObjectЦветовые переменные бренда
colors.lightObjectЦветовые переменные светлой темы
colors.darkObjectЦветовые переменные темной темы

Interactions

Объект interactions предоставляет данные о взаимодействии пользователя с сообщениями:

ПолеТипОписание
last_seenObjectИнформация о последнем просмотренном сообщении (null, если нет)
seen_entriesArrayСписок всех просмотренных сообщений

Каждая запись просмотра содержит информацию о том, когда и как пользователь взаимодействовал с предыдущим сообщением.

Примеры использования JsonLogic

JsonLogic позволяет создавать сложные условия для отображения сообщений. Вот несколько примеров:

Пример 1: Показать сообщение только подписчикам на iOS

json
{
  "and": [
    {
      "==": [
        { "var": "subscription.is_active" },
        true
      ]
    },
    {
      "==": [
        { "var": "app.platform" },
        "ios"
      ]
    }
  ]
}

Пример 2: Показать сообщение только в темной теме с достаточной шириной экрана

json
{
  "and": [
    {
      "==": [
        { "var": "app.theme" },
        "dark"
      ]
    },
    {
      ">": [
        { "var": "media.container_width" },
        375
      ]
    }
  ]
}

Пример 3: Показать сообщение только если разрешение на камеру предоставлено

json
{
  "==": [
    { "var": "permissions.camera" },
    "granted"
  ]
}

Пример 4: Показать сообщение только если пользователь не видел сообщение сегодня и уведомления отключены

json
{
  "and": [
    {
      "or": [
        {
          "==": [
            { "var": "interactions.last_seen" },
            null
          ]
        },
        {
          "<": [
            {
              "date.truncate": [
                { "var": "interactions.last_seen.date" },
                "days"
              ]
            },
            {
              "date.truncate": [
                { "now": [] },
                "days"
              ]
            }
          ]
        }
      ]
    },
    {
      "==": [
        { "var": "permissions.notification" },
        "denied"
      ]
    }
  ]
}

Это условие показывает сообщение только если:

  1. Пользователь либо никогда не видел сообщение (interactions.last_seen равен null), ИЛИ видел его в предыдущие дни (не сегодня) - используется функция date.truncate для сравнения даты последнего просмотра с текущей датой, обрезанных до дней
  2. И при этом разрешение на уведомления находится в статусе "denied" (пользователь отключил уведомления)

Данный пример соответствует реальному использованию в приложении для напоминания пользователям о важности включения уведомлений после определенных действий (например, отправки отзыва или закрытия достижений), показывая всплывающее окно не чаще одного раза в день.

Пример 5: Сложное условие с версией приложения и событиями (из примера)

json
{
  "and": [
    {
      ">=": [
        { "var": "app.version" },
        "5.23.0"
      ]
    },
    {
      "or": [
        {
          "!=": [
            { "var": "event.event_name" },
            "first_feedback_sent"
          ]
        },
        {
          "!=": [
            { "var": "permissions.notification" },
            "denied"
          ]
        }
      ]
    }
  ]
}

Это условие показывает сообщение только если:

  1. Версия приложения не ниже 5.23.0, И
  2. Либо событие не является "first_feedback_sent", либо разрешение на уведомления не в статусе "denied"

Авторы

The avatar of contributor named as Vadim Melnikov Vadim Melnikov

История