Разработка White-Label мобильного приложения
Представьте: у вас 10 клиентов, каждому нужно своё приложение с уникальным брендингом, но единой бизнес-логикой. Без white-label вы рискуете утонуть в копировании кода и ошибках, а бюджет на поддержку нескольких кодовых баз может превысить стоимость самого продукта. Наше решение — единая кодовая база с параметризацией, которая позволяет запустить нового клиента за считанные дни. Типичная экономия при использовании white-label вместо разработки с нуля — 60-80% времени и бюджета. Каждый клиент получает индивидуальные иконки, цвета и контент, а вы — один репозиторий и единый CI/CD. Наш опыт — 50+ проектов за 10+ лет — гарантирует чистую архитектуру с первого коммита.
Закажите разработку white-label приложения и получите первичный аудит текущей архитектуры бесплатно.
Например, недавно мы запустили платформу для сети франчайзи: пять брендов, каждый со своей цветовой схемой и набором функций, на единой кодовой базе. Затраты на разработку сократились на 70%, time-to-market нового бренда — 10 дней. В этой статье разберём архитектурные решения, CI/CD и типичные ошибки.
Почему white-label подход лучше разработки с нуля?
Единый репозиторий означает, что вся логика в одном месте, обновления распространяются на всех клиентов. Кастомизация без дублирования достигается с помощью 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, каждый Target может иметь свой набор ресурсов. На Android аналогично, как описано в документации по 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
Разные клиенты часто имеют разный набор функций. Флаги, зашитые в 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) |
| Изоляция кода | Полная (компилятор отсекает неиспользуемое) | Частичная (весь код в сборке) |
Рекомендуем гибрид: статические ресурсы через flavors, а динамические фичи — через runtime флаги.
Этапы разработки white-label приложения
| Этап | Описание | Длительность |
|---|---|---|
| Аналитика | Сбор требований, определение tenants, настройка серверов | 1-2 недели |
| Проектирование | Архитектура, настройка flavors/targets, CI/CD | 1-2 недели |
| Разработка | Реализация модулей, theme engine, feature flags | 4-8 недель |
| Тестирование | Автотесты для каждого tenant, регрессия | 2-3 недели |
| Деплой | Развертывание в магазины, настройка мониторинга | 1 неделя |
Типичные ошибки и как их избежать
Tenant logic в бизнес-коде. (второе выделение) Например, if (tenantId == "brand_a") showSpecialButton() в ViewModel быстро приводит к хаосу. Правильно: tenant-специфичное поведение через DI — внедряйте стратегии в зависимости от flavour.
Shared strings с захардкоженными брендами. (третье выделение) Имя бренда должно быть только в tenant-директории. Используйте ресурсы (strings.xml/Localizable.strings) для каждого бренда отдельно.
Единый Firebase проект. У каждого tenant должен быть свой google-services.json, иначе конфликты аналитики и push-уведомлений.
Отсутствие автотестов для каждого 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 недели. Стоимость рассчитывается индивидуально после анализа требований. Получите бесплатную консультацию по вашему white-label проекту — свяжитесь с нами для оценки.







