Реалізація 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 у debug-збірці. У production при зниженні інтервалу до 1 години — велик ризик перевищити Firebase Remote Config квоту (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 — кожен запит миттєво timeout'ується.
Дефолти на 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 тижні.







