Кастомизация White-Label мобильного приложения под бренд клиента
Вы передаёте готовое white-label приложение новому клиенту и тут же сталкиваетесь с задачей адаптации под его фирменный стиль. Без правильной архитектуры ресурсов замена логотипа, цветов и шрифтов превращается в многочасовой поиск каждого хардкодного значения. На одном проекте мы насчитали 47 инстансов цвета #1A73E8, разбросанных по layout-файлам. После рефакторинга с выносом в colors.xml ребрендинг нового клиента стал занимать 2 часа вместо 3 дней. За 5+ лет работы с 30+ white-label проектами мы выработали шаблон tenant-структуры, который сокращает время ребрендинга до 1–3 дней.
Почему стандартный подход к брендированию тормозит запуск?
Типичная ошибка — цвета зашиты в layout-файлах, строки с именем бренда — в коде, шрифты — в проперти. При каждой смене клиента разработчик тратит часы на поиск и замену. Автоматизация через Fastlane делает ребрендинг в 2–3 раза быстрее ручного подхода и исключает ошибки.
Какие элементы приложения меняются при ребрендинге?
Визуальная идентичность
Иконка приложения. На iOS нужны иконки в 15+ размерах для всех устройств и App Store. Современный подход — одна AppIcon.appiconset с одним исходным изображением 1024×1024 и автогенерацией через Xcode или Fastlane appicon. На Android — адаптивная иконка (mipmap-anydpi-v26/ic_launcher.xml) с foreground и background слоями: фон бренда + логотип.
Цветовая схема. Все цвета должны быть вынесены в colors.xml (Android) или Assets.xcassets → Color Set (iOS). Прямые hex-значения в layout или коде — признак того, что ребрендинг займёт несколько дней вместо нескольких часов.
<!-- Android: res/values/colors.xml для конкретного tenant -->
<resources>
<color name="color_primary">#1A73E8</color>
<color name="color_primary_variant">#1557B0</color>
<color name="color_secondary">#FB8C00</color>
<color name="color_surface">#FFFFFF</color>
<color name="color_on_primary">#FFFFFF</color>
<color name="color_error">#B00020</color>
</resources>
Шрифты. Брендовый шрифт подключается через res/font/ (Android) или через Info.plist UIAppFonts (iOS). Если шрифт платный — проверяем лицензию на мобильное использование (Desktop/Web лицензия не покрывает встраивание в приложение).
Тексты и локализация: Все тексты, которые содержат имя бренда, слоганы или описания — в strings.xml / Localizable.strings в директории tenant. Никаких захардкоженных строк в общем коде. Splash screen text, onboarding-тексты, заголовок в tab bar — всё переопределяется без изменения кода.
Экраны онбординга и splash: Splash screen на iOS реализуется через LaunchScreen.storyboard (или Launch Screen в Info.plist для SwiftUI). На Android — через SplashScreen API (Android 12+) с брендовым иконом и фоном:
// Android 12+ SplashScreen с брендовым цветом
installSplashScreen().apply {
setKeepOnScreenCondition { viewModel.isLoading.value }
}
Тема для splash:
<style name="Theme.App.SplashScreen" parent="Theme.SplashScreen">
<item name="windowSplashScreenBackground">@color/color_primary</item>
<item name="windowSplashScreenAnimatedIcon">@drawable/ic_splash_logo</item>
</style>
Как автоматизировать ребрендинг через Fastlane?
Ручная замена ресурсов при добавлении каждого нового tenant — источник ошибок. Fastlane action для применения брендинга:
# Fastfile
lane :apply_branding do |options|
tenant = options[:tenant]
brand_dir = "tenants/#{tenant}"
# Копируем ресурсы
sh "cp #{brand_dir}/AppIcon.png fastlane/metadata/#{tenant}/app_icon.png"
sh "cp -r #{brand_dir}/assets.xcassets ios/MyApp/#{tenant}.xcassets"
# Обновляем Bundle ID
update_app_identifier(
xcodeproj: "ios/MyApp.xcodeproj",
plist_path: "MyApp/Info.plist",
app_identifier: "com.#{tenant}.app"
)
# Обновляем Display Name
update_info_plist(
plist_path: "ios/MyApp/Info.plist",
display_name: options[:display_name]
)
end
fastlane apply_branding tenant:brand_b display_name:"Brand B"
fastlane ios build tenant:brand_b
Fastlane — не единственный вариант. Аналогичные скрипты можно написать на Bash или Makefile. Главное — единая точка входа для всех tenant-ресурсов.
Совет: Начинайте новый white-label проект с выделенной tenant-директории для каждого клиента. Храните все изменяемые ресурсы: иконки, цвета, шрифты, строки, конфиги. Это сэкономит часы при добавлении следующего клиента.
Сравнение ручного и автоматизированного брендирования
| Подход |
Время на одного клиента |
Вероятность ошибки |
Масштабируемость |
| Ручная замена ресурсов |
3–7 дней |
Высокая |
Плохая (линейный рост) |
| Автоматизация через Fastlane |
1–3 дня |
Низкая |
Отличная (добавление клиента за минуты) |
Чеклист кастомизации нового tenant
| Элемент |
iOS |
Android |
| Иконка приложения |
AppIcon.appiconset |
mipmap + adaptive icon |
| Цвета |
Assets Color Set |
colors.xml |
| Шрифты |
Info.plist + .ttf/.otf |
res/font/ |
| Строки |
Localizable.strings |
strings.xml |
| Splash screen |
LaunchScreen.storyboard |
SplashScreen theme |
| Bundle ID / Package |
Xcode Target settings |
applicationId в flavor |
| Firebase config |
GoogleService-Info.plist |
google-services.json |
| Push entitlements |
.entitlements |
— |
| Deep link scheme |
Info.plist URL Schemes |
intent-filter |
| App Store metadata |
Connect → App Information |
Play Console |
Что входит в работу по кастомизации?
При заказе услуги мы подготавливаем:
- Документация: схема tenant-директорий, инструкция по добавлению нового клиента.
- Доступы: App Store Connect, Google Play Console, Firebase, TestFlight (ваши аккаунты).
- Обучение: сессия для вашего QA по проверке брендинга.
- Поддержка: 2 недели после деплоя — исправление неточностей в визуале.
Сравните: создание white-label приложения с нуля под одного клиента стоит в 5–10 раз дороже, чем кастомизация готового решения. При масштабировании на 10+ клиентов экономия ресурсов превышает 80%.
Ориентиры по срокам
Кастомизация готового white-label приложения под нового клиента при правильно настроенной структуре ресурсов — 1–3 дня. Если ресурсы не были вынесены в tenant-директории и требуется рефакторинг для нескольких мест хардкода — 3–7 дней. Стоимость рассчитывается индивидуально.
Свяжитесь с нами — оценим ваш проект за 2 часа. Работаем с 30+ white-label проектами на iOS и Android. Получите консультацию по вашему кейсу.
White-label мобильные приложения: SDK, модульная архитектура и мультиарендность
В нашей практике white-label разработка – не просто «перекрасить приложение». Это архитектурное решение, которое необходимо закладывать на старте. Мы не раз сталкивались с попытками переделать монолитное приложение под white-label постфактум – это один из самых дорогих рефакторингов в мобильной разработке. За 5 лет работы мы реализовали 20+ white-label проектов для iOS, Android и кросс-платформенных стеков. Гарантируем: правильная модульная архитектура сокращает время адаптации нового клиента до 2 дней, а не 2 месяцев. White-label продукт (Wikipedia) – это не просто смена логотипа, а полноценная мультиарендная система. Получите консультацию по 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: отдельные поддомены (clienta.api.example.com). Вариант 3: tenant из JWT-токена после аутентификации.
На уровне мобильного приложения: tenant ID либо зашит в конфигурацию при сборке (через xcconfig / gradle.properties), либо определяется динамически (по bundle ID или через Remote Config). Динамическое определение нужно если один бинарник обслуживает нескольких клиентов – редкий, но реальный кейс для enterprise.
Экономия от мультиарендной архитектуры по сравнению с выделенными бэкендами – до 60% на операционных расходах при 5+ клиентах.
Как правильно спроектировать white-label архитектуру?
Пошаговый подход, который мы применяем:
-
Анализ – определяем домены, которые будут общими для всех клиентов, и точки кастомизации.
-
Выбор стека – для iOS Swift Packages + XCFramework; для Android Gradle multi-module + AAR; для кросс-платформы – Flutter/Dart package или React Native library.
-
Проектирование конфигурации – JSON-схема бренда (colors, fonts, feature flags, ссылки), валидация на клиенте.
-
Реализация модулей – каждый модуль публикует протокол/интерфейс; конкретная реализация инъектируется через DI-контейнер (Swinject, Dagger Hilt).
-
Автоматизация сборки – Fastlane + CI pipeline с параметром CLIENT_ID.
-
Тестирование – UI-тесты для каждого бренда (скриншотное тестирование с Percy или Firebase Test Lab).
-
Деплой – параллельная загрузка в App Store Connect / Google Play Console через распределённые билды.
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 месяц гарантийного сопровождения после релиза.
Сроки ориентировочно
| Тип задачи |
Сроки |
| Рефакторинг монолита в white-label архитектуру |
2–3 месяца |
| Новое white-label приложение с нуля (iOS / Android) |
3–4 месяца |
| Разработка мобильного SDK |
от 6 недель (простой), от 3 месяцев (полнофункциональный) |
Стоимость рассчитывается индивидуально – зависит от количества модулей, платформ и глубины кастомизации. Закажите бесплатный анализ вашей архитектуры – мы оценим объём работ за 2 дня. Свяжитесь с нами, чтобы обсудить ваш white-label проект – гарантируем соблюдение App Store Review Guidelines и Google Play policies.