Настройка переменных окружения для iOS, Android, React Native, Flutter

Сборки падают из-за неверных значений окружения, а релиз срывается в самый неподходящий момент. Мы настраиваем переменные окружения мобильного приложения под ключ: разделяем среды, убираем ручные правки и сокращаем время подготовки сборки более чем вдвое. Обсудим задачу — вернёмся с оценкой и планом.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Настройка переменных окружения для iOS, Android, React Native, Flutter
Простой
от 1 дня до 3 дней
Часто задаваемые вопросы

Почему сборка ломается на переменных окружения

Приложение стабильно работает на машине разработчика, а на сборке падает с пустым экраном или отказом авторизации — почти всегда причина в переменных окружения мобильного приложения. Локально значения подтягиваются из незакоммиченного файла, который есть только у автора кода. В сборке ios android этот файл отсутствует, подставляется пустая строка или значение по умолчанию — и конфигурация разваливается на этапе запуска, а не компиляции.

Классический сценарий: адрес сервиса и ключи прописаны прямо в исходниках под конкретную среду. Стоит переключиться с разработки на тестовый контур — приложение ходит на боевой сервер или получает отказ по несовпадающему идентификатору. Ошибки конфигурации всплывают уже после релиза, когда воспроизвести их вне устройства почти невозможно.

Отдельная и более дорогая проблема — секреты в репозитории. Ключи платёжных систем, доступы к аналитике и push-сервисам лежат в истории коммитов открытым текстом. Утечка обнаруживается постфактум, а смена ключа требует пересборки и повторной публикации во всех магазинах.

Корень в том, что разные среды — разработка, тест, предпродакшн, продакшн — не разделены на уровне сборки. Значения подставляются вручную, зависят от того, кто и с какой машины запускает сборку, и не проверяются перед выкладкой. Разбираем, как это закрывается: единый источник значений, автоматическая подстановка под каждую среду и защита секретов от попадания в репозиторий.

Что даёт управляемая конфигурация сред

Управление конфигурацией убирает самый дорогой класс ошибок в мобильной разработке — когда приложение уходит в стор с адресом тестового стенда или ключом от чужой среды. Когда значения вынесены из кода в отдельные профили, сборка перестаёт зависеть от того, что разработчик помнил в момент коммита: конфигурация версионируется вместе с кодом, проверяется на этапе сборки и не может «просочиться» между средами.

Скорость сборки растёт за счёт того, что переключение между средами — это смена профиля, а не правка исходников и повторная компиляция. Один и тот же артефакт собирается с разными наборами параметров, кеш не сбрасывается, а время на подготовку релизной ветки сокращается в разы. Воспроизводимость даёт предсказуемый результат: сборка, собранная сегодня, повторится завтра без «а у меня локально работает».

Снижение отказов идёт оттуда же — из отсутствия ручных правок перед публикацией. Прозрачность релизов появляется, когда видно, какие значения ушли в конкретную версию и кто их менял: разбор инцидента занимает минуты, а не часы поиска по истории коммитов. Отдельный выигрыш — онбординг: новый инженер поднимает окружение одной командой, не выпрашивая доступы и не собирая конфиг по чатам.

В сумме управляемая конфигурация сред даёт измеримый эффект: меньше сорванных публикаций, короче цикл от коммита до стора, предсказуемое поведение приложения на каждом контуре. Это не разовая настройка, а часть релизного процесса, которую мы закладываем с первого спринта.

Подходы к хранению и подстановке значений

Значения попадают в сборку тремя принципиально разными путями, и выбор между ними определяет, что произойдёт при утечке репозитория, смене стенда или откате релиза. На практике их комбинируют: часть параметров лежит открыто в файлах конфигурации, часть подставляется на этапе сборки, а секреты вынесены в защищённые хранилища.

Вариант Когда подходит Ограничения
Файлы конфигурации в репозитории Публичные параметры: адреса стендов, флаги функциональности, идентификаторы приложений Секреты в истории системы контроля версий остаются навсегда; смена значения требует правки и нового коммита
Переменные системы сборки Разные среды разработки из одной ветки кода, параметры, зависящие от контура Значения видны в логах сборки; при ручной сборке легко подставить не тот контур
Защищённые хранилища Ключи подписи, токены внешних сервисов, учётные данные платёжных интеграций Нужен доступ к хранилищу у сборочного агента; локальная сборка требует отдельной настройки

