iOS: изменение info.plist на этапе сборки
Я пытаюсь сделать следующее:
- На этапе сборки откройте текстовый файл и прочитайте текст
- Измените значение свойства в info.plist на значение, полученное на шаге 1.
Могу ли я написать сценарий оболочки для этого?
Было бы здорово, если бы кто-то помог мне достичь этого.
4 ответа
Да, ты можешь. Я бы сделал это в три этапа:
- Напишите сценарий оболочки, который запускается до первой фазы сборки. Позвольте этому сценарию установить переменную среды.
- Включите "Расширить настройки сборки в Info.plist" для вашего проекта.
- Используйте переменную окружения в файле plist как
${MY_COOL_SETTING}
,
Вероятно, самый простой способ - это использовать PlistBuddy. У меня есть фаза Run Script, которая выглядит следующим образом:
BUILD_NUMBER=`git rev-list HEAD --count`
INFO_PLIST="$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH"
if [ -f "$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH" ] ; then
oldversion=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$INFO_PLIST"`
fi
if [ "$BUILD_NUMBER" != "$oldversion" ] ; then
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "$INFO_PLIST"
fi
(Обратите внимание, что начиная с Xcode 6, вы должны выполнить это после фазы Copy Bundle Resources, потому что Info.plist
не копируется в целевое местоположение до тех пор, и PlistBuddy не сможет.)
Изменить 01/17: Обновлено, чтобы избежать ненужного копирования или подписания целей. Вы не хотите трогать Info.plist, если что-то действительно не меняется, в противном случае Xcode будет рассматривать его (и, следовательно, цель) как измененное. Проверка предыдущего значения CFBundleVersion
может значительно ускорить сборку - это сэкономило мне несколько секунд на сборке noop.
@PeyloW предлагает один из способов сделать это. Другой способ сделать это - добавить шаг сборки Run Script. На этом этапе вы можете переписать ваш Info.plist так, как вам нравится. Я делаю это все время, чтобы установить svnversion.
Я рекомендую поместить ваш скрипт в файл, а затем положить . myscript.sh
на этапе запуска сценария. Это легче понять и поддерживать, чем помещать весь сценарий непосредственно в Xcode.
У меня есть файл сценария, который помещает номер сборки в поле моего info.plist. Я помещаю некоторый текст заполнителя в info.plist в проекте, а затем скрипт просто заменяет его. Это только увеличивает номер сборки на сборках выпуска. В сборках разработки просто говорится, что они являются сборкой разработки.
if [ "$BUILD_STYLE" = "Release" ]
then
if [ ! -f build-number ]; then
echo 0 > build-number
else
expr `cat build-number` + 1 > build-number.new
mv build-number.new build-number
fi
perl -pi -e s/BUILD_NUMBER_PLACEHOLDER/`cat build-number`/ $BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app/Contents/Info.plist
else
perl -pi -e s/BUILD_NUMBER_PLACEHOLDER/`echo Development`/ $BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app/Contents/Info.plist
fi