Налаштування Feature Flags у мобільному додатку
Feature flags (фіче-флаги) — механізм, що дозволяє вмикати або вимикати функціональність додатку на льоту без публікації нового білда. Для мобільних додатків це особливо критично: App Review може затягнутися на добу, а помилка в проді здатна паралізувати роботу. Уявіть: нова фіча ламає платіжний флоу у 5% користувачів. Хотфікс через App Store потребує 2 години, а kill switch на флазі спрацює за 30 секунд. У більш ніж 50 проектах ми переконалися: feature flags — це не опція, а необхідність для trunk-based development і безпечних релізів. Наприклад, один із наших клієнтів втратив $50,000 через 10-хвилинний простій — після впровадження флагів час реакції на збої скоротився до секунд. Ми гарантуємо стабільну роботу вашого додатку за допомогою грамотного налаштування флагів.
Стеки: iOS (Swift 5.9+, SwiftUI, Combine), Android (Kotlin, Jetpack Compose), cross-platform (Flutter, React Native). Інструменти: Firebase Remote Config, LaunchDarkly. За визначенням Wikipedia, feature flags — техніка, що змінює поведінку системи без зміни коду.
Чому feature flags критичні для мобільних додатків?
Без флагів кожна нова функція — ризик. App Store Review може затягнутися, а помилка в релізі призведе до втрати користувачів. Feature flags дозволяють:
- Плавно вмикати фічі для частини аудиторії (rollout).
- Відключати проблемний код без релізу (kill switch).
- Тестувати нові версії на реальних користувачах (A/B тестування).
Згідно з документацією Firebase, Remote Config підтримує до 2000 параметрів і оновлюється за секунди. Це базовий інструмент, але для складних сценаріїв знадобиться LaunchDarkly.
Який інструмент обрати: Firebase Remote Config чи LaunchDarkly?
Таргетинг LaunchDarkly в 10 разів точніший, ніж у Remote Config, завдяки підтримці user_id та custom attributes.
| Критерій | Firebase Remote Config | LaunchDarkly |
|---|---|---|
| Вартість | Безкоштовно (в рамках Firebase) | Платний, від $100/міс |
| Таргетинг по user_id | Ні (тільки по сегментах Firebase) | Так, з правилами targeting |
| Rollout за відсотками | Так (через A/B Testing) | Так, з точністю до 1% |
| Моніторинг флагів | Вбудований Dashboard | Розширений, з аналітикою |
| SDK для iOS/Android | Так, офіційний | Так, офіційний |
| Робота без інтернету | Так, з дефолтними значеннями | Так, з кешем |
Вибір залежить від ваших завдань. Для простого kill switch і A/B тестів достатньо Remote Config. Для кастомних правил (наприклад, увімкнути фічу тільки користувачам з планом "Enterprise") краще взяти LaunchDarkly — він масштабується під будь-яку складність.
Типи feature flags
| Тип флага | Призначення | Час життя |
|---|---|---|
| Kill switch | Аварійне відключення функції | Постійно |
| Rollout | Поступове включення нової фічі | До 100% |
| A/B тест | Порівняння двох варіантів | 2-4 тижні |
| Permission | Включення за ролями користувачів | Постійно |
Налаштування Firebase Remote Config (iOS)
// iOS let remoteConfig = RemoteConfig.remoteConfig() remoteConfig.setDefaults([ "new_payment_flow_enabled": false as NSObject, "chat_feature_enabled": false as NSObject, "max_cart_items": 50 as NSObject ]) remoteConfig.fetch(withExpirationDuration: 300) { status, error in remoteConfig.activate() } var isNewPaymentEnabled: Bool { remoteConfig.configValue(forKey: "new_payment_flow_enabled").boolValue } Налаштування Firebase Remote Config (Android)
// Android val remoteConfig = Firebase.remoteConfig remoteConfig.setDefaultsAsync(mapOf( "new_payment_flow_enabled" to false, "chat_feature_enabled" to false )) remoteConfig.fetchAndActivate().addOnCompleteListener { task -> val isNewPaymentEnabled = remoteConfig.getBoolean("new_payment_flow_enabled") } Організація флагів у коді
Всі флаги в одному місці — не розкидані по бізнес-логіці:
// FeatureFlags.swift struct FeatureFlags { private let remoteConfig = RemoteConfig.remoteConfig() var isNewPaymentFlowEnabled: Bool { remoteConfig.configValue(forKey: "new_payment_flow_enabled").boolValue } var isChatEnabled: Bool { remoteConfig.configValue(forKey: "chat_feature_enabled").boolValue } var maxCartItems: Int { Int(remoteConfig.configValue(forKey: "max_cart_items").numberValue) } } if AppDependencies.featureFlags.isNewPaymentFlowEnabled { showNewPaymentFlow() } else { showLegacyPaymentFlow() } Приклад реалізації флага на SwiftUI
struct ContentView: View { @AppDependency(\.featureFlags) var featureFlags var body: some View { if featureFlags.isNewPaymentFlowEnabled { NewPaymentView() } else { LegacyPaymentView() } } } Lifecycle флага: створення → видалення
Флаги накопичуються і стають техборгом. Хороша практика — флаг живе максимум 3 місяці:
- Флаг створено — фіча прихована
- Rollout розпочато — вмикаємо поступово
- 100% користувачів на новій версії → флаг = true для всіх
- Видаляємо флаг і мертвий код старого поведінки з кодової бази
Якщо не видаляти — через рік у коді буде 40 флагів, половина з яких давно true для 100% аудиторії. Наші інженери проводять регулярний аудит флагів, щоб уникнути цієї ситуації. В одному з проектів ми скоротили кількість флагів з 35 до 8 за місяць, прискоривши rollout нових фіч на 40%.
Як feature flags врятували проект? Кейс з нашої практики
При впровадженні нової системи автоплатежів у мобільному банкінгу ми використовували три флаги: kill switch для екстреного відключення, rollout для поступового включення та permission для доступу VIP-клієнтів. Kill switch дозволив відключити фічу за 10 секунд, коли legacy-система не впоралася з навантаженням. Збиток міг становити $100,000, але kill switch запобіг цьому. Без флагів довелося б відкочувати версію через App Store — мінімум 2 години простою.
Процес впровадження feature flags
- Аналіз: визначаємо, які фічі потребують флагів, обираємо інструмент (Firebase або LaunchDarkly)
- Проектування: створюємо централізований шар FeatureFlags, налаштовуємо дефолтні значення
- Реалізація: підключаємо SDK, пишемо обгортку для бізнес-логіки
- Тестування: перевіряємо роботу флагів offline, коректне перемикання
- Деплой: налаштовуємо дашборд та правила rollout
Що входить у роботу з впровадження feature flags
- Аудит поточного релізного процесу та визначення критичних фіч.
- Вибір та налаштування інструменту (Firebase Remote Config або LaunchDarkly).
- Розробка централізованого шару доступу до флагів на iOS та Android.
- Документація з управління флагами та процедурою rollout.
- Навчання команди: як додавати нові флаги та видаляти старі.
- Технічна підтримка протягом першого місяця після впровадження.
Термін виконання
Firebase Remote Config з базовим набором флагів: 0,5–1 день. LaunchDarkly з targeting rules і відсотковим rollout: 1–2 дні. Вартість розраховується індивідуально.
Зв'яжіться з нами для консультації — ми оцінимо ваш проект і запропонуємо план впровадження. Замовте впровадження feature flags вже сьогодні — це захистить ваш релізний процес від дорогих простоїв.







