Інтеграція Firebase Remote Config в мобільний додаток
Додаток виктатили, а через тиждень маркетинг просить змінити колір кнопки, текст банера або поріг суми для безплатної доставки. Без Remote Config — це hotfix, ревю, релиз, очікування модерації. З ним — змінення в консолі Firebase, яке потрапляє у production за хвилини.
Як Remote Config працює під капотом
Remote Config — це Key-Value сховище з серверною стороною в Firebase Console та client SDK на iOS/Android/Flutter. При старті додатку запитує свіжі значення, Firebase повертає JSON-пакет, SDK кешує його локально. Якщо мережа недоступна — використовуються останні кешовані значення або вбудовані за замовчуванням.
Ключовий момент: fetch() та activate() — це два окремі дії. fetch завантажує конфіг в staging-кеш, activate застосовує його в runtime. Розділення зроблено навмисне — щоб не зламати поточну сесію користувача застосуванням нового конфіга прямо посеред роботи.
// iOS, Swift
let remoteConfig = RemoteConfig.remoteConfig()
let settings = RemoteConfigSettings()
settings.minimumFetchInterval = 3600 // у production — 1 година, у debug можна 0
remoteConfig.configSettings = settings
// Значення за замовчуванням — обов'язкові, інакше значення nil до першого fetch
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)
}
}
Де ломається на практиці
Кеш та minimumFetchInterval. У production Firebase жорстко обмежує частоту запитів: 5 fetch-запитів на годину на один пристрій. Перевищення повертає ThrottledException. Команди часто натрапляють на це у QA: тестер оновлює значення в консолі, але додаток продовжує показувати старі дані. Рішення — у debug-збірках встановити minimumFetchIntervalInSeconds = 0, у production залишити 3600.
Значення за замовчуванням не встановлені. Якщо до першого успішного fetch (наприклад, без інтернету) звернутися до ключа без значення за замовчуванням — отримаєте nil або порожню строку. Додаток не крашиться, але поведінка непередбачувана. Значення за замовчуванням повинні покривати всі ключі, які використовує додаток.
Гонка стану при запуску. fetchAndActivate — асинхронний. Якщо UI рендериться раніше, ніж завершиться fetch, користувач бачить значення за замовчуванням. Для критичних параметрів (наприклад, флаг показу paywall) краще завантажувати конфіг ще на splash-екрані та блокувати перехід до отримання відповіді — з timeout 2–3 секунди.
Умовні значення та сегментація
Справжня сила Remote Config — conditions. Можна встановлювати різні значення для:
- конкретних версій додатку (
app_version < 2.5.0) - платформи (iOS vs Android)
- країни користувача
- довільної
user_property, встановленої через Firebase Analytics
Наприклад, показувати новий onboarding тільки користувачам iOS 16+ у Росії — без окремого релізу.
Що входить у роботу
- Підключення Firebase SDK (через SPM на iOS, Gradle на Android,
firebase_remote_configна Flutter) - Налаштування
RemoteConfigSettingsз правильними інтервалами для debug/release - Файл значень за замовчуванням, що покриває всі ключі
- Допоміжний клас з типізованим доступом до значень (без строкових ключів в коді)
- Інтеграція з точкою ініціалізації додатку (AppDelegate / Application)
Термін
Базова інтеграція з типізованим допоміжним класом: 1 день. Вартість розраховується індивідуально після аналізу вимог.