Ключевое правило — секреты не попадают в артефакт приложения. Всё, что зашито в сборку, извлекается из неё обратной разработкой, поэтому токены, дающие доступ к серверным ресурсам, держат на стороне сервиса, а в приложении оставляют только публичные идентификаторы.

Подстановка значений привязана к контуру: сборочный агент получает набор параметров для конкретной среды и вшивает их на этапе компиляции. Тогда одна ветка кода даёт сборки для разработки, тестирования и продакшена без ручного редактирования файлов — а расхождение между стендами перестаёт быть источником ошибок.

Отдельно решается откат: если значение меняется без пересборки, его выносят в удалённую конфигурацию, которую приложение читает при запуске. Это ускоряет реакцию на инцидент, но добавляет зависимость от доступности конфигурационного сервиса — и этот компромисс стоит закладывать заранее.

Как мы настраиваем переменные окружения мобильного приложения

Настройка переменных окружения — это не разовая правка файлов, а управляемый процесс с проверяемым результатом. Ниже — как мы ведём его от аудита до передачи, чтобы конфигурация не расходилась между сборками и не ломала релиз.

  1. Аудит конфигурации. Собираем все места, где сейчас зашиты адреса серверов, ключи и флаги: файлы сборки, схемы, нативные модули, скрипты CI. Фиксируем, какие значения дублируются, где остались жёстко прописанные строки, а какие ветки уже расходятся между собой.
  2. Схема окружений. Определяем набор сред — разработка, тестирование, предпродакшн, продакшн — и единый список переменных для каждой. Договариваемся о правилах: что можно менять без пересборки, что требует новой версии, какие значения секретны и не попадают в репозиторий.
  3. Настройка переменных. Заводим единый источник значений и подключаем его к каждой платформе — iOS, Android, React Native, Flutter. Секреты выносим в защищённое хранилище, а в коде оставляем только ссылки на них, чтобы ключи не утекали через историю коммитов.
  4. Проверка сборки. Прогоняем сборку на каждой среде и сверяем, что приложение поднимается с нужными адресами и флагами. Отдельно проверяем переключение между средами без ручной правки файлов и откат на предыдущую конфигурацию.
  5. Передача документации. Отдаём схему окружений, перечень переменных с назначением, инструкцию по добавлению новых значений и порядок действий при инциденте. Команда заказчика дальше ведёт конфигурацию самостоятельно.

Такой порядок убирает класс ошибок, когда тестовая сборка уходит в продакшн с чужими ключами. Опишите вашу задачу — вернёмся с оценкой и планом работ.

Артефакты конфигурации и регламенты

Конфигурация окружений живёт не в переписке и не в голове релиз-инженера, а в наборе файлов, которые можно открыть, сравнить и передать другой команде. Ниже — типовой комплект, который заказчик получает на руки после настройки переменных окружения для iOS, Android, React Native и Flutter.

  • Файлы конфигурации по окружениям — отдельные наборы значений для разработки, тестирования и промышленного контура: адреса сервисов, ключи доступа к внешним системам, флаги включения функций. Секреты не лежат в репозитории: они подставляются на этапе сборки из защищённого хранилища.
  • Схема окружений — карта, где видно, какой стенд к какому контуру относится, какие сервисы он использует и как значения перетекают из одного окружения в другое. По ней новый инженер разбирается за час, а не за неделю.
  • Политики доступа — кто из команды и какие окружения может менять, какие действия требуют подтверждения второго инженера, как выдаются и отзываются доступы к секретам. Права разграничены по ролям, а не выданы «всем, кому надо».
  • Регламент выпуска — пошаговый порядок: как добавить новую переменную, как проверить её на тестовом контуре, как выкатить на промышленный без остановки сервиса. Отдельно описано, что делать при откате.
  • Документация по переменным — таблица со всеми параметрами: назначение, допустимые значения, окружение, где применяется, кто отвечает за актуальность. Расхождения между кодом и документацией ловятся на этапе проверки.
  • Скрипты проверки конфигурации — автоматические проверки, которые не дают собрать приложение с пустым или неверным значением. Ошибка всплывает до релиза, а не у пользователя.
  • Инструкция по передаче — что и в каком порядке нужно сделать, чтобы команда заказчика дальше вела конфигурацию самостоятельно: доступы, точки входа, порядок изменений.

