Xcode 3.2 предоставляет потрясающую новую функцию в меню Build, «Build and Archive», которая генерирует файл .ipa, подходящий для специального распространения. Вы также можете открыть Организатор, перейти к разделу «Архивные приложения» и «Отправить приложение в iTunesConnect».
Есть ли способ использовать «Build and Archive» из командной строки (как часть сценария сборки)? Я бы предположил, что xcodebuild
будет как-то задействован, но страница man
, похоже, ничего об этом не говорит.
ОБНОВЛЕНИЕМихаил Гринич запросил разъяснения; вот что именно вы не можете сделать с помощью сборок из командной строки, функции, которые вы можете делать ТОЛЬКО с Xcode Organizer после «Сборки и архивирования».
Я хотел бы, чтобы кто-то пришел и доказал, что я не прав: обе эти функции прекрасно работают в графическом интерфейсе 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 <SchemeName> archive
После этой команды Архив появится в Xcode Organizer.
Обновление моего ответа с Xcode 9 и Swift
Архив
xcodebuild -workspace <ProjectName>/<ProjectName>.xcworkspace -scheme <schemeName> clean archive -configuration release -sdk iphoneos -archivePath <ProjectName>.xcarchive
IPA Export (обратите внимание на список параметров экспорта)
xcodebuild -exportArchive -archivePath <ProjectName>.xcarchive -exportOptionsPlist <ProjectName>/exportOptions.plist -exportPath <ProjectName>.ipa
Для тех, кто не знает о exportOptions.plist, https://blog.bitrise.io/new-export-options-plist-in-xcode-9
Те, кто использовал это для создания проекта в инструментах CI/CD, таких как teamcity/jenkins, пожалуйста, убедитесь, что вы используете правильный xcode, установленный в агенте сборки для архивации и экспорта.
Вы можете использовать любой из двух вариантов для этого.
/Applications/Xcode 9.3.1.app/Contents/Developer/usr/bin/xcodebuild
xcode-select -switch /Applications/Xcode 9.3.1.app
Ниже старый ответ
Вот скрипт командной строки для создания архива и пример 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 для специального распространения.
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="<a href=\"itms-services:\/\/?action=download-manifest\&url=https:\/\/xxx.xxx.xxx\/iPadApp-$VERSION.$REVISION-$DATE.plist\">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/\(<h3>Aktuelle Version<\/h3>\)\(.*\)\(<h3>Ältere Versionen<\/h3>.<ul>.<li>\)/\1\
${iTunes_LINK}\
\3\2<\/li>\
<li>/g;p;}' | sed -e "s/\${iTunes_LINK}/$iTunes_LINK/" > index.html
Затем Jenkins загружает файлы ipa, plist и html на наш веб-сервер.
Это шаблон plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>https://xxx.xxx.xxx/iPadApp-${VERSION}.${REVISION}-${DATE}.ipa</string>
</dict>
<dict>
<key>kind</key>
<string>full-size-image</string>
<key>needs-shine</key>
<true/>
<key>url</key>
<string>https://xxx.xxx.xxx/iPadApp.png</string>
</dict>
<dict>
<key>kind</key>
<string>display-image</string>
<key>needs-shine</key>
<true/>
<key>url</key>
<string>https://xxx.xxx.xxx/iPadApp_sm.png</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>xxx.xxx.xxx.iPadApp</string>
<key>bundle-version</key>
<string>${VERSION}</string>
<key>kind</key>
<string>software</string>
<key>subtitle</key>
<string>iPad2-App</string>
<key>title</key>
<string>iPadApp</string>
</dict>
</dict>
</array>
</dict>
</plist>
Чтобы настроить это, вы должны импортировать сертификат распределения и профиль обеспечения в цепочку ключей назначенного пользователя.
Инструмент xcodebuild
может создавать и экспортировать архивные продукты с флагом -exportArchive (начиная с Xcode 5). Шаг экспорта ранее был возможен только через интерфейс Xcode Organizer.
Сначала заархивируйте ваше приложение:
xcodebuild -scheme <scheme name> archive
Используя $ARCHIVE_PATH
(путь к .xcarchive file), экспортируйте приложение из архива одним из следующих способов:
iOS .ipa file:
xcodebuild -exportArchive -exportFormat ipa -archivePath "$ARCHIVE_PATH" -exportPath "myApp.ipa" -exportProvisioningProfile "My App Provisioning profile"
Mac .app file:
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"
Ниже я дал краткое описание шагов, которые необходимо выполнить, и параметров, которые необходимо передать при создании ipa с использованием terrminal:
Перейдите в папку, которая содержит файл MyApp.xcodeproject в терминале
Используя приведенную ниже команду, вы получите все цели приложения
/usr/bin/xcodebuild -list
После выполнения вышеупомянутой команды вы получите список целей, из которых вы должны выбрать конкретную цель, которую вы хотите сгенерировать .ipa
/usr/bin/xcodebuild -target $TARGET -sdk iphoneos -configuration Release
Приведенная выше команда создает проект и создает файл .app. Путь для поиска файла .app - ./build/Release-iphoneos/MyApp.app
После успешного выполнения сборки выполните следующую команду, чтобы сгенерировать .ipa приложения, используя Имя разработчика и Профиль обеспечения, используя приведенный ниже синтаксис:
/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”)
Для Xcode 7 у вас есть намного более простое решение. Единственная дополнительная работа заключается в том, что вам нужно создать файл конфигурации plist для экспорта архива.
(По сравнению с Xcode 6 в результатах опций xcrun xcodebuild -help
, -exportFormat
и -exportProvisioningProfile
больше не упоминается; первый удаляется, а второй заменяется на -exportOptionsPlist
.)
Шаг 1 , измените каталог на папку, включающую файл .xcodeproject или .xcworkspace.
cd MyProjectFolder
Шаг 2 , используйте Xcode или /usr/libexec/PlistBuddy exportOptions.plist
для создания файла опций экспорта. Кстати, xcrun xcodebuild -help
скажет вам, какие ключи вы должны вставить в plist-файл.
Шаг 3 , создайте файл .xcarchive (фактически, папку) следующим образом (каталог/build будет автоматически создан 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:
xcodebuild -exportArchive -exportFormat IPA -archivePath MyMobileApp.xcarchive -exportPath MyMobileApp.ipa -exportProvisioningProfile 'MyMobileApp Distribution Profile'
Экспортирует архив MyMobileApp.xcarchive в виде файла IPA по пути MyMobileApp.ipa, используя Профиль обеспечения Профиль распространения MyMobileApp.
Формат приложения:
xcodebuild -exportArchive -exportFormat APP -archivePath MyMacApp.xcarchive -exportPath MyMacApp.pkg -exportSigningIdentity 'Developer ID Application: My Team'
Экспортирует архив MyMacApp.xcarchive в виде файла PKG по пути MyMacApp.pkg с помощью приложения идентификация подписи катиона Идентификатор разработчика Приложение: Моя команда. Установщик подписывает удостоверение личности Установщик идентификатора разработчика: Моя команда неявно используется для подписи экспортируемого пакета.
Перейдите в папку, где находится корень вашего проекта и:
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
, вы можете следовать предложению этот 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 в архиве с меткой времени. Нет оправдания для того, чтобы больше не хранить символы и не иметь возможности символизировать журнал аварийного отказа, который вы можете получить позже.
если вы используете следующий инструмент: 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}"
попробуйте xctool, это замена для xcodebuild от Apple, которая упрощает создание и тестирование продуктов для iOS и Mac. Это особенно полезно для непрерывной интеграции. У него есть несколько дополнительных функций:
№ 3 чрезвычайно полезен. Я не могу, если кто-то может прочитать вывод консоли xcodebuild, я не могу, обычно он дает мне одну строку с 5000+ символами. Даже труднее читать, чем дипломную работу.
После обновления до 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
и все возвращается в норму.
Вы имеете в виду подтвердить/поделиться/отправить варианты? Я думаю, что они специфичны для XCode и не подходят для инструмента сборки из командной строки.
С некоторой сообразительностью, держу пари, вы могли бы сделать сценарий, чтобы сделать это для вас. Похоже, они просто хранятся в ~/Library/MobileDevice/Archived Applications/
с UUDI и списком. Я не могу себе представить, что было бы так сложно перепроектировать валидатор.
Процесс, который меня интересует, автоматизирует отправку сборок бета-тестерам. (Поскольку передача в App Store происходит нечасто, я не возражаю делать это вручную, тем более что мне часто нужно добавлять новый текст описания.) Выполняя псевдо-сборку + архив с использованием интерфейса командной строки Xcode, я могу запускать автоматические сборки из каждого коммита кода, создавать файлы IPA со встроенными профилями обеспечения и отправлять их по электронной почте тестерам.
Как построить проект iOS с помощью команды?
Clean : codebuild clean -workspace work-space-name.xcworkspace -scheme scheme-name
&&
Archive : xcodebuild archive -workspace work-space-name.xcworkspace -scheme "scheme-name" -configuration Release -archivePath IPA-name.xcarchive
&&
Export : xcodebuild -exportArchive -archivePath IPA-name.xcarchive -exportPath IPA-name.ipa -exportOptionsPlist exportOptions.plist
Что такое ExportOptions.plist?
ExportOptions.plist требуется в Xcode. Позволяет указать некоторые параметры при создании файла ipa. Вы можете выбрать параметры в дружественном пользовательском интерфейсе, когда вы используете Xcode для архивирования своего приложения.
Важно : метод для выпуска и разработки отличается в ExportOptions.plist
Магазин приложений :
exportOptions_release ~ method = app-store
Разработка
exportOptions_dev ~ method = development