Xcode «Build and Archive» из командной строки

Xcode 3.2 предоставляет потрясающую новую функцию в меню «Build», «Build and Archive», которая создает файл .ipa, подходящий для Ad Hoc-распространения. Вы также можете открыть Организатор, перейти в «Архивные приложения» и «Отправить заявку на iTunesConnect».

Есть ли способ использовать «Build and Archive» из командной строки (как часть скрипта сборки)? Я бы предположил, что xcodebuild будет задействован каким-то образом, но на странице руководства, похоже, ничего не говорится об этом.

ОБНОВЛЕНИЕ Майкл Гринич попросил разъяснений; вот что именно вы не можете сделать с построением командной строки, функции, которые вы можете ТОЛЬКО выполнять с помощью Xcode’s Organizer после того, как вы «Build and Archive».

  1. Вы можете нажать «Share Application …», чтобы поделиться своим IPA с бета-тестерами. Как указывает Гийом ниже, из-за некоторой магии Xcode этот файл IPA не требует отдельно распространяемого файла .mobileprovision, который необходимо установить бета-тестерам; это волшебство. Никакой сценарий командной строки не может это сделать. Например, сценарий Arrix (представленный 1 мая) не соответствует этому требованию.
  2. Что еще более важно, после того, как вы протестировали бета-версию сборки, вы можете нажать «Отправить приложение в iTunes Connect», чтобы представить, что ТОЧНАЯ такая же assembly для Apple, самой бинарной, которую вы протестировали, без ее восстановления. Это невозможно из командной строки, потому что подписание приложения является частью процесса сборки; вы можете подписывать биты для бета-тестирования Ad Hoc или вы можете подписывать их для отправки в App Store, но не для обоих. Никакая IPA, построенная на командной строке, не может быть протестирована на мобильных телефонах, а затем отправлена ​​непосредственно в Apple.

Мне бы хотелось, чтобы кто-то пришел и доказал, что я ошибаюсь: обе эти функции отлично работают в графическом интерфейсе Xcode и не могут быть реплицированы из командной строки.

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

Команда, которую вы должны использовать, – xcrun :

 /usr/bin/xcrun -sdk iphoneos PackageApplication \ -v "${RELEASE_BUILDDIR}/${APPLICATION_NAME}.app" \ -o "${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.ipa" \ --sign "${DEVELOPER_NAME}" \ --embed "${PROVISONING_PROFILE}" 

Вы найдете все детали в статье . Если у вас есть какие-либо вопросы, не стесняйтесь спрашивать.

С Xcode 4.2 вы можете использовать флаг -scheme для этого:

 xcodebuild -scheme  archive 

После этой команды Архив появится в Xcode Organizer.

Обновление моего ответа с помощью Xcode 9 и Swift

Архив

 xcodebuild -workspace /.xcworkspace -scheme  clean archive -configuration release -sdk iphoneos -archivePath .xcarchive 

Экспорт IPA ( обратите внимание на параметр экспорта )

 xcodebuild -exportArchive -archivePath .xcarchive -exportOptionsPlist /exportOptions.plist -exportPath .ipa 

Ниже приведен старый ответ

Вот сценарий командной строки для создания архива и примера IPA. У меня есть проект iPhone xcode, который находится в папке Desktop / MyiOSApp.

Выполняйте следующие команды один за другим.

 cd /Users/username/Desktop/MyiOSApp/ xcodebuild -scheme MyiOSApp archive \ -archivePath /Users/username/Desktop/MyiOSApp.xcarchive xcodebuild -exportArchive -exportFormat ipa \ -archivePath "/Users/username/Desktop/MyiOSApp.xcarchive" \ -exportPath "/Users/username/Desktop/MyiOSApp.ipa" \ -exportProvisioningProfile "MyCompany Distribution Profile" 

Это проверено на Xcode 5 и работает отлично для меня.

