Три слегка отличающихся приложения из одной кодовой базы
Hy там я хотел бы иметь три приложения в зависимости, которые основаны на том же коде:
-
MyAppDevelopment
(сборки из Xcode, которые развертываются на устройстве) -
MyAppPreview
(бета-тестирование) -
MyApp
(Выпуск)
Должно быть возможно, чтобы все три приложения были установлены на устройстве, и у них был бы свой собственный значок, чтобы хорошо различать их визуально.
Теперь я знаю, что я мог бы иметь три разных цели с их соответствующим файлом Info.plist
, но я бы предпочел использовать конфигурации Xcode, чтобы мне не нужно было поддерживать три разных цели. Возможно ли это с помощью конфигураций, проблема заключается в том, что идентификатор приложения хранится в файле Info.plist
, который может быть определен для каждой цели...
4 ответа:
Использование различных целевых объектов для различных выпусков приложений обеспечивает большую гибкость и позволяет легко изменять идентификатор пакета и значок и т. д., Как только вы укажете другой файл plist для каждого целевого объекта. Однако конфигурации более глубоко интегрированы с Xcode, и вы можете настроить любую
После еще нескольких исследований я понял, как получить лучшее из обоих миров с помощью только одной цели:build setting
для каждой конфигурации.
- создайте нужные конфигурации в Xcode:
ProjectName > ProjectName > Info
. Например:
- Debug
- предварительный просмотр
- освобождение
- теперь эти три конфигурации доступны для всех параметров сборки.
- Три приложения должны сосуществовать на одном устройстве. Я хочу иметь возможность иметь все три версии приложения на одном устройстве,для этого всем трем типам нужен другой идентификатор пакета. Исходный идентификатор может быть
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
вашего приложения.Update: вы не можете использовать замены типа
com.company.${PRODUCT_NAME:rfc1034identifier}
для пользовательских настроек сборки. Таким образом, в этом случае вам придется записать идентификатор bundle whole bundle.Update : некоторые настройки что должно быть сделано "конфигурация осведомлена" перейти к определяемому пользователем разделу настроек сборки, что может показаться необычным для некоторых разработчиков.
Результат
Если вы хотите, чтобы все три приложения были установлены на устройстве одновременно, то вы просто должны использовать три отдельных идентификатора = три цели с их информацией.файл plist.
На самом деле я не вижу проблемы в "поддержании" трех отдельных целей в одном проекте. Я делаю это постоянно (с двумя целями, но тем не менее). Это на самом деле очень элегантное решение.
В моих приложениях я часто добавлял шаг сборки "run script", чтобы скопировать определенный plist среды на место перед созданием приложения. При таком подходе я могу поменять всю информацию местами.plist, чтобы я мог изменять идентификаторы приложений на основе настроек сборки. Обычно я устанавливаю среду для сборки на основе некоторой переменной среды, которую можно задать или изменить в настройках цели сборки.
Некоторые из моих коллег выбрали альтернативный подход, который позволяет использовать конфигурации Xcode чтобы определить среду приложения, но я не думаю, что это позволит вам изменить идентификатор приложения: http://blog.carbonfive.com/2011/06/20/managing-ios-configurations-per-environment-in-xcode-4/
В дополнение к моему описанному подходу я реализовал возможность иметь различные свойства или настройки для каждой конфигурации.
Я создал gist на основе этого учебника, который я немного расширил. Я использую его в различных проектах и вполне доволен им.
Единственное важное дополнение, которое я сделал, - это возможность определить основную среду, которая будет использоваться в качестве запасного варианта для других сред, если не будет найдено никакого значения.Пожалуйста проверьте это Readme.md для получения подробных инструкций, как настроить все это.