Маркетинговый отдел требует еженедельных изменений главного экрана, но App Store Review занимает 2–3 недели. Мы в своей практике сталкивались с этим десятки раз. Решение — Server-Driven UI (SDUI), паттерн, где сервер отдаёт не только данные, но и описание того, как их отобразить. Мобильный клиент становится универсальным рендерером, который по JSON-схеме строит экраны динамически. Наш опыт — более 5 лет в мобильной разработке и 20+ проектов с SDUI. Компании вроде Airbnb (Ghost Platform, как описано в Airbnb Engineering Blog) и Mercado Libre уже используют этот подход на большинстве экранов, и мы внедрили его для нескольких ритейл-проектов.
Как работает Server-Driven UI?
Сервер хранит компонентное дерево для каждого экрана. Клиент получает JSON-описание и рекурсивно рендерит компоненты из своего реестра. Например, для главного экрана приходит структура:
{ "version": "1.0", "screen": { "type": "scroll_view", "children": [ { "type": "hero_banner", "props": { "imageUrl": "...", "title": "Летняя распродажа", "action": { "type": "navigate", "route": "/sale" } } }, { "type": "product_grid", "props": { "columns": 2, "dataSource": { "endpoint": "/api/products/featured" } } } ] } } Компонентная система — реестр типов: hero_banner, product_grid, text_block, cta_button, carousel. Новый тип компонента добавляется на сервере и в клиентах одновременно, деплоится через App Store/Play Store с новой версией приложения.
Почему это сложнее, чем кажется
- Версионирование схемы. Пользователи обновляют приложение медленно. Если сервер отдаёт
"type": "new_component", а клиент версии 2.1 его не знает — экран упадёт или отобразится некорректно. Нужна стратегия: fallback-компонент, минимально поддерживаемая версия, graceful degradation. - Типизация и валидация. Без строгой схемы (JSON Schema, Protobuf,
kotlinx.serializationс sealed classes) сервер может отдать невалидный payload, и крэш будет на клиенте, а не там, где ошибка. На iOS —CodableсDecodingStrategy.useDefaultValues, на Android —@SerialName+ sealed class с@JsonClassDiscriminator. - Производительность парсинга. Сложный экран в JSON — 5–50 КБ. На каждый скролл ленты это не пересчитывается, но cold render при первом открытии и кеширование схемы — отдельная инженерная задача.
Server-Driven UI vs традиционный UI: сравнение
| Характеристика | Традиционный UI | Server-Driven UI |
|---|---|---|
| Время на изменения UI | Недели (релиз) | Часы (правка на сервере) |
| Частота обновлений | Раз в 2–4 недели | Ежедневно |
| Зависимость от App Review | Да | Нет |
| Сложность разработки | Ниже | Выше (движок + версионирование) |
| Гибкость для A/B тестов | Ограничена | Полная |
В среднем SDUI сокращает время вывода изменений с недель до часов, что в 10 раз быстрее традиционного подхода. Ряд клиентов сэкономили более 40 часов разработки ежемесячно.
Когда использовать Server-Driven UI?
SDUI оправдан, если:
- Частые изменения лейаута без релиза приложения (маркетинговые баннеры, промо-экраны, онбординг)
- A/B тесты на уровне экранов: сервер отдаёт разные схемы разным сегментам пользователей
- Несколько брендов на одном приложении: белый лейбл, где каждый клиент видит свой экран
- Мощная редакторская команда: CMS-интерфейс позволяет нетехническим сотрудникам менять экраны
Отметим: когда SDUI не нужен: приложение со стабильным UI, маленькая команда, нет бизнес-требования менять экраны без App Store релиза.
Схема версионирования: fallback-компоненты
| Версия схемы | Тип компонента | Действие на старом клиенте |
|---|---|---|
| 1.0 | hero_banner | Рендерится как есть |
| 1.5 | video_banner | Fallback на image_banner |
| 2.0 | interactive_map | Fallback на text_block с ссылкой |
Реальный кейс из нашей практики
Ритейл-приложение на iOS и Android. Маркетинговая команда хотела менять главный экран (баннеры, категории, рекомендации) еженедельно — без ожидания 2–3 недель на App Store Review. Мы внедряли SDUI поэтапно: сначала только главный экран (Hero Banner + Category Grid), через три месяца — страницы категорий и карточки товаров. Backend — CMS на Laravel с визуальным редактором схемы. Клиент — iOS SwiftUI, Android Jetpack Compose. Через 4 месяца маркетинг самостоятельно публикует новые экраны без участия мобильных разработчиков. Наш клиент сэкономил более 40 часов разработки в месяц.
Инфраструктура и CDN
Схемы экранов кешируются на CDN (CloudFront, Fastly) с Cache-Control: max-age=300. Инвалидация через stale-while-revalidate — пользователь сразу видит кешированную версию, фоном грузится свежая. Для критических изменений — Surrogate-Key для точечной инвалидации конкретного экрана.
Что входит в работу
- Документация схемы: описание всех компонентов, их пропсов и версионирования
- Референсная реализация клиента на одной платформе (iOS или Android)
- Код-ревью и интеграция в существующий проект
- Обучение команды (до 2 дней) работе с SDUI-системой
- Поддержка на этапе запуска (2 недели)
- Настройка SDUI для вашего стека: SwiftUI, Jetpack Compose, Flutter
Сроки: базовая SDUI-система (3–5 типов компонентов, один экран) — 4–6 недель. Полноценная платформа с CMS-редактором, A/B тестингом, версионированием схем — 12–20 недель.
Мы гарантируем совместимость с вашим стеком. Свяжитесь с нами для оценки вашего проекта — бесплатно проанализируем текущую архитектуру и предложим план. Закажите консультацию, чтобы обсудить детали внедрения SDUI для вашего приложения.







