Обновления версии пакета XCode 4.4 не загружаются до следующей сборки

Я, вероятно, упускаю что-то простое здесь. Я пытаюсь автоматически увеличить номер сборки в XCode 4.4 только при архивировании своего приложения (при подготовке к развертыванию TestFlight). У меня есть рабочий сценарий оболочки, который запускается на цели и успешно обновляет файл info.plist для каждой сборки. Моя конфигурация сборки для архивирования называется Ad-Hoc.

Вот сценарий:

if [ $CONFIGURATION == Ad-Hoc ]; then
    echo "Ad-Hoc build. Bumping build#..."
    plist=${PROJECT_DIR}/${INFOPLIST_FILE}
    buildnum=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${plist}")

    if [[ "${buildnum}" == "" ]]; then
        echo "No build number in $plist"
        exit 2
    fi

    buildnum=$(expr $buildnum + 1)
    /usr/libexec/Plistbuddy -c "Set CFBundleVersion $buildnum" "${plist}"
    echo "Bumped build number to $buildnum"
else
    echo $CONFIGURATION " build - Not bumping build number."
fi

Этот скрипт соответствующим образом обновляет файл plist и отражается в XCode каждый раз, когда я архивирую. Проблема в том, что файл .ipa, полученный в результате процесса архивирования, по-прежнему показывает номер предыдущей сборки. Я безуспешно пробовал следующие решения:

  • Очистить перед сборкой
  • Очистить папку сборки перед сборкой
  • Переместите фазу запуска сценария непосредственно после шага целевых зависимостей в фазах сборки.
  • Добавление сценария в качестве действия «Выполнить сценарий» в моей схеме в качестве предварительного действия

Что бы я ни делал, когда я смотрю на журнал сборки, я вижу, что файл info.plist обрабатывается как один из самых первых шагов. Это всегда предшествует запуску моего скрипта и обновлению номера сборки, поэтому, как я полагаю, номер сборки никогда не актуален в файле .ipa.

Есть ли способ заставить фазу запуска сценария выполняться до обработки файла info.plist?


person Mark Struzinski    schedule 02.08.2012    source источник
comment
Я узнаю фрагменты этого скрипта ;-) Вы не сказали, как вы подключаете этот скрипт к процессу сборки? Вы отредактировали схему проекта и добавили в Archive стадию?   -  person trojanfoe    schedule 20.08.2012


Ответы (3)


в Xcode 4.4.1 я создаю новую цель и добавляю к этой фазе сборки цели «Запустить пользовательский скрипт», который обновляет основной целевой Plist. А также вы должны добавить эту цель в зависимости для основной цели

person chippcheg    schedule 20.08.2012

Причина, по которой это происходит, заключается в том, что к тому времени, когда ваш «Запуск сценария» запускается, процесс сборки XCode уже обработал plist-файл проекта для извлечения номера версии пакета и т. д.

Вы можете увидеть это (возможно, более подробно, чем хотите), перейдя в навигатор журналов в XCode (Просмотр/Навигаторы/Показать навигатор журналов) и выбрав сборку «Архив».

Подробный список действий по сборке должен появиться в вашем главном окне, а одна из вещей вверху должна называться Process <projectname>-Info.plist. Если вы развернете это с помощью значка справа, вы увидите реальную команду сборки, которая была запущена.

Способ, которым я обошел это, состоял в том, чтобы обновить как исходный файл plist, так и обработанный. Делая это, вы получаете обновленную версию сборки в текущей сборке, а не в следующей.

Вот сценарий, который я использую для этого (это Ruby, поэтому вам нужно будет поместить «/usr/bin/ruby» в поле интерпретатора, чтобы использовать его, но концепция работает так же со сценарием оболочки или любым другим сценарием язык):

def incrementBundleVersion(file)
    oldVersion = `/usr/libexec/Plistbuddy -c "print :CFBundleVersion" #{file}`.strip
    components = oldVersion.split('.')
    newBuild = components.pop.to_i + 1
    version = components.push(newBuild).join('.')
    print "Updating version: #{oldVersion} -> #{version} : #{file}\n"
    system("/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion #{version}\" #{file}")
end

incrementBundleVersion("#{ENV['PROJECT_DIR']}/#{ENV['INFOPLIST_FILE']}")
incrementBundleVersion("#{ENV['CODESIGNING_FOLDER_PATH']}/Info.plist")

Обратите внимание, что обработанный файл #{ENV['CODESIGNING_FOLDER_PATH']}/Info.plist является двоичным файлом plist, поэтому вы не сможете обработать его с помощью простых текстовых инструментов — проще всего с этим справиться с помощью plistbuddy, и он автоматически работает как с текстовыми, так и с двоичными файлами plist.

person sheltond    schedule 31.08.2013

Марк (и др.), я полагаю, что столкнулся с той же проблемой, что и вы, и я попытаюсь описать ее одним предложением, а затем объясню:

Я думаю, что /usr/libexec/PlistBuddy при запуске из Xcode работает с кэшированными версиями данных Info.plist, и поэтому то, что в конечном итоге записывается для выполнения на устройстве или симуляторе, не всегда то, что вам нужно.

Я попытался написать сообщение «Скопировать пакет ресурсов» «Выполнить сценарии», чтобы изменить эту информацию таким образом, чтобы она не менялась в моем локальном репозитории git, только для того, чтобы обнаружить это, тогда как информация будет работать правильно, когда команды PlistBuddy были выполнены в окне terminal.app рядом с Xcode, если этого не сделать, кэшированные значения будут записаны.

В конце концов я смирился с запуском сценариев генерации информации о версии до этапа копирования ресурсов пакета и автоматической фиксацией изменений в другом сценарии выполнения, используя те же теги для сообщения git и для тега git, которые создаются автоматически. для файла Settings.bundle/Root.plist вместо того, чтобы каждый раз фиксировать это, я предпочел просто запустить сценарий завершения, который выполнял бы «проверку git -- ${PROJECT}/Resources/Settings.bundle/Root.plist» (это то место, где существует мой, но, возможно, не каждый помещает свой собственный файл ресурсов системных настроек).

между проверкой изменений, запуском частей при установке и частями каждый раз, и наличием сценариев финализации в конце, есть 6 сценариев для одних целей и 7 для других…

… но для меня важно то, что он, наконец, должным образом автоматизирован … и позволяет обойти все, что PlistBuddy делает с моими файлами plist при обработке внутри Xcode.

person john.k.doe    schedule 04.12.2012