Три немного разных приложения из одной кодовой базы
Привет, я хотел бы иметь три приложения в зависимости от того же кода:
MyAppDevelopment
(Сборки из Xcode, которые развернуты на устройстве)MyAppPreview
(Бета-тестирование)MyApp
(Релиз)
Должно быть возможно установить все три приложения на устройстве, и у них будет свой значок, чтобы визуально отличить их.
Теперь я знаю, что у меня может быть три разные цели с соответствующими Info.plist
файл, но я бы предпочел использовать конфигурации XCode, чтобы мне не пришлось поддерживать три разных цели. Возможно ли это с помощью конфигураций, проблема в том, что идентификатор приложения хранится в Info.plist
файл, который можно определить для каждой цели...
4 ответа
Использование разных целей для разных выпусков приложений обеспечивает большую гибкость и позволяет легко изменять идентификатор пакета, значок и т. Д. После указания другого файла plist для каждой цели. Тем не менее, конфигурации более глубоко интегрированы с XCode, и вы можете настроить любой build setting
по конфигурации.
После еще одного исследования я выяснил, как получить лучшее из обоих миров с одной целью:
- Создайте нужные конфигурации в Xcode:
ProjectName > ProjectName > Info
, Например:- отлаживать
- предварительный просмотр
- Релиз
- Теперь эти три конфигурации доступны для всех настроек сборки.
Три приложения должны сосуществовать на устройстве. Я хочу иметь возможность иметь все три версии приложения на одном устройстве, для этого всем трем типам необходим различный идентификатор пакета. Исходный идентификатор может быть
com.company.${PRODUCT_NAME:rfc1034identifier}
,- Для достижения этого перейдите к
MyProject > MyApp (Target) > Build settings
и нажмите на кнопку(+) Add Build Setting
Добавить новый ключ
${APP_ID}
и установите значения, как это, и обратите внимание, чтоrelease
Конфигурация не должна иметь суффикса:APP_ID > 'com.company.MyApp-debug' > 'com.company.MyApp-preview' > 'com.company.MyApp'
- Теперь в вашем
Info.plist
изменитьBundle Identifier
значение для${APP_ID}
- Для достижения этого перейдите к
Вы можете сделать то же самое с
Bundle Display Name
илиIcon
атрибут, так что вы можете легко отличить приложение с одного взгляда.- Вы можете установить
Preprocessor macros
для ваших конфигураций, чтобы иметь возможность обнаружить текущую конфигурацию в вашем коде. Это сделано по умолчанию дляdebug
конфигурация:DEBUG=1
,
преимущества
- Поскольку три приложения имеют свой собственный идентификатор, вы не будете переопределять последнюю предварительную сборку при тестировании текущего приложения в XCode.
- Хорошо интегрируется в XCode и предлагает высокую гибкость
Все настройки сборки теперь могут быть изменены индивидуально для каждой конфигурации. - Новые конфигурации могут быть легко добавлены путем клонирования существующих конфигураций в Xcode
- Нет необходимости в дополнительных целях
Цели IMHO лучше для совершенно разных артефактов, таких как библиотеки или цели тестирования, которые имеют различную кодовую базу. - Конфигурации могут быть использованы в коде, если требуется.
- Различные сервисные URL и т. Д. Могут использоваться для разных сред. Смотрите этот великий пост (спасибо Ионе!), Который показывает, как сделать это с помощью специального
plist
файл. - Никаких хакерских скриптов, которые сложно поддерживать
Недостатки
Используя цели, можно исключить некоторые фреймворки из типа приложения. Так, например, вы можете исключить некоторую библиотеку аналитики из
debug
издание вашего приложения.Обновление: Вы не можете использовать замены, такие как
com.company.${PRODUCT_NAME:rfc1034identifier}
для пользовательских настроек сборки. Таким образом, в этом случае вам придется выписать весь идентификатор пакета.Обновление: некоторые параметры, которые необходимо сделать "осведомленными о конфигурации", перемещаются в пользовательский раздел "Настройки сборки", что может показаться необычным для некоторых разработчиков.
Результат
Если вы хотите, чтобы все три приложения были установлены на устройстве одновременно, тогда вам просто нужно использовать три отдельных идентификатора = три цели с их info.plist.
На самом деле я не вижу проблемы с "поддержанием" трех отдельных целей в одном проекте. Я делаю это все время (с двумя целями, но тем не менее). На самом деле это очень элегантное решение.
В моих приложениях я часто добавлял шаг сборки "run script", чтобы скопировать специфический для среды plist на место перед сборкой приложения. При таком подходе я могу поменять весь Info.plist так, чтобы я мог изменять идентификаторы приложений в зависимости от настроек сборки. Я обычно устанавливаю среду для сборки на основе некоторой переменной среды, которая может быть установлена или изменена в настройках цели сборки.
Некоторые из моих коллег использовали альтернативный подход, который позволяет вам использовать конфигурации XCode для определения среды приложения, но я не думаю, что это позволит вам изменить идентификатор приложения: http://blog.carbonfive.com/2011/06 / 20 / Управление-ИОС-конфигураций ТВ-среды-в-Xcode-4 /
В дополнение к моему описанному подходу я реализовал возможность иметь разные свойства или настройки для каждой конфигурации.
Я создал суть, основанную на этом уроке, который я немного расширил. Я использую это в различных проектах и вполне доволен этим.
Одно важное добавление, которое я сделал, - это возможность определить основную среду, которая будет использоваться в качестве запасного варианта для других сред, если значение не найдено.
Пожалуйста, ознакомьтесь с Readme.md для получения подробных инструкций по настройке всего этого.