Реализация Remote Config для динамического управления параметрами
Remote Config — механизм доставки конфигурационных параметров в мобильное приложение без обновления через App Store или Google Play. Отличие от Feature Toggles: флаги управляют «что показываем», Remote Config управляет «как это работает» — числа, строки, URL, JSON-конфигурации.
Что управляется через Remote Config
- Лимиты и пороговые значения: максимальное число попыток авторизации, timeout для HTTP-запросов, минимальная длина пароля
- URL-адреса эндпоинтов, CDN-домены — переключение между регионами без релиза
- Параметры UI: размер шрифта для определённых рынков, количество товаров в строке для разных размеров экранов
- Конфигурация SDK третьих сторон: ключи API, параметры инициализации (не секретные)
- Сообщения и тексты, которые нужно оперативно изменить (не замена локализации, но для срочных правок)
Firebase Remote Config — стандартная реализация
Firebase Remote Config — наиболее распространённое решение. Параметры хранятся в Firebase Console, доставляются через CDN Google с низкой латентностью (~50ms). SDK кеширует значения локально, при следующем запуске использует кеш, фоном обновляет.
Критически важная настройка: fetch interval. По умолчанию 12 часов — для production это разумно (CDN кеш, защита от rate limit). Для разработки: minimumFetchInterval = 0 в дебаг-сборке. В production при снижении интервала до 1 часа — велик риск превысить Firebase Remote Config quota (10 000 запросов/день на проект на бесплатном плане).
iOS:
let remoteConfig = RemoteConfig.remoteConfig()
let settings = RemoteConfigSettings()
settings.minimumFetchInterval = isDebug ? 0 : 3600
remoteConfig.configSettings = settings
// Устанавливаем дефолты из plist — обязательно
remoteConfig.setDefaults(fromPlist: "RemoteConfigDefaults")
// Fetch + activate с completion
remoteConfig.fetchAndActivate { status, error in
let timeout = remoteConfig["api_timeout_seconds"].numberValue.intValue
// Используем значение
}
Android (Kotlin):
val remoteConfig = Firebase.remoteConfig
remoteConfig.setDefaultsAsync(R.xml.remote_config_defaults)
remoteConfig.fetchAndActivate().addOnCompleteListener { task ->
val maxRetries = remoteConfig.getLong("max_auth_retries").toInt()
}
Дефолтные значения — не опциональная деталь
Если Remote Config недоступен (первый запуск без сети, Firebase outage), приложение работает с дефолтами. Без явно прописанных дефолтов — SDK возвращает пустые строки и нули. api_timeout_seconds = 0 — каждый запрос немедленно тайм-аутится.
Дефолты в iOS — RemoteConfigDefaults.plist, Android — res/xml/remote_config_defaults.xml. Эти файлы — в репозитории, обновляются вместе с кодом. Когда добавляется новый параметр — дефолт добавляется одновременно.
Условные значения (Conditions)
Remote Config поддерживает targeting по: версии приложения, стране/региону, языку устройства, случайному проценту пользователей. Это позволяет:
- Включить новый CDN-эндпоинт только для европейских пользователей
- Показать особую конфигурацию пользователям бета-версии (app version contains "beta")
- Постепенно переключить 10% пользователей на новый алгоритм ленты
Собственный Remote Config сервис
Firebase не всегда подходит: нельзя отправлять данные пользователей в Google, нужны кастомные условия таргетинга, или требуется интеграция с корпоративной IAM-системой.
Минимальная архитектура собственного решения:
- API endpoint
GET /api/config?appVersion=X&platform=ios®ion=eu— возвращает JSON с параметрами - Redis для кеша с TTL 5 минут
- PostgreSQL для хранения параметров и условий
- Webhook или WebSocket для мгновенной инвалидации кеша при изменении
- Admin UI для нетехнических сотрудников
Клиент кеширует ответ в UserDefaults/SharedPreferences с timestamp. При запуске — загружает кеш мгновенно, фоном проверяет обновления.
Сроки: интеграция Firebase Remote Config — 1–2 дня. Собственный Config-сервис с таргетингом и admin UI — 2–3 недели.







