Это зависит от того, операционные системы, как правило, очищают его для вас, но если вы работаете, например, встраиваемое программное обеспечение, оно может не быть выпущено.
Просто убедитесь, что вы освободили его, он может сэкономить вам много времени, когда вы захотите интегрировать его в большой проект.
Я нашел, как автоматизировать процесс сборки и архивирования из командной строки, я только что написал статью в блоге , объясняющую, как этого добиться.
Команду, которую вы должны использовать, это 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}"
Все подробности вы найдете в в статье . Если у вас есть какие-либо вопросы, не стесняйтесь их задавать.
Как построить проект iOS с помощью команды?
Clean : codebuild clean -workspace work-space-name.xcworkspace -scheme scheme-name
& amp;
Archive : xcodebuild archive -workspace work-space-name.xcworkspace -scheme "scheme-name" -configuration Release -archivePath IPA-name.xcarchive
& amp;
Export : xcodebuild -exportArchive -archivePath IPA-name.xcarchive -exportPath IPA-name.ipa -exportOptionsPlist exportOptions.plist
Что такое ExportOptions.plist?
ExportOptions.plist требуется в Xcode. Позволяет указать некоторые параметры при создании файла ipa. Вы можете выбрать параметры в дружественном пользовательском интерфейсе, когда вы используете Xcode для архивирования своего приложения.
Важно : Метод выпуска и разработки отличается в ExportOptions.plist
AppStore:
exportOptions_release ~ method = app-store
Разработка
exportOptions_dev ~ method = development
Вы имеете в виду проверить / поделиться / отправить варианты? Я думаю, что они специфичны для XCode и не подходят для инструмента сборки из командной строки.
С некоторой сообразительностью, держу пари, ты мог бы сделать сценарий, чтобы сделать это для тебя. Похоже, они просто хранятся в ~/Library/MobileDevice/Archived Applications/
с UUDI и списком. Я не могу себе представить, что так же сложно будет спроектировать валидатор.
Процесс, который меня интересует, автоматизирует отправку сборок бета-тестерам. (Поскольку передача в App Store происходит нечасто, я не возражаю делать это вручную, тем более что мне часто приходится добавлять новый текст описания.) Выполняя псевдо-сборку + архив с использованием интерфейса командной строки Xcode, я могу запускать автоматические сборки из каждого коммита кода, создавать файлы IPA со встроенными профилями обеспечения и отправлять их по электронной почте тестерам.
После обновления до 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
, и все возвращается в норму.
Если вы используете следующий инструмент: 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+ символами. Даже труднее читать, чем дипломную работу.
Улучшая ответ Винсента, я написал скрипт для этого: xcodearchive
Он позволяет вам архивировать (генерировать ipa) ваш проект через командную строку. Думайте об этом как о сестре команды xcodebuild
, но для архивации.
Код доступен на github: http://github.com/gcerquant/xcodearchive
Один из вариантов сценария - включить архивирование Символы dSYM в архиве с метками времени. Нет оправдания тому, чтобы больше не хранить символы и не иметь возможности символизировать журнал аварийного сбоя, который вы можете получить позже.
Пройдя еще один шаг, загрузите в iTunesConnect через командную строку с Xcode 7 ! (Предполагая, что вы начинаете с .ipa
, который был подписан с правильным профилем выпуска и подписью.)
Введите altool
, интерфейс CLI для загрузчика приложений ( 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
Перейдите в папку, где находится корневой каталог вашего проекта, и:
xcodebuild -project projectname -activetarget -activeconfiguration archive
С Xcode 4.2 вы можете использовать флаг -scheme, чтобы сделать это:
xcodebuild -scheme <SchemeName> archive
После этой команды Архив появится в Xcode Organizer.
Я использовал свой собственный скрипт для создания пакета 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
Скрипт также увеличивает номер версии. Вы можете удалить эту часть, если она не нужна. Надеюсь, это поможет.
Ниже приведено краткое описание шагов, которые необходимо выполнить, и параметров, которые необходимо передать при создании 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 9 и Swift
Архив
xcodebuild -workspace <ProjectName>/<ProjectName>.xcworkspace -scheme <schemeName> clean archive -configuration release -sdk iphoneos -archivePath <ProjectName>.xcarchive
Экспорт IPA ( обратите внимание на список параметров экспорта )
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 и работает нормально для меня.
Я нашел некоторые другие ответы здесь трудными для начала. Эта статья сделала, если для меня. Некоторые пути, возможно, должны быть абсолютными, как упомянуто в других ответах.
Команда:
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"
Инструмент xcodebuild
может создавать и экспортировать архивные продукты с флагом -exportArchive (начиная с Xcode 5). Этап экспорта ранее был возможен только через пользовательский интерфейс Xcode Organizer.
Сначала заархивируйте свое приложение:
xcodebuild -scheme <scheme name> 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).
Мы разработали приложение для 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
Затем Дженкинс загружает файлы 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>
Для настройки необходимо импортировать сертификат распределения и профиль обеспечения в цепочку ключей назначенного пользователя.
Для Xcode 7 у вас есть намного более простое решение. Единственная дополнительная работа заключается в том, что вам нужно создать файл конфигурации для экспорта архива.
(По сравнению с 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 (фактически, папку) (сборка / каталог будет автоматически создан 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.
Вы МОЖЕТЕ отказаться от сборки, как это делает XCode, чтобы вы могли протестировать и отправить тот же двоичный файл. Например, в моем сценарии (аналогичном описанному выше) я создаю свою версию выпуска, подписанную как сборку AdHoc, затем архивирую ее как IPA для тестирования, затем подаю в отставку с моим сертификатом распространения и создаю zip-файл, который я и отправляю Яблоко. Соответствующая строка:
codesign -f -vv -s "$DistributionIdentity" "$APPDIR"
Формат IPA:
xcodebuild -exportArchive -exportFormat IPA -archivePath MyMobileApp.xcarchive -exportPath MyMobileApp.ipa -exportProvisioningProfile 'MyMobileApp Distribution Profile'
Экспортирует архив MyMobileApp.xcarchive в виде файла IPA для путь MyMobileApp.ipa с использованием профиля обеспечения MyMobileApp Distribution Profile.
Формат APP:
xcodebuild -exportArchive -exportFormat APP -archivePath MyMacApp.xcarchive -exportPath MyMacApp.pkg -exportSigningIdentity 'Developer ID Application: My Team'
Экспортирует архив MyMacApp.xcarchive в виде файла PKG по пути MyMacApp.pkg, используя приложение, подписывающее код подписи приложения ID разработчика: Моя команда. Установщик подписывает удостоверение личности Идентификатор разработчика Установщик: Моя команда неявно используется для подписи экспортируемого пакета.