Розробка 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 проекту — зв'яжіться з нами для оцінки.