Я использую собственный скрипт сборки для создания пакета ipa для распределения ad hoc.

 die() { echo "$*" >&2 exit 1 } appname='AppName' config='Ad Hoc Distribution' sdk='iphoneos3.1.3' project_dir=$(pwd) echo using configuration $config echo updating version number agvtool bump -all fullversion="$(agvtool mvers -terse1)($(agvtool vers -terse))" echo building version $fullversion xcodebuild -activetarget -configuration "$config" -sdk $sdk build || die "build failed" echo making ipa... # packaging cd build/"$config"-iphoneos || die "no such directory" rm -rf Payload rm -f "$appname".*.ipa mkdir Payload cp -Rp "$appname.app" Payload/ if [ -f "$project_dir"/iTunesArtwork ] ; then cp -f "$project_dir"/iTunesArtwork Payload/iTunesArtwork fi ipaname="$appname.$fullversion.$(date -u +%Y%m%d%H%M%S).ipa" zip -r $ipaname Payload echo finished making $ipaname 

Сценарий также увеличивает номер версии. Вы можете удалить эту часть, если она не нужна. Надеюсь, поможет.

Мы разработали iPad-приложение с XCode 4.2.1 и хотели интегрировать сборку в нашу непрерывную интеграцию (Jenkins) для распространения OTA. Вот решение, которое я придумал:

 # Unlock keychain security unlock-keychain -p jenkins /Users/jenkins/Library/Keychains/login.keychain # Build and sign app xcodebuild -configuration Distribution clean build # Set variables APP_PATH="$PWD/build/Distribution-iphoneos/iPadApp.app" VERSION=`defaults read $APP_PATH/Info CFBundleShortVersionString` REVISION=`defaults read $APP_PATH/Info CFBundleVersion` DATE=`date +"%Y%m%d-%H%M%S"` ITUNES_LINK="Download iPad2-App v$VERSION.$REVISION-$DATE<\/a>" # Package and verify app xcrun -sdk iphoneos PackageApplication -v build/Distribution-iphoneos/iPadApp.app -o $PWD/iPadApp-$VERSION.$REVISION-$DATE.ipa # Create plist cat iPadApp.plist.template | sed -e "s/\${VERSION}/$VERSION/" -e "s/\${DATE}/$DATE/" -e "s/\${REVISION}/$REVISION/" > iPadApp-$VERSION.$REVISION-$DATE.plist # Update index.html curl https://xxx.xxx.xxx/index.html -o index.html.$DATE cat index.html.$DATE | sed -n '1h;1!H;${;g;s/\(

Aktuelle Version<\/h3>\)\(.*\)\(

Ältere Versionen<\/h3>.
    .
  • \)/\1\ ${ITUNES_LINK}\ \3\2<\/li>\
  • /g;p;}' | sed -e "s/\${ITUNES_LINK}/$ITUNES_LINK/" > index.html

Затем Jenkins загружает файлы ipa, plist и html на наш веб-сервер.

Это шаблон plist:

     items   assets   kind software-package url https://xxx.xxx.xxx/iPadApp-${VERSION}.${REVISION}-${DATE}.ipa   kind full-size-image needs-shine  url https://xxx.xxx.xxx/iPadApp.png   kind display-image needs-shine  url https://xxx.xxx.xxx/iPadApp_sm.png   metadata  bundle-identifier xxx.xxx.xxx.iPadApp bundle-version ${VERSION} kind software subtitle iPad2-App title iPadApp      

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

Инструмент xcodebuild может создавать и экспортировать архивные продукты с флагом -exportArchive (с Xcode 5). Шаг экспорта был ранее возможен только через интерфейс пользовательского интерфейса Xcode.

Сначала заархивируйте свое приложение:

 xcodebuild -scheme  archive 

Учитывая $ARCHIVE_PATH (путь к файлу .xcarchive ), экспортируйте приложение из архива одним из следующих:

Файл iOS .ipa :

 xcodebuild -exportArchive -exportFormat ipa -archivePath "$ARCHIVE_PATH" -exportPath "myApp.ipa" -exportProvisioningProfile "My App Provisioning profile" 

Mac .app файл:

 xcodebuild -exportArchive -exportFormat app -archivePath "$ARCHIVE_PATH" -exportPath "myApp.app" -exportSigningIdentity "Developer ID Application: My Software Company" 

