От приложения к суперприложению

Часть 3. Как управлять средами в приложении с помощью фреймворков

Адаптация как хамелеон

В процессе разработки очень важно знать, с какими данными вы работаете, поэтому в проекте должны быть среды разработки. Xcode инициирует проект со средами отладки и выпуска по умолчанию, но вы можете добавить столько сред, сколько хотите, и настроить их.

В этом новом эпизоде ​​Как создать суперприложение и не умереть в попытках мы поговорим о средах: как настроить их в нашем проекте, как настроить их в наших фреймворках и как для настройки окружения в нашем проекте.

Мы собираемся продолжить разработку нашего School Project и создавать среды, используя параметры конфигурации проекта и настраиваемые флаги компилятора, которые предоставляет нам Swift. Это не единственный способ создания среды, есть и другие способы создания и управления средами, такие как XCConfig (файл конфигурации Xcode), но в этом посте мы не будем их объяснять или говорить о различиях между ними.

Как создавать, настраивать и использовать среды во фреймворке

Откройте Student Framework и выберите проект, перейдите на вкладку Информация и в разделе Конфигурации мы увидим среды Xcode по умолчанию: Отладка и Выпуск. Давайте создадим новую, дублирующую среду Debug. Мы назовем это Предварительный выпуск.

Теперь откройте вкладку Build Settings, найдите 'Swift Compiler — Custom Flags' и откройте переменную 'Active Compilation Conditions', где доступны все конфигурации. Мы должны дать имя этим переменным среды:

Active Compilation Conditions — это параметр сборки, который позволяет нам определять наши флаги без необходимости добавлять к ним префикс.

Следующим шагом будет открытие StudentHomeViewModel, где мы собираемся создать метод для печати в консоли среды, которую мы используем в данный момент.

Мы вызываем этот метод из StudentHomeViewController в системном методе didLoadView(). Чтобы проверить среды, нам нужно изменить схему StudentApp и выбрать среду, которую мы хотим запустить.

Если мы запустим студенческое приложение, выбрав разные среды, мы получим следующее сообщение в консоли Xcode:

Как создавать, настраивать и использовать окружения в основном проекте

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

Цель определяет продукт для сборки и содержит инструкции по сборке продукта из набора файлов в проекте или рабочей области.

Первый шаг — создать среду Prerelease, как мы делали раньше в Student Framework. Перейдите в Project -> Info -> Configurations и продублируйте Debug. Как и раньше, откройте Настройки сборки, найдите 'Swift Compiler — Custom Flags' и присвойте те же имена переменным среды в 'Активные условия компиляции'.

Чтобы проверить среды, мы должны повторить тот же процесс добавления метода в SchoolHomeViewModel, поэтому повторите описанный выше процесс, добавив тот же код, что и в StudentHomeViewModel.

Второй шаг — создать цель для каждой среды. Щелкните правой кнопкой мыши цель Школьный проект и продублируйте ее. Измените имя на SchoolProjectDebug.

Создайте новую цель для предварительного выпуска, повторив процесс, и назовите ее SchoolProjectPrerelease. Xcode создал новые файлы Info.plist для этих двух новых целей за пределами папок проекта, поэтому мы должны переместить их в правильную папку. Выберите эти два новых файла, переместите их по тому же пути, что и исходный файл Info.plist, и переименуйте файлы в InfoDebug.plist и InfoPrerelease.plist:

Теперь вам нужно указать в проекте, где находятся эти файлы для новых целей: выберите цель SchoolProjectDebug, перейдите на вкладку Настройки сборки и выполните поиск «Info.plist file ». Установите текущий путь для файлов. Сделайте то же самое для цели пререлиза.

Следующим шагом является настройка целей для управления правильной средой. SchoolProject использует конфигурацию выпуска, SchoolProjectDebug использует конфигурацию отладки, а SchoolProjectPrerelease использует конфигурацию предварительной версии.

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

Давайте работать вместе

Теперь, когда все готово, запустите «pod install» на терминале и запустите схему Отладка школьного проекта. Если вы перемещаетесь по приложению, терминал будет печатать сообщения, настроенные в School App и в Student Framework:

Когда мы запускаем предварительную схему и перемещаемся по приложению, Student Framework печатает в терминале Xcode в неправильной среде:

Это связано с тем, что когда мы устанавливаем модуль, CocoaPods не поддерживает настройки нашего проекта: если мы перейдем к проекту Pods в навигаторе проекта, откроем Student Framework и найдем «Swift Compiler — Custom Flags' в Настройках сборки мы видим, что конфигурация исчезла. Чтобы решить эту проблему, мы должны добавить следующий код в наш файл pod:

Будьте осторожны, правильно управляя именами конфигураций.

Этот код ищет цели модулей приложений и дает значение переменной конфигурации в соответствии с заданной конфигурацией. Получив это, мы снова запускаем «деинтеграция модуля» и «установка модуля» в Терминале, перезапускаем предварительную схему и получаем ожидаемый результат.

Наконец, мы запускаем среду Release и имеем следующий результат в консоли Xcode:

Что дальше

Исходный код примера вы можете найти на GitHub.

Мы создали разные цели для управления разными средами для нашего проекта и для нашего фреймворка, и мы соединили их, поддерживая одну и ту же среду. Как я объяснил в начале поста, это пример того, как это сделать. Если мы хотим управлять URL-адресами для каждой среды или ключей и токенов, более безопасно использовать файлы XCConfig, поскольку ключи и токены не находятся в коде.

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