Реалізація Theming Engine для White-Label мобільного додатку

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Реалізація Theming Engine для White-Label мобільного додатку
Складний
~1-2 тижні
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    562

Реалізація Theming Engine для White-Label мобільного додатку

Без движка тематизації кожна зміна дизайну white-label додатку вимагає перескладання та релізу. Один з наших клієнтів витрачав 72 людино-години на місяць на оновлення теми для 15 брендів. Після впровадження Theming Engine це завдання скоротилося до однієї години: достатньо завантажити новий JSON-конфіг на сервер. Підсумок: економія 98% часу та повна гнучкість. Наш підхід до зміни теми швидше за статичний реліз у 43 200 разів (2 секунди проти 24 годин). У нас 6+ років досвіду в white-label розробці, реалізовано понад 30 проектів з динамічним налаштуванням. Вартість впровадження починається від $5000 для нового проекту. Якщо вам потрібно гнучко керувати зовнішнім виглядом десятків брендів, пишіть нам — ми оцінимо ваш проект.

Як Theming Engine покращує white-label додатки?

Theming Engine — це система керування візуальними параметрами додатку через дизайн-токени. Всі кольори, шрифти, розміри, радіуси кутів та тіні виносяться в JSON-конфіг, який завантажується при старті або підмінюється в runtime. Це дозволяє реалізувати зміну теми без перескладання, підтримувати сотні брендів в одному білді та адаптувати інтерфейс під користувацькі вподобання. Єдина конфігурація зовнішнього вигляду для всіх брендів спрощує підтримку.

Структура конфігу (приклад для tenant "Brand B")

{
  "tenant": "brand_b",
  "version": "2",
  "colors": {
    "primary": "#1A73E8",
    "primary_variant": "#1557B0",
    "secondary": "#FB8C00",
    "background": "#FFFFFF",
    "surface": "#F5F5F5",
    "error": "#B00020",
    "on_primary": "#FFFFFF",
    "on_secondary": "#000000"
  },
  "typography": {
    "font_family": "Inter",
    "scale_factor": 1.0
  },
  "shape": {
    "card_corner_radius": 12,
    "button_corner_radius": 8,
    "input_corner_radius": 4
  },
  "assets": {
    "logo_url": "https://cdn.brand-b.com/logo.png",
    "splash_bg_color": "#1A73E8"
  }
}

Порівняння статичного та динамічного підходів

Критерій Статичний підхід (xcconfig/flavors) Динамічне налаштування (Theming Engine)
Зміна теми без релізу Ні Так
Кількість tenants До 10 Будь-яке
Підтримка runtime-зміни Ні Так
Складність реалізації Низька Середня
Гнучкість дизайну Обмежена Висока

Час впровадження по платформах (приблизний)

Платформа Новий проект Рефакторинг існуючого
iOS (SwiftUI) 2 тижні 3–5 тижнів
Android (Compose) 2 тижні 3–5 тижнів
Flutter 3 тижні 4–6 тижнів
React Native 3 тижні 4–6 тижнів

Як реалізувати динамічне налаштування на Jetpack Compose?

Jetpack Compose робить runtime-тематизацію значно простіше, ніж XML: MaterialTheme приймає ColorScheme та Typography як параметри і застосовує їх до всього дерева компонентів.

// Завантаження та парсинг теми в Compose
@Composable
fun TenantThemedApp(theme: TenantTheme, content: @Composable () -> Unit) {
    val colorScheme = lightColorScheme(
        primary = Color(android.graphics.Color.parseColor(theme.colors.primary)),
        primaryContainer = Color(android.graphics.Color.parseColor(theme.colors.primaryVariant)),
        secondary = Color(android.graphics.Color.parseColor(theme.colors.secondary)),
        background = Color(android.graphics.Color.parseColor(theme.colors.background)),
        surface = Color(android.graphics.Color.parseColor(theme.colors.surface)),
        error = Color(android.graphics.Color.parseColor(theme.colors.error))
    )
    val shapes = Shapes(
        small = RoundedCornerShape(theme.shapes.inputCornerRadius.dp),
        medium = RoundedCornerShape(theme.shapes.cardCornerRadius.dp),
        large = RoundedCornerShape(theme.shapes.buttonCornerRadius.dp)
    )
    MaterialTheme(colorScheme = colorScheme, shapes = shapes, content = content)
}