В обеих командах параметры -exportProvisioningProfile и -exportSigningIdentity необязательны. man xcodebuild для получения подробной информации о семантике. В этих примерах профиль обеспечения для сборки iOS задал профиль предоставления распределения AdHoc, а идентификатор подписи для приложения Mac указал идентификатор разработчика для экспорта в качестве стороннего приложения (то есть не распространяется через Mac App Store).

Я нашел некоторые другие ответы здесь, чтобы добиться успеха. Эта статья сделала, если для меня. Некоторые пути, возможно, должны быть абсолютными, как указано в других ответах.

Команда:

 xcrun -sdk iphoneos PackageApplication \ "/path/to/build/MyApp.app" \ -o "output/path/to/MyApp.ipa" \ --sign "iPhone Distribution: My Company" \ --embed "/path/to/something.mobileprovision" 

Вы действительно можете отменить сборку, как это делает XCode, чтобы вы могли протестировать и отправить один и тот же двоичный файл. Например, в моем скрипте (аналогичном приведенному выше) я создаю свою версию выпуска, подписанную как сборку AdHoc, затем я архивирую ее как IPA для тестирования, а затем смиряюсь с моим сертификатом распространения и создаю zip-файл, и это то, что я отправляю Яблоко. Соответствующая строка:

 codesign -f -vv -s "$DistributionIdentity" "$APPDIR" 

Для Xcode 7 у вас гораздо более простое решение. Единственная дополнительная работа заключается в том, что вам нужно создать файл plist конфигурации для экспорта архива.

(По сравнению с Xcode 6 в результатах xcrun xcodebuild -help -exportFormat и -exportProvisioningProfile больше не упоминаются, первый из них удаляется, а последний заменяется -exportOptionsPlist .)

Шаг 1 , смените каталог на папку, включая файл .xcodeproject или .xcworkspace.

 cd MyProjectFolder 

Шаг 2 , используйте Xcode или /usr/libexec/PlistBuddy exportOptions.plist для создания /usr/libexec/PlistBuddy exportOptions.plist экспорта. Кстати, xcrun xcodebuild -help расскажет вам, какие ключи вам нужно вставить в файл plist.

Шаг 3 , создайте файл .xcarchive (папка на самом деле) следующим образом (assembly / каталог будет автоматически создана Xcode прямо сейчас),

 xcrun xcodebuild -scheme MyApp -configuration Release archive -archivePath build/MyApp.xcarchive 

Шаг 4 , экспортируйте как .ipa-файл, подобный этому, который отличается от Xcode6

 xcrun xcodebuild -exportArchive -exportPath build/ -archivePath build/MyApp.xcarchive/ -exportOptionsPlist exportOptions.plist 

Теперь вы получаете файл ipa в каталоге build /. Просто отправьте его в Apple App Store.

Кстати, файл ipa, созданный Xcode 7, намного больше, чем Xcode 6.

Я дал краткое описание шагов, которые нужно выполнить, и параметры, которые нужно передать при генерации ipa, используя терминологию ниже:

  1. Перейдите в папку, содержащую файл MyApp.xcodeproject в терминале

  2. Используя приведенную ниже команду, вы получите все Цели приложения

     /usr/bin/xcodebuild -list 
  3. После выполнения вышеуказанной команды вы получите список целей, для которых вы должны выбрать конкретную цель, которую необходимо создать .ipa

     /usr/bin/xcodebuild -target $TARGET -sdk iphoneos -configuration Release 
  4. Вышеупомянутая команда создает проект и создает файл .app. Путь для поиска файла ./build/Release-iphoneos/MyApp.app является ./build/Release-iphoneos/MyApp.app

  5. После того, как assembly будет выполнена успешно, выполните следующую команду для создания .ipa приложения с использованием имени разработчика и профиля Provisioning Profile с помощью синтаксиса ниже:

     /usr/bin/xcrun -sdk iphoneos PackageApplication -v “${TARGET}.app” -o “${OUTDIR}/${TARGET}.ipa” –sign “${IDENTITY}” –embed “${PROVISONING_PROFILE}” 

