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

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

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

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

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

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

Ответ 1

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

Команда, которую вы должны использовать, - 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}"

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

Ответ 2

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

xcodebuild -scheme <SchemeName> archive

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

Ответ 3

Вот командная строка script для создания архива и примера IPA. У меня есть проект xcode для iPhone, который находится в папке 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 и работает отлично для меня.

Ответ 4

Я использую собственную сборку script для создания пакета 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

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

Ответ 5

Мы разработали 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>&Auml;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>

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

Ответ 6

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

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

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).

Ответ 7

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

Команда:

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"

Ответ 8

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

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

Ответ 9

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

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

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

cd MyProjectFolder

Шаг 2, используйте Xcode или /usr/libexec/PlistBuddy exportOptions.plist для создания файла plists для экспорта. Кстати, 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.

Ответ 10

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

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

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

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

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

  • После того, как сборка завершена, выполните следующую команду для создания .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} "

Ответ 11

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 с использованием приложения-приложения             Идентификатор идентификатора катиона. Идентификатор разработчика. Приложение: Моя команда. Идентификатор подписи установщика             Идентификатор разработчика: моя команда неявно используется для подписи экспортированного пакета.

Страница руководства Xcodebuild

Ответ 12

Перейдите в папку с корнем вашего проекта и:

xcodebuild -project projectname -activetarget -activeconfiguration archive

Ответ 13

Переход на следующий шаг, загрузка в 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, вы можете следовать предложению this SO answer, чтобы запустить символическая ссылка на правильное местоположение:

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

Ответ 14

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

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


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

Ответ 15

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

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

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

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

Ответ 16

если вы используете следующий инструмент: 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}"

источник

Ответ 17

После обновления до 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, и все возвращается в нормальное состояние.

Ответ 18

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

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

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