Ми часто стикаємося з запитами клієнтів на оперативну зміну параметрів застосунку без повного циклу релізу. Наприклад, потрібно змінити колір promo-кнопки або поріг безкоштовної доставки. Без Remote Config це вимагає хотфіксу, повторного рев'ю та очікування модерації в App Store або Google Play — від кількох годин до доби. З Remote Config достатньо змінити значення в консолі Firebase, і протягом 20–30 секунд новий конфіг застосовується на всіх пристроях. При цьому не потрібне оновлення версії застосунку. Ми використовуємо цей інструмент у всіх проєктах, де важлива гнучкість керування користувацьким досвідом — за останні 5 років інтегрували його в 200+ мобільних застосунків, які обслуговують понад 500 000 активних користувачів сумарно.
Як Firebase Remote Config працює під капотом
Remote Config — це Key-Value сховище з серверною стороною в Firebase Console і клієнтським SDK на iOS/Android/Flutter. Firebase Remote Config Documentation описує дві ключові дії: fetch() та activate(). fetch завантажує конфіг у staging-кеш, activate застосовує його в рантаймі. Розділення навмисне — щоб не ламати поточну сесію користувача. Час життя кешу задається через minimumFetchInterval: у продакшені 3600 секунд, у дебазі можна 0.
// iOS, Swift let remoteConfig = RemoteConfig.remoteConfig() let settings = RemoteConfigSettings() settings.minimumFetchInterval = 3600 // у проді — 1 година, у дебазі можна 0 remoteConfig.configSettings = settings // Дефолти — обов'язкові, інакше до першого fetch значення nil remoteConfig.setDefaults(fromPlist: "RemoteConfigDefaults") remoteConfig.fetchAndActivate { status, error in if status == .successFetchedFromRemote || status == .successUsingPreFetchedData { let buttonColor = remoteConfig["promo_button_color"].stringValue ?? "#FF5722" DispatchQueue.main.async { self.applyConfig(buttonColor) } } } На Android через Kotlin:
val remoteConfig = Firebase.remoteConfig remoteConfig.setConfigSettingsAsync(remoteConfigSettings { minimumFetchIntervalInSeconds = 3600 }) remoteConfig.setDefaultsAsync(R.xml.remote_config_defaults) remoteConfig.fetchAndActivate().addOnCompleteListener { task -> if (task.isSuccessful) { val threshold = remoteConfig.getLong("free_delivery_threshold") updateCartUI(threshold) } } Чому дефолти критично важливі?
Якщо до першого успішного fetch (наприклад, при відсутності інтернету) звернутися до ключа без дефолту — отримаєте nil або порожній рядок. Застосунок не крашиться, але поведінка непередбачувана. Дефолти повинні покривати всі ключі, які використовує застосунок. Рекомендуємо зберігати їх в окремому файлі (Plist для iOS, XML для Android) і синхронізувати з ключами в Firebase Console. Ми гарантуємо, що після налаштування дефолтів у вас не буде сюрпризів при першому запуску. В одному з проєктів відсутність дефолту призвела до того, що 15% користувачів бачили заглушку замість банера — виправлення зайняло 2 хвилини в консолі.
Як уникнути стану гонки при запуску?
fetchAndActivate — асинхронний. Якщо UI малюється раніше, ніж завершиться fetch, користувач бачить дефолтні значення. Для критичних параметрів (наприклад, прапорець показу paywall) краще завантажувати конфіг ще на сплеш-екрані та блокувати перехід до отримання відповіді — з таймаутом 2–3 секунди. Ми застосовуємо цей підхід у кожному проєкті: затримка непомітна для користувача, а логіка працює стабільно.
Як налаштувати умовні значення для A/B тестів?
Справжня сила Remote Config — умови. Можна задавати різні значення для:
- конкретних версій застосунку (
app_version < 2.5.0) - платформи (iOS vs Android)
- країни користувача
- довільного
user_property, заданого через Firebase Analytics
Наприклад, показувати новий onboarding тільки користувачам iOS 16+ в Росії — без окремого релізу. Це прискорює A/B тести та кастомізацію під регіони. Для експерименту в A/B Testing створюється конфігурація, яка призначає різні значення для контрольної та тестової груп. Результати відстежуються через Firebase Analytics. Типова економія часу — до 40 годин на кожному фічі-флагу, який раніше вимагав релізу.
Типова помилка: забули дефолти
При першому запуску без мережі fetch не виконується, і значення ключів без дефолтів стають null. Щоб цього уникнути, завжди задавайте дефолти для всіх ключів. Рекомендуємо зберігати їх в окремому файлі та синхронізувати з консоллю Firebase. В одному проєкті відсутність дефолту призвела до того, що 15% користувачів бачили заглушку замість банера — виправлення зайняло 2 хвилини в консолі.Таблиця: Платформи та початкове налаштування
| Параметр | iOS (Swift) | Android (Kotlin) | Flutter (Dart) |
|---|---|---|---|
| Підключення SDK | Swift Package Manager firebase-ios-sdk |
Gradle com.google.firebase:firebase-config |
firebase_remote_config pub.dev |
| Дефолти | Plist-файл | XML-файл (remote_config_defaults.xml) |
Dart-мапа в setDefaults |
| Мінімальний інтервал | minimumFetchInterval = 3600 |
minimumFetchIntervalInSeconds = 3600 |
setMinimumFetchInterval(3600) |
| Отримання значення | config["key"].stringValue |
config.getLong("key") |
config.getString("key") |
| Типізація | Helper-клас з enum | Helper-клас з sealed class | Helper-клас з const |
Таблиця: Популярні типи умов
| Умова | Приклад | Застосування |
|---|---|---|
| Версія застосунку | app_version < 2.5.0 |
Включити фічу тільки для старих версій |
| Країна | country == "RU" |
Локалізувати offer |
| Користувацький параметр | user_property["premium"] == "true" |
A/B тест серед платячих користувачів |
| Випадковий відсоток | random_percent < 10 |
Поступовий rollout нової фічі |
Що входить в роботу
- Підключення Firebase SDK (через SPM на iOS, Gradle на Android,
firebase_remote_configна Flutter) - Налаштування
RemoteConfigSettingsз правильними інтервалами для debug/release - Файл дефолтів, що покриває всі ключі
- Хелпер-клас з типізованим доступом до значень (без строкових ключів у коді)
- Інтеграція з точкою ініціалізації застосунку (AppDelegate / Application)
Строки та вартість
Базова інтеграція з типізованим хелпером займає 1 день. Вартість розраховується індивідуально після аналізу вимог. Звертайтеся за консультацією: ми допоможемо оцінити обсяг робіт і налаштувати Remote Config під ваші завдання. Отримайте консультацію — і ви побачите, як просто керувати фічами без релізів. Зв'яжіться з нами, щоб обговорити ваш проєкт.