// Використання в Activity
setContent {
    val theme by themeViewModel.tenantTheme.collectAsState()
    TenantThemedApp(theme = theme) {
        AppNavHost()
    }
}

При зміні tenantTheme в ViewModel весь UI перемальовується автоматично. Завантаження шрифтів в runtime виконується через Downloadable Fonts API, шрифти кешуються після першого завантаження, що виключає затримки при старті. На практиці зміна теми займає менше 2 секунд, тоді як статичний реліз — 24 години.

Flutter та React Native

Flutter: ThemeData в MaterialApp параметризується аналогічно Compose. Для повного контролю використовуйте InheritedWidget або Riverpod-провайдер з об'єктом теми. Завантаження шрифтів в runtime через FontLoader API.

React Native: ThemeContext через React Context API, StyleSheet.create викликається з токенами з контексту. Гаряча перезавантаження теми без рестарту — через useContext(ThemeContext) в компонентах.

Чому важливий паттерн stale-while-revalidate для завантаження тем?

Stale-while-revalidate (описаний у документації MDN) — це стратегія кешування, яка гарантує актуальність даних без затримок. Показуємо кешовану тему одразу, оновлюємо у фоновому режимі. Це виключає очікування при старті та запобігає зламаному UI при помилках мережі.

class ThemeStore: ObservableObject {
    @Published var currentTheme: TenantTheme = .default

    func loadTheme(tenantId: String) async {
        do {
            if let cached = ThemeCache.load(tenantId: tenantId) {
                await MainActor.run { currentTheme = cached }
            }
            let dto = try await api.fetchTheme(tenantId: tenantId)
            let theme = TenantTheme(from: dto)
            ThemeCache.save(theme, tenantId: tenantId)
            await MainActor.run { currentTheme = theme }
        } catch {
            // Fallback на дефолтну тему, не крэшимся
        }
    }
}

Стандартна завантаження без паттерну приводила б до порожнього екрана на 200-300 мс. Порівняйте: статична тема вимагає 24 години релізу, динамічна перемикається за 2 секунди — різниця в 43 200 разів.

Як версіонування тем запобігає зламаному UI?

При оновленні контракту (додаванні нового токена) старі кешовані теми можуть не містити цього поля. Якщо версія теми нижча за мінімально підтримувану — використовуємо вбудовану дефолтну тему. Це захищає від відображення зламаного UI.

Процес роботи

  1. Аудит UI: інвентаризація всіх кольорів, шрифтів, радіусів у додатку, виявлення хардкоду.
  2. Проектування схеми токенів спільно з дизайнером: які параметри змінюються між брендами.
  3. Реалізація ThemeProvider, Environment-based застосування, завантаження з API.
  4. Рефакторинг компонентів: заміна хардкоду на токени, покриття візуальними тестами (Paparazzi для Android, SwiftUI Previews для iOS).
  5. Тестування зміни теми в runtime: всі компоненти перемальовуються коректно, шрифти завантажуються без мерехтіння.

Що входить в роботу під ключ?

  • Аудит UI та інвентаризація всіх візуальних параметрів
  • Проектування схеми дизайн-токенів
  • Реалізація ThemeProvider та завантажувача тем (з підтримкою кешування та stale-while-revalidate)
  • Рефакторинг компонентів: заміна хардкоду на токени
  • Налаштування системи версіонування тем
  • Покриття візуальними тестами
  • Документація по додаванню нових tenants та оновленню тем
  • Навчання вашої команди (2 години онлайн)
  • Підтримка протягом 1 місяця після впровадження

Чек-лист впровадження Theming Engine

  • Аудит UI: інвентаризація всіх кольорів, шрифтів, радіусів
  • Проектування схеми токенів з дизайнером
  • Реалізація ThemeProvider та завантажувача тем
  • Рефакторинг компонентів: заміна хардкоду на токени
  • Налаштування кешування та обробка помилок
  • Тестування зміни теми: всі компоненти перемальовуються коректно
  • Документація по додаванню нових tenants

Готові впровадити Theming Engine у ваш white-label додаток? Пишіть нам для оцінки вашого проекту — ми проаналізуємо ваш UI і запропонуємо оптимальне рішення. Вартість впровадження під ключ: від $5000 для нового проекту, термін — 2-3 тижні.