Комплект остаётся рабочим при смене подрядчика или расширении команды: значения не зашиты в код, а окружения описаны так, что их можно воспроизвести с нуля. Опишите вашу задачу — вернёмся с оценкой и планом по составу артефактов под ваш проект.

Кейс: ускорение сборки и снижение отказов

К нам пришёл проект на React Native: две сборки под iOS и Android, четыре среды — разработка, тестирование, предпродакшн и продакшн. Конфигурация лежала в одном .env, который вручную правили перед каждой сборкой, а ключи доступа к сервисам были вписаны прямо в исходники. Ошибка в одном ключе означала, что приложение уходило в магазин с настройками тестового стенда — а откат занимал часы ручной работы.

Что изменили

Развели конфигурацию по средам и вынесли её из кода: каждая сборка получает свой набор значений на этапе компиляции, а не подменяется руками. Секреты убрали в защищённое хранилище и подключили к процессу сборки — в репозитории остались только ссылки на них, не сами ключи. Добавили проверку: если для выбранной среды не хватает обязательной переменной, сборка останавливается сразу, а не падает на устройстве у тестировщика.

Результат в цифрах

Метрика До После
Время полной сборки ~18 минут ~7 минут
Отказы из-за неверной конфигурации 3-4 в месяц 0 за квартал
Правки конфигурации вручную перед каждой сборкой не требуются

Сборка ускорилась за счёт кэширования зависимостей и отказа от повторной подстановки значений. Класс отказов, связанный с человеческим фактором при переключении сред, ушёл полностью — теперь среда определяется автоматически по ветке. Похожий подход мы применяли на Flutter-проекте: там развели конфигурацию через отдельные схемы сборки, и команда перестала держать в голове, какой файл править перед релизом.

Чем отличаются переменные окружения для iOS и Android?

Различия начинаются с того, где значение вообще может лежать. В iOS конфигурация традиционно живёт в Info.plist и в настройках схемы сборки: один и тот же код собирается под разные окружения переключением схемы, а значения подставляются на этапе сборки. В Android аналог — BuildConfig и ресурсы res/values, где вариант сборки задаёт свой набор констант. Отсюда первое практическое расхождение: на iOS секреты удобнее держать вне репозитория и подставлять при сборке, на Android часть значений исторически попадает прямо в артефакт и остаётся читаемой после распаковки.

Второе различие — момент подстановки. iOS тяготеет к значениям, зашитым на этапе компиляции: сменить окружение без пересборки нельзя, зато поведение релиза предсказуемо и не зависит от того, что лежит на устройстве. Android допускает чтение конфигурации во время выполнения — из ресурсов, системных свойств или удалённого источника. Это гибче для поэтапного включения функций, но добавляет класс отказов: приложение стартует с пустым или устаревшим значением, и падает уже в рантайме, а не на сборке.

Третье — управление секретами. Ни Info.plist, ни BuildConfig не защищают ключи: оба формата разбираются из готового пакета. Поэтому на обеих платформах секреты выносят на серверную сторону, а в приложении оставляют только публичные идентификаторы. Разница лишь в том, куда смотрит разработчик по привычке, и насколько легко эта привычка приводит к утечке.

Кросс-платформенные решения сглаживают синтаксис, но не отменяют различий: слой конфигурации всё равно компилируется в нативные механизмы каждой платформы. Поэтому конфигурацию проектируют один раз — с единым набором имён переменных и явным разделением на публичные и серверные, — а дальше раскладывают по нативным хранилищам. Так сборка под ios и android остаётся предсказуемой, а смена окружения не превращается в правку кода.

