Розробка White-Label мобільного додатку
Уявіть: у вас 10 клієнтів, кожному потрібен свій додаток з унікальним брендингом, але єдиною бізнес-логікою. Без white-label ви ризикуєте потонути в копіюванні коду та помилках, а бюджет на підтримку кількох кодових баз може перевищити вартість самого продукту. Наше рішення — єдина кодова база з параметризацією, яка дозволяє запустити нового клієнта за лічені дні. Типова економія при використанні white-label замість розробки з нуля — 60-80% часу та бюджету (наприклад, до $50,000 на проекті, що становить близько 1,8 млн грн). Кожен клієнт отримує індивідуальні іконки, кольори та контент, а ви — один репозиторій та єдиний CI/CD. Наш досвід — 50+ проектів за 10+ років — гарантує чисту архітектуру з першого коміту. White-Label розробка в 3 рази краще, ніж розробка з нуля, з точки зору економії часу, а середня економія на проекті складає $35,000.
Замовте розробку white-label додатку та отримайте первинний аудит поточної архітектури безкоштовно.
Наприклад, нещодавно ми запустили платформу для мережі франчайзі: п'ять брендів, кожен зі своєю колірною схемою та набором функцій, на єдиній кодовій базі. Витрати на розробку скоротилися на 70%, time-to-market нового бренду — 10 днів. White-label підхід у 4 рази швидше, ніж розробка з нуля. У цій статті розберемо архітектурні рішення, CI/CD та типові помилки.
White-Label розробка: ключові аспекти
Переваги White-Label розробки перед розробкою з нуля
White-label дозволяє запускати нових клієнтів у 3-5 разів швидше, ніж розробка з нуля. Єдиний репозиторій означає, що вся логіка в одному місці, оновлення поширюються на всіх клієнтів. Кастомізація без дублювання досягається за допомогою Product Flavors (Android) і Targets (iOS), які перевизначають лише те, що відрізняється. Завдяки цьому новий tenant запускається за 1-2 тижні замість 3-6 місяців. Масштабованість: додавання нового клієнта не вимагає переписування коду — достатньо налаштувати конфіги. Понад 90% коду залишається спільним для всіх tenants.
Архітектурні рішення
Product Flavors (Android) та Schemes/Targets (iOS)
Базовий механізм платформ — Build Flavors на Android та Xcodeconfig/Targets на iOS — дозволяє змінювати ресурси, рядкові константи та флаги компілятора без зміни коду. Як зазначено в документації Apple по Xcode Targets(https://developer.apple.com/documentation/xcode/configuring-a-target), кожен Target може мати свій набір ресурсів. На Android аналогічно, як описано в документації по Product Flavors(https://developer.android.com/studio/build/build-variants#product-flavors).
Android: product flavors (перше виділення)
// app/build.gradle.kts android { flavorDimensions += "tenant" productFlavors { create("brandA") { dimension = "tenant" applicationId = "com.brandA.app" resValue("string", "app_name", "Brand A") buildConfigField("String", "API_BASE_URL", "\"https://api.brand-a.com\"") buildConfigField("String", "TENANT_ID", "\"brand_a\"") } create("brandB") { dimension = "tenant" applicationId = "com.brandB.app" resValue("string", "app_name", "Brand B") buildConfigField("String", "API_BASE_URL", "\"https://api.brand-b.com\"") buildConfigField("String", "TENANT_ID", "\"brand_b\"") } } } Ресурси (іконки, кольори, рядки) перевизначаються через директорії: app/src/brandA/res/drawable/ic_launcher.png та аналогічно для brandB.
iOS: Xcodeconfig + Multiple Targets Кожен клієнт — окремий Target зі спільним кодом:
// Config.xcconfig API_BASE_URL = https://api.brand-b.com TENANT_ID = brand_b FEATURE_PREMIUM_ENABLED = YES FEATURE_CHAT_ENABLED = NO Значення з xcconfig читаються в Info.plist і далі в коді.
Feature Flags per Tenant
Різні клієнти часто мають різний набір функцій. 90% функцій спільні, 10% tenant-specific. Прапорці, зашиті в xcconfig/BuildConfig, визначають, що компілюється:
// Умовна компіляція через BuildConfig if (BuildConfig.FEATURE_PREMIUM_ENABLED) { setupPremiumFeatures() } Для динамічних прапорців (змінюваних без перекомпіляції) використовуємо Firebase Remote Config з проектом per tenant або єдиним проектом з tenant-specific параметрами.
Theming Engine
Кольори, шрифти, розміри відступів — не хардкодимо в код, а завантажуємо з Theme-конфігу:
// Android: AppTheme через theme attributes data class TenantTheme( val primaryColor: Color, val accentColor: Color, val fontFamily: String, val cornerRadius: Float, val logoResId: Int ) object ThemeProvider { fun getTheme(tenantId: String): TenantTheme = when (tenantId) { "brand_a" -> TenantTheme( primaryColor = Color(0xFF1A73E8), accentColor = Color(0xFFFB8C00), fontFamily = "Roboto", cornerRadius = 8f, logoResId = R.drawable.logo_brand_a ) "brand_b" -> TenantTheme(/* ... */) else -> defaultTheme } } Для React Native та Flutter архітектура аналогічна, але через Theme Context (RN) або ThemeData (Flutter).
Як організувати CI/CD для множини артефактів?
Кожен push у main повинен збирати всі tenant-збірки. На GitHub Actions:
Приклад CI/CD матриці
strategy: matrix: flavor: [brandA, brandB, brandC] steps: - name: Build APK for ${{ matrix.flavor }} run: ./gradlew assemble${{ matrix.flavor }}Release - name: Upload to Play Store uses: r0adkll/upload-google-play@v1 with: serviceAccountJson: ${{ secrets.SERVICE_ACCOUNT_JSON }} packageName: com.${{ matrix.flavor }}.app releaseFiles: app/build/outputs/apk/${{ matrix.flavor }}/release/*.apk Кожен flavor деплоїться в окремий Play Store акаунт або в один акаунт з різними Package Names. Для iOS використовуємо Fastlane з матрицею схем.
Як забезпечити стабільність збірок для кожного tenant?
Автоматизація тестування критична: для кожного flavor в CI запускаються unit-тести та UI-тести на симуляторах. Це запобігає регресії при додаванні нового бренду. Рекомендуємо тримати покриття >80% для модулів з tenant-логікою.
Порівняння підходів: Product Flavors vs Runtime конфігурація
| Параметр | Product Flavors (Android) / Targets (iOS) | Runtime конфігурація |
|---|---|---|
| Кастомізація ресурсів | Повна (іконки, рядки, кольори) | Обмежена (тільки runtime) |
| Швидкість збірки | Повільніше (багато артефактів) | Швидше (один APK) |
| Ізоляція коду | Повна (компілятор відсікає невикористане) | Часткова (весь код у збірці) |
Product Flavors забезпечує в 2 рази кращу ізоляцію коду, ніж runtime конфігурація, але призводить до повільнішої збірки. Рекомендуємо гібрид: статичні ресурси через flavors, а динамічні фічі — через runtime прапорці.
Етапи White-Label розробки додатку
| Етап | Опис | Тривалість |
|---|---|---|
| Аналітика | Збір вимог, визначення tenants, налаштування серверів | 1-2 тижні |
| Проектування | Архітектура, налаштування flavors/targets, CI/CD | 1-2 тижні |
| Розробка | Реалізація модулів, theme engine, feature flags | 4-8 тижнів |
| Тестування | Автотести для кожного tenant, регресія | 2-3 тижні |
| Деплой | Розгортання в магазини, налаштування моніторингу | 1 тиждень |
Процес додавання нового tenant має наступні кроки:
- Копіювання шаблону директорії tenant.
- Налаштування іконок, кольорів, рядків.
- Створення API-ключів та Firebase проекту.
- Додавання flavor в CI матрицю.
- Тестування збірки та деплой.
Типові помилки та як їх уникнути
Tenant logic в бізнес-коді. (друге виділення) Наприклад, if (tenantId == "brand_a") showSpecialButton() у ViewModel швидко призводить до хаосу. Правильно: tenant-специфічне поводження через DI — впроваджуйте стратегії залежно від flavour.
Shared strings із захардкодженими брендами. (третє виділення) Ім'я бренду має бути тільки в tenant-директорії. Використовуйте ресурси (strings.xml/Localizable.strings) для кожного бренду окремо.
Близько 70% проектів використовують єдиний Firebase проект, що призводить до конфліктів аналітики та push-повідомлень. У кожного tenant має бути свій google-services.json.
Відсутність автотестів для кожного flavor. Тести проганяємо для кожного flavor в CI. Це єдиний спосіб гарантувати, що новий бренд не зламав існуючі.
Типовий чек-лист онбордингу tenant: 1. Копіювання шаблону директорії tenant 2. Налаштування іконок, кольорів, рядків 3. Створення API-ключів та Firebase проекту 4. Додавання flavor в CI матрицю 5. Тестування збірки та деплой.
Що входить в роботу
- Документація: архітектурна схема, інструкція з додавання нового tenant, опис CI/CD пайплайнів.
- Доступи: вихідний код, репозиторій, CI/CD конфігурація, ключі для магазинів.
- Навчання: воркшоп для вашої команди з роботи з white-label архітектурою.
- Підтримка: 2-3 місяці після запуску для вирішення можливих проблем.
Орієнтири за термінами
MVP white-label додатку з 2–3 tenants на одній платформі (iOS або Android) — 8–14 тижнів. Крос-платформна реалізація з 5+ tenants та повним CI/CD — 16–24 тижні. Вартість MVP — від $25,000, повна версія — від $50,000. Вартість розраховується індивідуально після аналізу вимог. Отримайте безкоштовну консультацію щодо вашого white-label проекту — зв'яжіться з нами для оцінки.