Объяснение каждого параметра в приведенном выше синтаксисе:

 ${TARGET}.app == Target path (ex :/Users/XXXXXX/desktop/Application/build/Release-iphoneos/MyApp.app) ${OUTDIR} == Select the output directory(Where you want to save .ipa file) ${IDENTITY} == iPhone Developer: XXXXXXX (XXXXXXXXXX)(which can be obtained from Keychain access) ${PROVISONING_PROFILE} == Path to the provisioning profile(/Users/XXXXXX/Library/MobileDevice/Provisioning Profiles/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.mobileprovision”) 
  1. ipa будет сгенерирован в выбранном выходном каталоге ” $ {OUTDIR}

Xcode 8:


Формат IPA:

 xcodebuild -exportArchive -exportFormat IPA -archivePath MyMobileApp.xcarchive -exportPath MyMobileApp.ipa -exportProvisioningProfile 'MyMobileApp Distribution Profile' 

Экспортирует архив MyMobileApp.xcarchive в качестве файла IPA на путь MyMobileApp.ipa, используя профиль распределения MyMobileApp.

Формат APP:

 xcodebuild -exportArchive -exportFormat APP -archivePath MyMacApp.xcarchive -exportPath MyMacApp.pkg -exportSigningIdentity 'Developer ID Application: My Team' 

Экспортирует архив MyMacApp.xcarchive в виде файла PKG на путь MyMacApp.pkg с использованием идентификатора подписи приложения для каттинга приложения. Идентификатор разработчика. Приложение: Моя команда. Идентификатор подписи установщика. Индекс разработчика ID: Моя команда неявно используется для подписи экспортированного пакета.

Персональная страница Xcodebuild

Перейдите в папку, где находится ваш корень проекта, и:

 xcodebuild -project projectname -activetarget -activeconfiguration archive 

Идя еще на один шаг, загрузив iTunesConnect через командную строку с помощью Xcode 7 ! (Предполагая, что вы начинаете с .ipa , который был подписан с правильным профилем выпуска и подписанием идентификатора.)

Введите altool , интерфейс CLI для Application Loader ( docs , стр. 38). Скрытая структура внутри Xcode.app, является удобной функцией, позволяющей загружать непосредственно в ItunesConnect.

 /Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool 

Просто запустите $ altool --upload-app -f file -u username [-p password] чтобы загрузить новый .ipa прямо в Apple. Пароль не является обязательным и будет запрашивать его, если вы оставите его вне команды.

Если во время проверки будут проблемы с приложением, консоль распечатает их.

Вероятно, вам придется экспортировать путь к altool если вы не хотите сохранять его местоположение.

 export PATH=$PATH:/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/ 

Это оно! Просто войдите в iTunesConnect.com и выберите новую сборку для тестирования с помощью testflight.

Заключительное примечание. Если вы получаете сообщение об ошибке « Exception while launching iTunesTransporter: Transporter not found at path: /usr/local/itms/bin/iTMSTransporter. You should reinstall the application Exception while launching iTunesTransporter: Transporter not found at path: /usr/local/itms/bin/iTMSTransporter. You should reinstall the application , вы можете следовать предложению этого SO-ответа , чтобы запустить символическую ссылку в нужное место:

 ln -s /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms /usr/local/itms 

Улучшив ответ Винсента, я написал сценарий для этого: xcodearchive
Это позволяет вам архивировать (генерировать ipa) ваш проект через командную строку. Подумайте об этом, как о сестре команды xcodebuild , но для архивирования.

Код доступен в github: http://github.com/gcerquant/xcodearchive

Один из вариантов сценария – включить архивирование символов dSYM в архиве с отметкой времени. Никаких оправданий, чтобы больше не хранить символы и не иметь возможности символизировать журнал сбоев, который вы позже можете получить.

попробуйте xctool, это замена для xcodebuild от Apple, что упрощает сборку и тестирование продуктов iOS и Mac. Это особенно полезно для непрерывной интеграции. Он имеет несколько дополнительных функций:

  1. Выполняет те же тесты, что и Xcode.app.
  2. Структурированный вывод результатов сборки и тестирования.
  3. Удобный для человека, выход ANSI.

