LaunchDarkly — это платформа управления функциональными флагами, которая позволяет разработчикам мобильных приложений включать и отключать возможности без повторного деплоя. По данным LaunchDarkly, 2024, более 4000 компаний используют сервис для безопасного запуска новых функций, A/B тестирования и постепенного rollout в реальном времени.
Главное
LaunchDarkly — это платформа управления функциональными флагами, основанная в 2014 году компанией Catamorphic Corp. Основная задача сервиса — дать командам разработки возможность включать, отключать и настраивать функции приложения в реальном времени без деплоя нового кода.
В отличие от традиционного подхода, где релиз новой функциональности требует публикации версии в магазине приложений, LaunchDarkly позволяет менять поведение удалённо. Для мобильной разработки это особенно важно — ревью в App Store и Google Play занимает от нескольких часов до суток, а флаг можно переключить за секунды.
Архитектура LaunchDarkly строится на трёх компонентах: сервер флагов, клиентские SDK и панель управления. Сервер хранит конфигурации флагов, правила включения и сегменты пользователей. SDK поддерживает постоянное SSE-соединение с сервером для получения обновлений в реальном времени.
При изменении флага в дашборде сервер отправляет обновление всем подключённым SDK. Задержка составляет 200–500 миллисекунд. При потере соединения SDK использует последнее кешированное состояние до восстановления канала. Это гарантирует, что приложение продолжает работать с актуальными на момент разрыва настройками.
Панель управления LaunchDarkly предоставляет визуальный интерфейс для создания и управления флагами. Дашборд показывает текущее состояние каждого флага, историю изменений с аудитом, кто и когда менял конфигурацию, а также метрики использования. Для каждой среды можно настроить отдельные правила — флаг на staging может быть включён на 100%, а на production — на 5%.
Feature flag — это именованный переключатель с правилами и целями. Флаги бывают boolean, multivariate и JSON. Rules определяют условия включения: например, «включить для 10% пользователей Android 12 из Германии». Segments группируют пользователей по версии ОС, региону, модели устройства и произвольным атрибутам.
Каждый флаг имеет окружения: development, staging и production. Это позволяет тестировать новую функцию в изолированном окружении, прежде чем включить её для реальных пользователей. Правила окружений настраиваются независимо — флаг может быть включён на staging и выключен на production.
LaunchDarkly предоставляет нативные SDK для Android, iOS, React Native и Flutter. Каждый SDK требует минимальной настройки: SDK key и идентификатор пользователя. Библиотека автоматически управляет подключением, кешированием и обработкой ошибок.
Для подключения создаётся экземпляр LDClient в Application.onCreate. Клиент принимает конфигурацию с mobile key и контекст пользователя. После инициализации приложение вызывает вариацию флага в любом месте кода методом boolVariation.
class MyApplication : Application() {
private lateinit var ldClient: LDClient
override fun onCreate() {
super.onCreate()
val config = LDConfig.Builder("mobile-key-abc123")
.build()
val user = LDUser.Builder("user-unique-id")
.build()
ldClient = LDClient.init(this, config, user)
}
}
После инициализации проверка флага выполняется одним методом. BoolVariation возвращает значение согласно правилам флага. Значение по умолчанию используется, если SDK не удалось получить конфигурацию. Метод boolVariationDetail дополнительно возвращает причину, по которой флаг принял данное значение.
val ldClient = LDClient.get()
val showNewFeature = ldClient.boolVariation(
"new-checkout-flow",
false
)
if (showNewFeature) {
showNewCheckoutScreen()
} else {
showLegacyCheckoutScreen()
}
A/B тестирование в LaunchDarkly реализуется через multivariate флаги. Каждому варианту присваивается процент трафика — например, 50% пользователей видят старый экран (вариант A) и 50% — новый (вариант B). Платформа фиксирует пользователя, гарантируя, что он всегда попадает в одну и ту же группу.
Поэтапный rollout увеличивает процент пользователей с доступом к функции постепенно. Типичный график: 1% — первый день, 5% — второй, 25% — третий, 100% — через неделю. При обнаружении ошибки флаг отключается мгновенно для всех. LaunchDarkly интегрируется с Amplitude, Mixpanel и Google Analytics для отслеживания метрик каждой вариации.
Платформа предоставляет встроенную систему экспериментов, которая автоматически вычисляет статистическую значимость различий между вариантами. Доступны метрики: конверсия, retention, количество сессий, ошибки и пользовательские события. Результаты отображаются в дашборде с визуализацией confidence intervals. Эксперименты можно запускать как на production-трафике, так и на выделенных сегментах пользователей.
Интеграция LaunchDarkly с аналитическими платформами — ещё одно преимущество. Данные о флагах автоматически отправляются в Amplitude, Mixpanel, Google Analytics или собственный data pipeline через Data Export API. Это позволяет строить отчёты по влиянию каждой функции на ключевые метрики приложения. LaunchDarkly также поддерживает webhooks для уведомления внешних систем об изменении состояния флагов.
Рассмотрим полный цикл: добавление зависимости, инициализация и проверка флага для телеметрии крашей. Функция должна быть активна только для тестеров, но не для реальных пользователей. LaunchDarkly SDK для Android доступен через Maven Central. Версия 5.x поддерживает Kotlin Coroutines и Jetpack Compose для реактивного получения обновлений флагов.
Для iOS-приложений LaunchDarkly предоставляет Swift Package Manager и CocoaPods поддержку. Swift SDK использует async/await для асинхронной инициализации и Combine framework для подписки на изменения. Оба SDK (Android и iOS) поддерживают фоновую синхронизацию и кеширование в локальном хранилище для работы в офлайн-режиме.
// app/build.gradle
dependencies {
implementation "com.launchdarkly:launchdarkly-android-sdk:5.2.0"
}
В классе CrashReporter проверяем флаг crash-reporting-enabled. Если флаг включён для текущего пользователя — запускаем отправку краш-репортов. SDK автоматически получит новое состояние при изменении на сервере, но для инициализации достаточно однократной проверки.
class CrashReporter {
fun init() {
val client = LDClient.get()
if (client.boolVariation("crash-reporting-enabled", false)) {
Crashlytics.start()
}
}
}
Успешные сценарии: управление платёжным флоу с мгновенным отключением при сбоях провайдера, поэтапный rollout UI-изменений с мониторингом метрик, персонализация контента по сегментам. По данным официального блога LaunchDarkly, команды сокращают время восстановления после ошибок с часов до минут.
Anti-паттерны: использование флагов для постоянной условной логики (флаги временные), хранение секретов в атрибутах флагов, создание перекрывающихся правил. Рекомендация: удаляйте флаг из кода после завершения rollout — это предотвращает технический долг и усложнение кодовой базы. Ещё одна распространённая ошибка — использование флагов для долгоживущих переключателей, которые никогда не удаляются из кода после стабилизации функции.
Правильная стратегия управления флагами включает план удаления для каждого нового флага. LaunchDarkly предоставляет встроенные инструменты для обнаружения неиспользуемых флагов — флаг считается неиспользуемым, если SDK не проверял его значение более 30 дней. Такие флаги помечаются в дашборде, и их можно безопасно удалить из кода.
Для небольших проектов с одной командой LaunchDarkly может быть избыточен — достаточно простого conditional в коде или Firebase Remote Config. Выбирайте платформу, когда требуется сложная сегментация, аудит изменений, A/B эксперименты или мульти-командное управление флагами. Для стартапов и MVP-проектов LaunchDarkly предлагает бесплатный Starter-план с ограничением на количество флагов и MAU.
Совместимость LaunchDarkly с существующими инструментами — важный критерий выбора. Платформа интегрируется с Jira, Slack, PagerDuty, Datadog и другими сервисами через webhooks и API. Команды, уже использующие эти инструменты, получают бесшовную интеграцию без дополнительной инфраструктуры для мониторинга и оповещений при изменении состояния флагов. LaunchDarkly также поддерживает Terraform-провайдер для управления флагами как кодом (Flags as Code) — это позволяет хранить конфигурацию флагов в Git и проходить code review перед применением.
Часто задаваемые вопросы
LaunchDarkly предлагает Freemium-тариф с ограничением на количество флагов и MAU. Коммерческие планы для команд стартуют от $150 в месяц, включая неограниченные флаги, аудит изменений и интеграцию с Jira и Slack.
Платформа поддерживает более 40 SDK, включая нативные Android (Kotlin/Java), iOS (Swift/Objective-C), React Native и Flutter. Все мобильные SDK работают через Streaming API с кешированием в локальном хранилище.
Да, LaunchDarkly имеет встроенную систему экспериментов с multivariate флагами, распределением трафика и автоматическим расчётом статистической значимости. Поддерживается интеграция с Amplitude, Mixpanel и Google Analytics.
При потере соединения SDK использует кешированные значения флагов из локального хранилища. После восстановления соединения SDK синхронизируется с сервером и применяет актуальные состояния флагов.
LaunchDarkly предоставляет A/B тестирование, мульти-вариантные флаги, сложную сегментацию, аудит изменений и SDK для серверных языков. Firebase Remote Config проще и бесплатен, но не поддерживает многовариантные эксперименты и детальный аудит.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также