Три немного разных приложения из одной кодовой базы

Привет, я хотел бы иметь три приложения в зависимости от того же кода:

  1. MyAppDevelopment (Сборки из Xcode, которые развернуты на устройстве)

  2. MyAppPreview (Бета-тестирование)

  3. 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} для пользовательских настроек сборки. Таким образом, в этом случае вам придется выписать весь идентификатор пакета.

  • Обновление: некоторые параметры, которые необходимо сделать "осведомленными о конфигурации", перемещаются в пользовательский раздел "Настройки сборки", что может показаться необычным для некоторых разработчиков.

Результат

http://i.minus.com/jbwPgEiBra39dL.png

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

На самом деле я не вижу проблемы с "поддержанием" трех отдельных целей в одном проекте. Я делаю это все время (с двумя целями, но тем не менее). На самом деле это очень элегантное решение.

В моих приложениях я часто добавлял шаг сборки "run script", чтобы скопировать специфический для среды plist на место перед сборкой приложения. При таком подходе я могу поменять весь Info.plist так, чтобы я мог изменять идентификаторы приложений в зависимости от настроек сборки. Я обычно устанавливаю среду для сборки на основе некоторой переменной среды, которая может быть установлена ​​или изменена в настройках цели сборки.

Некоторые из моих коллег использовали альтернативный подход, который позволяет вам использовать конфигурации XCode для определения среды приложения, но я не думаю, что это позволит вам изменить идентификатор приложения: http://blog.carbonfive.com/2011/06 / 20 / Управление-ИОС-конфигураций ТВ-среды-в-Xcode-4 /

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

Я создал суть, основанную на этом уроке, который я немного расширил. Я использую это в различных проектах и ​​вполне доволен этим.

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

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

https://gist.github.com/2782045

Другие вопросы по тегам