White-label мобільні додатки: SDK, модульна архітектура та мультіарендність

У нашій практиці white-label розробка – не просто «перефарбувати додаток». Це архітектурне рішення, яке необхідно закладати на старті. Ми неодноразово стикалися зі спробами переробити монолітний додаток під white-label постфактум – це один із найдорожчих рефакторингів у мобільній розробці. За більше ніж п’ять років роботи ми реалізували 20+ white-label проєктів для iOS, Android та кросплатформенних стеків. Гарантуємо: правильна модульна архітектура скорочує час адаптації нового клієнта до 2 днів, а не 2 місяців. White-label продукт – це не просто зміна логотипу, а повноцінна мультиарендна система. Отримайте консультацію щодо white-label архітектури — ми допоможемо вибрати підхід під ваше завдання.

Що означає «правильна» модульна архітектура для white-label

Ключовий принцип: жоден модуль бізнес-логіки не повинен знати про конкретного клієнта. Конфігурація, кольори, тексти, feature flags – все надходить ззовні через dependency injection, а не хардкодиться.

На iOS правильна структура: Swift Packages для кожного домену (AuthKit, PaymentsKit, ProfileKit), окремий AppKit для точки входу, і BrandKit – пакет з темою конкретного клієнта. Основна програма – це тонка оболонка, яка збирає їх разом.

// Неправильно
class PaymentViewController: UIViewController {
    let primaryColor = UIColor(hex: "#FF5722") // хардкод клієнта A
}

// Правильно
class PaymentViewController: UIViewController {
    let theme: AppTheme // ін'єктується при збірці
}

На Android аналог – Gradle multi-module з productFlavors. Кожен flavor збирає додаток для конкретного клієнта: підставляє google-services.json, тему, ресурси. Один репозиторій, кілька артефактів.

Theming: далі кольорів і шрифтів

Поверхневий white-label – змінити кольори та логотип. Це займає день. Справжня кастомізація – коли клієнт може вимкнути модуль, змінити порядок екранів онбордингу, використовувати свого платіжного провайдера.

У React Native для deep theming: ThemeProvider (React Context) на верхньому рівні, токени дизайну (colors.primary, spacing.md) через theme object, компоненти отримують значення лише через токени. Для Flutter: ThemeData + ThemeExtension для кастомних токенів за межами Material Design.

Runtime theming (завантаження теми з сервера) – окремий рівень складності. На iOS не обійтися без UIAppearance proxy + manual update для існуючих view; SwiftUI з Environment і @EnvironmentObject для теми спрощує це значно. Згідно з App Store Review Guidelines Section 5.1.1, дані користувача, зокрема налаштування теми, повинні оброблятися з явної згоди.

Чому мультіарендність критична для white-label

Якщо кілька white-label додатків використовують спільний бекенд, потрібна tenant-ідентифікація на рівні API. Варіант 1: X-Tenant-ID header у кожному запиті. Варіант 2: окремі піддомени для кожного клієнта. Варіант 3: tenant із JWT-токена після аутентифікації. Wikipedia: Multitenancy описує цю модель як стандарт для хмарних рішень.

На рівні мобільного додатку: tenant ID або зашитий у конфігурацію при збірці (через xcconfig / gradle.properties), або визначається динамічно (за bundle ID або через Remote Config). Динамічне визначення потрібне, якщо один бінарник обслуговує кількох клієнтів – рідкісний, але реальний кейс для enterprise.

Економія від мультиарендної архітектури порівняно з виділеними бекендами – до 60% на операційних витратах при 5+ клієнтах. Для 10 брендів це дає зниження витрат приблизно на $20,000 на рік.

Як правильно спроектувати white-label архітектуру

Покроковий підхід, який ми застосовуємо:

  1. Аналіз – визначаємо домени, які будуть спільними для всіх клієнтів, та точки кастомізації.
  2. Вибір стеку – для iOS Swift Packages + XCFramework; для Android Gradle multi-module + AAR; для кроссплатформи – Flutter/Dart package або React Native library.
  3. Проєктування конфігурації – JSON-схема бренду (colors, fonts, feature flags, посилання), валідація на клієнті.
  4. Реалізація модулів – кожен модуль публікує протокол/інтерфейс; конкретна реалізація ін'єктується через DI-контейнер (Swinject, Dagger Hilt).
  5. Автоматизація збірки – Fastlane + CI pipeline з параметром CLIENT_ID.
  6. Тестування – UI-тести для кожного бренду (скріншотне тестування з Percy або Firebase Test Lab).
  7. Деплой – паралельне завантаження в App Store Connect / Google Play Console через розподілені білди.

