Как настроить независимые наборы параметров времени выполнения в XCode
======================================================================

 Моё приложение для iPhone подключается к трем различным серверам, скажем: **Производство**,  **Постановка** а также **Тестирование**. Существует множество значений конфигурации, которые приложение использует в зависимости от того, к какому серверу оно подключается, например, Идентификатор приложения Facebook, ключ команды TestFlight и т. Д.

 Я хотел бы иметь все настройки в GIT и выбирать только ту конфигурацию, которую приложение должно использовать при компиляции или выпуске. Например, когда **Тестирование** выбрано,Product -> Run в XCode запускает отладочную версию приложения, подключающегося к **Тестирование**, а такжеProduct -> Архив создает файл IPA с версией выпуска, которая также подключается к **Тестирование**.

 Я не хочу создавать больше конфигураций сборки, чем отладки и выпуска (потому что это будет означать 6 различных комбинаций конфигураций сборки / конфигураций во время выполнения). На мой взгляд, идеальным решением было бы то, что у меня есть три схемы: **Производство**,  **Тестирование** а также **Постановка**, и каждая схема выбирает один из трех файлов Info.plist для использования с приложением. Это позволило бы мне не только определять различные параметры времени выполнения, но также разные версии приложений или идентификаторы пакетов в зависимости от внутреннего сервера. Но, похоже, я не могу настроить действие «Архив» другим способом, кроме выбора другой конфигурации сборки. Любые идеи, если это может быть достигнуто каким-либо образом?

**Редактировать** Чтобы было немного яснее, **Производство / постановка / тестирование** является внутренним сервером, а не версией приложения iOS. Приложение для iOS выпускается в двух версиях: **Отладки / релиз**. Другими словами, я могу захотеть запустить **@ Отлад** версия приложения, подключающегося к **Производство** server, например, для отладки сбоя, вызванного возвращением JSON с этого сервера. Для ясности я мог бы назвать серверы A, B и 

 ешно использовал эту модель раньше. В настройках вашего проекта вы можете продублировать текущую цель и изменить настройки сборки по мере необходимости. Там есть`Info.plist File` свойство, которое позволит вам изменить список по умолчанию для этой цели.

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

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

 Единственным недостатком этого является то, что у вас есть больше работы, когда вы хотите обновить профили обеспечения.



 `apiURL()`, который возвращает URL API, который я хочу. У меня есть localhost, stage и production, и я просто раскомментирую тот, который хочу. До сих пор это работало хорошо для меня. Я только забыл переключить его обратно несколько раз. К сожалению.



 если соответствующие библиотеки позволяют устанавливать ключи в коде, а это означает, что вы можете иметь производственное значение в своем файле plist, но изменить их в своем AppDelegate (или в любом другом файле, в котором они впервые используются).

 Работает с Facebook, Twitter и Google SDK на данный момент.

Ex:

 То же самое в Swift, просто используйте #if вместо # ifdef.

 **Заметка о фейсбуке** Это работало с версией 3 их SDK, я не уверен, что это возможно с более поздними версиями.



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

 Сначала вы хотите настроить конфигурацию на уровне проекта:

![]()

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

 Далее вы можете определить несколько макросов для каждой конфигурации, которые будут переданы компилятору. Затем вы можете проверить эти флаги во время компиляции. Найдите параметр сборки «Флаги препроцессора» на целевом уровне:

![]()

 Если вы расширяете треугольник, вы можете определить различные значения для каждой из ваших конфигураций. Вы можете определить`KEY=VALUE` или просто`KEY` здесь макросы.

![]()

 В своем коде вы можете проверить наличие этих макросов или их значение (если оно есть). Например

Вы также можете передавать строковые значения, которые должны быть заключены в одинарные кавычки в настройке сборки, например,`DEFAULT_LOCALIZATION_NAME='@"en"'`.

 Вы также можете настроить, какая конфигурация используется во время отладки и архивирования, используя редактор схем. Если вы выбираете «Выполнить» или «Архивировать» в редакторе схем, вы можете выбрать соответствующую конфигурацию.

![]()

 Если вам нужно параметризовать записи в файле Info.plist, вы можете определить их значение с помощью пользовательской настройки сборки. Добавьте пользовательский параметр сборки для своей цели:

![]()

 А затем укажите соответствующее значение для ваших различных конфигураций:

![]()

 Затем в файле Info.plist вы можете указать этот параметр:

![]()

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

 Settings.bundle Кроме того, в более старых версиях XCode без поддержки каталога ресурсов вы не можете изменять следующие элементы:

 Icon.png Default.pngЭто нельзя явно определить в файле Info.plist или где-либо еще, что означает, что для их изменения нужны разные цели.

Надеюсь это поможет