Частые технические сомнения

Переменные окружения — та зона, где чаще всего ломается либо безопасность, либо сборка. Ниже — вопросы, которые задают почти на каждом проекте: где хранить значения, как перейти на новую схему без простоя и кто отвечает за конфигурацию после релиза.

Секреты в переменных окружения — это безопасно?

Переменные окружения — транспорт, а не хранилище. Ключи и токены держим в защищённом хранилище, а в сборку и на устройство попадают только короткоживущие значения, выданные под конкретную среду. Плюс разделяем контуры: тестовые и рабочие секреты не пересекаются, у каждого своя область доступа. Тогда утечка сборки не открывает рабочий контур.

Как перейти на новую схему без остановки релизов?

Миграцию ведём параллельно: новая схема переменных поднимается рядом со старой, приложение читает обе и постепенно переключается. Откат — возврат предыдущего набора значений, без пересборки и повторной публикации в магазинах. Так переход занимает дни, а не квартал, и не блокирует текущие выпуски.

Что с конфигурацией после релиза — кто её поддерживает?

Конфигурация живёт как код: изменения проходят проверку, версионируются и раскатываются по средам автоматически. Добавление новой среды или смена адреса сервиса — правка одного файла, а не ручная сборка под каждую платформу. Мы передаём схему, правила и инструкции вашей команде, чтобы поддержка не зависела от нас.

Сработает ли это на iOS, Android, React Native и Flutter одинаково?

Да, схема общая: единый набор сред и правил, а различия платформ закрыты на уровне сборки. Разработчик описывает значения один раз, а сборщик сам подставляет нужные для конкретной платформы и среды. Это убирает расхождения, когда на тесте всё работает, а в магазине приложение обращается не туда.

Если ваш сценарий не попал в список — опишите задачу, вернёмся с оценкой и планом.

Обсудим вашу задачу

Обсуждение начинается не с прайса, а с вашего проекта: какие платформы в периметре, сколько окружений нужно развести, как сейчас устроена сборка. По этим вводным наши инженеры готовят оценку и план работ — с этапами, сроками и зонами ответственности. Дальше вы решаете, двигаемся мы вместе или нет.

Чтобы разговор был предметным, полезно сразу иметь под рукой несколько вещей:

  • список платформ и целевых окружений — где приложение уже живёт, а где только планируется;
  • как сейчас хранятся ключи и параметры сборки: в репозитории, в CI-системе или передаются вручную;
  • доступы к репозиториям, системам сборки и панелям магазинов приложений;
  • описание текущего процесса релиза — кто и как собирает сборку, сколько это занимает;
  • известные ограничения: требования безопасности, согласования, работа с подрядчиками;
  • контакт человека, который отвечает за мобильное направление со стороны бизнеса.

По этим данным мы возвращаемся с оценкой и планом: какие переменные окружения нужно завести, как разграничить конфигурации между средами, что уйдёт в защищённое хранилище, а что останется в открытом виде. Отдельно проговариваем, как будет устроен откат и что произойдёт, если конфигурация разъедется между платформами.

Если у вас уже есть наработки — конфиги, скрипты сборки, черновик схемы окружений — приносите, разберём их на месте. Так оценка будет точнее, а план — реалистичнее. Опишите задачу в удобном формате: короткое сообщение, документ или созвон на 30 минут.

Наши компетенции:

Последние работы

  • Разработка мобильного приложения для компании FEEDME
    Разработка мобильного приложения для компании FEEDME
    1009
  • Разработка мобильного приложения для компании XOOMER
    Разработка мобильного приложения для компании XOOMER
    902
  • Разработка мобильного приложения для компании RHL
    Разработка мобильного приложения для компании RHL
    1332
  • Разработка мобильного приложения для компании ZIPPY
    Разработка мобильного приложения для компании ZIPPY
    1180
  • Разработка мобильного приложения для компании Affhome
    Разработка мобильного приложения для компании Affhome
    1106
  • Разработка мобильного приложения для компании FLAVORS
    Разработка мобильного приложения для компании FLAVORS
    714