Конфигурационные файлы в Xcode
Многие из нас в своих домашних или рабочих проектах используют различные стенды для осуществления API запросов. Например для Debug сборок, мы можем общаться со своим локальным сервером, а для Release использовать настоящий сервис. Существует множество способов реализации этого разделения в приложении, а именно с помощью:
- Условных операторов в коде, которые проверяют флаг Debug / Release
- Смены значений переменных в lldb дебагера
- Использования конфигурационных файлов
Наиболее предпочтительным из всех вариантов - это использование конфигурационных файлов, т.к.:
- Избавляет от необходимости вносить каждый раз правки в коде
- Уменьшает количество потенциальных багов в приложении
- Добавляет больше гибкости в управлении и автоматизации
Данный вариант мы и возьмем за основу в данной статье.
Наверняка уже многие встречались с файлами с расширением .xcconfig. Они содержат настройки в виде ключ-значение:
Еще одно удобство заключается в том, что в конфиг файлах можно подставлять значения из других настроек:
Давайте вернемся к нашему примеру с использованием различных API эндпоинтов и создадим xcconfig файл. Для этого используем комбинацию CMD + N или File > New > File. В секции Other выбираем Configuration Settings File.
Перед тем как задать имя конфиг файлу нужно убедиться, что конфиг не включен в какой-либо таргет
После того как создали конфиг файл, назначаем его в нужный Target
Данный конфиг файл будет предоставлять нам данные (а именно эндпоинт) для локального / тестового сервиса, когда используется Debug схема.
Теперь нужно создать еще один конфиг файл, только теперь для Release схемы.
Итоговая настройка выглядит следующим образом:
Далее указываем наши эндпоинты в конфигах.
Здесь стоит учесть что символы / (слеш) интерпретируются как комментарии, поэтому указывать схему эндпоинта или путь к нужному сервису необходимо в коде с помощью класса URLComponents
Теперь нам осталось задать в Info.plist файле ключ нашего эндопинта и откуда он будет загружаться.
Единственное что нам осталось, так это получить эти данные в коде. Для этих целей можно создать вспомогательную структуру и получать данные из Bundle нашего приложения.
Осталось проверить корректность значений которые мы получаем при смене схем. Для начала оставляем ту схему которая используется по умолчанию, а в AppDelegate.swift считываем значение API_URL:
Попробуем сменить схему на Release для этого выбираем Target и выбираем Edit scheme
Во вкладке Build Configuration выбираем Release
Запускаем проект и проверяем результат
В заключении стоит отметить, что не стоит использовать конфиги для хранения таких чувствительных данных как API ключи или пароли, для этого существуют другие механизмы.
Конфигурационные файлы добавляют больше гибкости в настройке приложений и избавляют нас от необходимости добавлять проверки на переменные окружения с помощью макросов и других механизмов, что делает проект более поддерживаемым.