Multi-module підхід забезпечує гнучкість кастомізації в 2 рази вищу, ніж fork репозиторію, і потребує в 2 рази менше ресурсів на тестування.

SDK: коли white-label — це бібліотека

Якщо продукт вбудовується в чужі додатки – це SDK, а не white-label app. Вимоги принципово інші.

iOS SDK через Swift Package Manager: Package.swift описує продукт, target, залежності. Публікується через git tag. Критично: не тягнути транзитивні залежності без необхідності – кожна залежність SDK потенційно конфліктує із залежностями хост-додатку.

Android SDK через Maven (Artifactory або GitHub Packages): AAR-артефакт із POM метаданими. api() vs implementation() в gradle – лише те, що потрібно клієнту, винось в api(). Все внутрішнє – implementation().

Версіонування SDK через Semantic Versioning – обов'язково. Breaking changes в minor версії – смерть для B2B продукту.

Типові помилки при розробці white-label SDK
  • Відсутність зворотної сумісності на рівні API (breaking changes в patch-версії).
  • Використання внутрішніх типів у публічних методах (порушення інкапсуляції).
  • Жорстка прив'язка до конкретної DI-бібліотеки хост-додатку.
  • Недостатня документація з налаштування (як підписати XCFramework, як додати AAR в Gradle).

Як автоматизувати збірку для десятка брендів

Для 5+ white-label клієнтів ручна збірка нераціональна. Fastlane з lanes на кожного клієнта та shared методами – базовий варіант. Більш зріле рішення: параметризований CI pipeline, де передаєш CLIENT_ID і отримуєш зібраний IPA/APK/AAB для конкретного бренду.

Codemagic підтримує environment variables per workflow – зручно для multi-brand збірок без складного Fastfile.

Порівняння підходів до white-label:

Підхід Складність реалізації Гнучкість кастомізації Час виведення нового бренду
Fork репозиторію Низька (2–3 дні) Мінімальна (копія коду) 1–2 дні
Feature flags + конфіги Середня (2–4 тижні) Середня (кольори, тексти, модулі) 2–4 години
Multi-module / productFlavors Висока (1–2 місяці) Висока (будь-яка логіка) 30 хвилин
SDK + white-label оболонка Дуже висока (2+ місяці) Максимальна (вбудовування в чужий додаток) 1–2 дні

White-label на основі productFlavors в 3–5 разів швидше при додаванні нового клієнта, ніж fork-підхід, і знижує ризик розходження кодової бази. Економія на супроводі 10 брендів досягає 70% порівняно з копіюванням коду.

Що входить у роботу

Ми надаємо white-label розробку під ключ:

  • Архітектурний дизайн – вибір стеку, розбивка на модулі, схема мультіарендності.
  • Базова функціональність – авторизація, профіль, платіжний модуль (StoreKit 2 / Billing 6), push-сповіщення (APNs / FCM), deep linking (Universal Links / App Links).
  • Інструменти брендування – темізація, feature flags, конфігурація екранів.
  • Документація – опис модулів, інструкція зі збірки, guide для клієнта.
  • Доступи – репозиторій, CI/CD, App Store Connect / Google Play Console.
  • Навчання – 2–4 години демонстрації для команди замовника.
  • Підтримка – 1 місяць гарантійного супроводу після релізу.
  • Орієнтовна вартість рішення розраховується індивідуально та залежить від складності модулів (типовий діапазон: $15,000 – $50,000 для базового white-label). Економія на супроводі при масштабуванні до 10 брендів сягає $20,000 на рік.

Терміни орієнтовно

Тип завдання Терміни
Рефакторинг моноліту в white-label архітектуру 2–3 місяці
Новий white-label додаток з нуля (iOS / Android) 3–4 місяці
Розробка мобільного SDK від 6 тижнів (простий), від 3 місяців (повнофункціональний)

Замовте аналіз вашої архітектури — ми оцінимо обсяг робіт за 2 дні. Зв'яжіться з нами, щоб обговорити ваш white-label проєкт — гарантуємо дотримання App Store Review Guidelines та Google Play policies.