No.3 чрезвычайно полезен. Я не могу, если кто-то может прочитать консольный вывод xcodebuild, я не могу, обычно он дал мне одну строку с 5000 + символами. Еще труднее читать, чем тезис.

xctool: https://github.com/facebook/xctool

если вы используете следующий инструмент: https://github.com/nomad/shenzhen

то эта задача очень проста:

 which ipa 1>/dev/null 2>&1 || echo 'no shenzhen. to install use: sudo gem install shenzhen --no-ri --no-rdoc' ipa build --verbose --scheme "${schemeName}" 

источник

После обновления до Xcode 8 я обнаружил, что корпоративное ipa генерирует

 /usr/bin/xcrun -sdk iphoneos PackageApplication -v "${RELEASE_BUILDDIR}/${APPLICATION_NAME}.app" -o "${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.ipa" --sign "${DEVELOPER_NAME}" --embed "${PROVISONING_PROFILE}" 

Невозможно запустить команду из-за некоторой проблемы с подписью. Журнал указывает, что «предупреждение: PackageApplication устарело, вместо этого используйте xcodebuild -exportArchive .

Поэтому я переключаюсь на xcodebuild -exportArchive и все возвращается в нормальное состояние.

Вы имеете в виду опции validate / share / submit? Я думаю, что они специфичны для Xcode и не подходят для инструмента построения командной строки.

С некоторой ухищренностью, я уверен, вы могли бы сделать сценарий, чтобы сделать это за вас. Похоже, что они просто хранятся в ~/Library/MobileDevice/Archived Applications/ с UUDI и plist. Я не могу себе представить, что было бы сложно переделать валидатор.

Процесс, который меня интересует, заключается в отправке сборок бета-тестерам. (Поскольку представление в App Store происходит нечасто, я не против делать это вручную, тем более, что мне часто нужно добавлять новый текст описания.) Выполняя псевдо-сборку + архив с помощью CLI Xcode, я могу запускать автоматические сборки из каждого кода, создавать файлы IPA со встроенными профилями подготовки и отправлять их тестерам.

  • Разделить строку, содержащую параметры командной строки, в строку в C #
  • Включая все банки в каталог в пути Java classpath
  • Создайте приложение Android Studio через командную строку
  • Как выполнить несколько операторов в анонимной функции MATLAB?
  • Выполнить и получить вывод команды оболочки в node.js
  • Флаги Perl -pe, -pi, -p, -w, -d, -i, -t?
  • отправлять / отправлять xml-файл с помощью командной строки curl
  • Постройте несколько проектов CDT C ++ из командной строки
  • Захват Ctrl + C в Java
  • Как перебрать файлы, соответствующие шаблону в пакетном файле
  • Как использовать строки файла в качестве аргументов команды?
  • Interesting Posts

    Как написать масштабируемый сервер Tcp / Ip

    Как пакеты IP-ответа достигают своего адресата внутри частной локальной сети?

    Сделать все мои документы с текстом анонимными

    Демонтаж исполняемого файла в недоступном

    Кастинг объектов в Java

    Как забыть / удалить имя пользователя в Windows 8 Store – аккаунт удален

    Как вы используете String.substringWithRange? (или, как работают диапазоны в Swift?)

    Ошибки Grails 2.4 и hibernate4 с run-app

    В браузере Google Chrome, почему Gmail использует большую часть процессора при включении аппаратного ускорения?

    Код запуска JQuery 2 секунды после последнего нажатия клавиши

    Почему в 64-битном виртуальном адресе есть 4 бита (48 бит) по сравнению с физическим адресом (длиной 52 бит)?

    Самый эффективный метод дерева привязки с использованием Entity Framework

    Найти элементы в одном столбце, которые не находятся в другом столбце

    Android – OnDateChangedListener – как вы это устанавливаете?

    Entity Framework – получить идентификатор до «SaveChanges» внутри транзакции

    Давайте будем гением компьютера.