Налаштування Feature Flags у мобільному додатку
Feature flags — механізм включення та вимкнення функцій без оновлення додатка. Звучить як дрібниця, але міняє весь процес розробки: trunk-based development стає можливим, релізний потяг відділяється від готовності фіч, й у вас є kill switch на випадок, якщо нова функція ломає production.
Найчастіше застосування — postmortem protection: фіча у prod ломає платіжний флоу у 5% користувачів, команда не може випустити хотфікс за 2 години через ревю App Store. Флаг вимикається за 30 секунд.
Firebase Remote Config як базовий інструмент
Remote Config — найпростіший спосіб реалізувати флаги без дополнительних SDK:
// iOS
let remoteConfig = RemoteConfig.remoteConfig()
// Дефолтні значення — працюють offline та до першого fetch
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 // 5 хвилин
remoteConfig.activate()
}
// Використання
var isNewPaymentEnabled: Bool {
remoteConfig.configValue(forKey: "new_payment_flow_enabled").boolValue
}
// 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")
}
Головний мінус Firebase Remote Config — немає гнучкого таргетингу. Флаг ввімкнено для всіх або для сегменту за умовами (країна, версія додатка, аудиторія Firebase). Процентний rollout є, але через інтерфейс A/B Testing.
LaunchDarkly для складного таргетингу
Коли потрібен rollout за конкретними user_id, компаніями або складними правилами:
// iOS LaunchDarkly SDK
import LaunchDarkly
let user = LDUser(key: userId, email: userEmail)
LDClient.start(config: LDConfig(mobileKey: "mob-xxx"), user: user)
// Синхронна перевірка флага
let isEnabled = LDClient.shared.boolVariation(forKey: "new_payment_flow", defaultValue: false)
// З контекстом для логування
let (value, detail) = LDClient.shared.boolVariationDetail(forKey: "new_payment_flow", defaultValue: false)
print("Reason: \(detail.reason)") // RULE_MATCH, FALLTHROUGH, OFF...
LaunchDarkly підтримує targeting rules: ввімкнути флаг для користувачів з plan == "enterprise" або для перших 10% користувачів, відсортованих за user_id. Для поступового rollout це точніше, ніж випадковий відсоток.
Організація флагів у коді
Всі флаги в одному місці — не розкидані по бізнес-логіці:
// 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()
}
Якщо флаги централізовані, знайти всі місця використання через grep або рефакторинг — завдання хвилин, а не годин.
Жизненний цикл флага: створення → видалення
Флаги накопичуються й стають техдолгом. Хороша практика — флаг живе максимум 3 місяці:
- Флаг створений — фіча прихована
- Rollout почався — ввімкнути поступово
- 100% користувачів на новій версії → флаг = true для всіх
- Видалити флаг та мертвий код старої поведінки з кодової бази
Якщо не видаляти — через рік у коді буде 40 флагів, половина з яких давно true для 100% аудиторії.
Що входить до роботи
- Підключення Remote Config (Firebase) або LaunchDarkly / Statsig
- Реалізація централізованого
FeatureFlagsшару - Налаштування дефолтних значень для offline-роботи
- Конфігурація targeting rules та rollout відсотків
- Налаштування мониторингу флагів у панелі управління
- Документація жизненного циклу флагів для команди
Сроки
Firebase Remote Config з базовим набором флагів: 0,5–1 день. LaunchDarkly з targeting rules та процентним rollout: 1–2 дні. Вартість розраховується індивідуально.







