Как мы можем иметь разные файлы Info.plist для разных сред, таких как Dev, Test, Staging и Prod?

Как мы можем иметь разные файлы Info.plist для разных сред, таких как Dev, Test, Staging и Prod?

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

Ответ 1

Вот что вам нужно сделать, чтобы добавить специальные слои среды.

  • Скопируйте исходный файл ProjectName.Info.plist в ProjectName_Dev.Info.plist, ProjectName_Test.Info.plist и ProjectName_Staging.Info.plist и добавьте их в проект.

  • Нажмите имя проекта в Project Navigator, выберите Target, затем выберите вкладку Build Phases.

  • Введите Info.plist в строке поиска вверху справа, чтобы фильтровать Info.plist.

  • Из Copy Bundle Resources удалите все плиты, кроме ProjectName.Info.plist

  • Теперь нажмите на пункт меню Editor -> Add Build Phase -> Add Run Script Build Phase.

  • Наконец, скопируйте следующую оболочку script в новую добавленную фазу сборки.

Обязательно замените ProjectName на свое название проекта!

if [ "${CONFIGURATION}" == "Dev" ]; then
cp -r "${PROJECT_DIR}/ProjectName/ProjectName-Info_Dev.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/ProjectName-Info.plist"
echo "DEV plist copied"
elif [ "${CONFIGURATION}" == "Test" ]; then
cp -r "${PROJECT_DIR}/ProjectName/ProjectName-Info_Test.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/ProjectName-Info.plist"
echo "Beta plist copied"
elif [ "${CONFIGURATION}" == "Staging" ]; then
cp -r "${PROJECT_DIR}/ProjectName/ProjectName-Info_Staging.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/ProjectName-Info.plist"
echo "Beta plist copied"
elif [ "${CONFIGURATION}" == "Prod" ]; then
cp -r "${PROJECT_DIR}/ProjectName/ProjectName-Info_Prod.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/ProjectName-Info.plist"
echo "Beta plist copied"
fi

Или просто:

cp -r "${PROJECT_DIR}/ProjectName/ProjectName-Info_${CONFIGURATION‌​}.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/ProjectName-Info.‌​plist"

ПРИМЕЧАНИЕ. Я предполагаю, что вы уже создали схемы сборки с переменными среды Dev, Test, Staging и Production.

Получите помощь из этой статьи. http://www.dosomethinghere.com/2013/09/21/different-settings-app-entries-for-debug-vs-release-builds/

Ответ 2

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

первый xcconfig:

MY_VARIABLE = thisandsuch

второй xcconfig:

MY_VARIABLE = thisandthat

И затем в вашем plist установите ключ со значением $(MY_VARIABLE)

В зависимости от того, что именно вы делаете. Xcconfig хорош, потому что вы можете получить доступ к переменным, которые вы устанавливаете там, в местах, подобных настройкам сборки, в дополнение к plist.

Ответ 3

Попробуйте этот вспомогательный класс:

https://github.com/premosystems/MyEnvironmentConfig

  • Добавить среду $(КОНФИГУРАЦИЯ) в info.plist.

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

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

  • Инициализировать MyEnvironmentConfig в appDidFinishLaunching.