Xcode «Сборка и архивирование» из командной строки

392

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

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

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

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

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

Дан Фабулич
источник
1
Оу, грубый Это кажется невозможным. Если вы не знаете ответа, пожалуйста, хотя бы проголосуйте за вопрос, чтобы моя награда не исчезла в эфире ... :-(
Дэн Фабулич
3
Это не невозможно, это просто не часть xcodebuild. Создание файла IPA просто включает в себя помещение приложения в каталог с именем «Payload», архивирование этого каталога и переименование его в MyAppName.ipa.
Михаил Гринич
@Michael, «Сборка и архивирование» также включает функции Организатора, которые недоступны, когда вы просто создаете файл IPA вручную.
Дан Фабулич
Мой комментарий стал немного длиннее, поэтому он опубликован как ответ .
Михаил Гринич
3
Хотя первый / принятый ответ vdaubry будет работать, ответ от Reid намного проще для более новых версий Xcode.
Прометей

Ответы:

314

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

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

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

vdaubry
источник
19
Не очевидно для меня в течение некоторого времени, но RELEASE_BUILDDIRдолжен быть абсолютный путь.
Дэвид Данхэм
5
Также обратите внимание, что вам не нужны опции --sign или --embed, если вы хотите сохранить ту же подпись / профиль, который использовался при сборке .app. Это будет то, что вы настроили в настройках сборки Code Signing для вашей версии Release.
Майк Веллер
12
Обратите внимание, что путь к файлу ipa -o "${ipa_path}"должен быть абсолютным. В противном случае вы, вероятно, получите error: Unable to create '.../...ipa'или это будет тихо проигнорировано создание. Черт возьми, я потратил пару часов.
h - n
2
Может кто-нибудь сказать мне, что делают фигурные скобки? Я предполагаю, что они заботятся о пробелах, но я могу ошибаться.
scord
6
Xcode 8.3 Beta 1 полностью удаляет команду PackageApplication. Не используйте его снова и используйте «xcodebuild -scheme <SchemeName> archive», как предложено ниже.
Hans Knöchel
283

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

xcodebuild -scheme <SchemeName> archive

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

Рейд Эллис
источник
3
Да, намного лучше! Чтобы заставить это работать, я сделал следующее: перейдите в папку вашего проекта, затем запустите «xcodebuild -scheme MyProjectName archive» (потому что обычно у вас есть схема с тем же именем, что и у вашего проекта)
Samuel
18
Обратите внимание, что archiveдействие не учитывает никаких настроек, которые вы предоставляете с помощью этого вызова, кроме рабочего пространства и схемы - это просто стоило мне часов !
danyowdee
5
Хорошо работает в Xcode 4.4 , и я уверен, что это было хорошо и в 4.3. Убедитесь, что вы выбрали правильный выпуск XCode с помощьюxcode-select <path to Xcode.app>
Reid Ellis
2
Также необходимо указать схему с помощью « -scheme <SchemeName>»
Рейд Эллис
6
Это хорошо для создания архива, однако PackageApplication в xcrun фактически создает файл .ipa. Вам нужен этот файл для распространения среди бета-тестеров через что-то вроде TestFlight
jmstone617
145

Обновление моего ответа с помощью 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, установленный в агенте сборки для архивации и экспорта.

Вы можете использовать любой из двух вариантов для этого.

  1. Используйте полный путь к xcodebuild,
/Applications/Xcode 9.3.1.app/Contents/Developer/usr/bin/xcodebuild
  1. Используйте xcode-select,
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 и работает нормально для меня.

Радж
источник
2
Он отлично работал на Xcode6.1.1. Я решил создать свои приложения из терминала, потому что Xcode6 выдает мне сообщение об ошибке «Ваша учетная запись уже имеет действительный сертификат», когда я пытаюсь создать рассылку AdHoc от организатора.
FormigaNinja
Если у вас есть приложение WatchKit, то в ipa есть новая папка под названием WatchKitSupport, а также папка Symbols (может быть необязательной). Вы знаете, есть ли способ заставить exportArcive экспортировать их тоже?
RPM
1
xcodebuild -workspace <ProjectName>/<ProjectName>.xcworkspace -scheme <schemeName> clean archive -configuration release -sdk iphoneos -archivePath <ProjectName>.xcarchiverequires a provisioning profile with the Associated Domains feature. Select a provisioning profile for the "Release" build configuration in the project editor.
выдает
1
@MohammadRezaKoohkan, который был в старом ответе, я сохранил его для показа ссылки, вы можете увидеть действительный вариант экспорта в начале моего ответа
Радж
1
@Raj Yeap, спасибо
Мохаммад Реза Koohkan
29

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

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

Arrix
источник
3
Это хорошее решение, хотя ваш код трудно читать без комментариев. Не могли бы вы написать немного больше о том, что происходит?
Михаил Гринич
Откуда xcode получает имя «APPNAME.ipa»? Из упаковки-> Название продукта?
Карлос Рикардо
3
Этого сценария недостаточно с приложением WatchKit. Кто-нибудь знает новые спецификации файла ipa с приложением watchkit?
RPM
Видя те же проблемы, что и @RPM с часовым комплектом. Любое разрешение?
danieljimenez
@RPM проверьте это для WatchKit. Я не пробовал сам, но, кажется, довольно тщательно matrixprojects.net/p/watchkit-command-line-builds
mattman88
26

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

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

xcodebuild -scheme <scheme name> archive

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

Файл .ipa для iOS :

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

Nik
источник
1
Не работает при использовании рабочих пространств xcode и не совместим с кокоподами
amleszk
1
Вы пытались добавить -workspaceопцию в xcodebuild (и путь к рабочей области)? man xcodebuildгласит: «Чтобы создать рабочее пространство Xcode, вы должны передать оба параметра -workspace и -scheme для определения сборки».
Ник
Это прекрасно работает для меня с добавленной опцией -workspace - мне просто нужно было получить путь к архиву, созданному первой командой, чтобы я мог передать его второй. Вы можете указать, где архив создается с параметром -archivePath, но я предпочитаю его расположение по умолчанию. Это помогло мне понять, как получить этот путь: stackoverflow.com/a/9024901/813247
robotspacer
24

Мы разработали приложение для 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>

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

FuePi
источник
3
Вы также можете изменить plist-файл командой Plistbuddy от Apple, например: / usr / libexec / PlistBuddy -c "Set: CFBundleVersion 1.2.3.4" /path/to/info.plist. Вместо того, чтобы играть с SED :)
Jelle De Laender
Спасибо за информацию. У меня больше опыта с sed, чем у plistbuddy, поэтому я выбираю sed :)
FuePi
1
Я рекомендую $WORKSPACEвместо $PWDгенерацииAPP_PATH
Ричард
16

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

Команда:

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"
zekel
источник
15

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

codesign -f -vv -s "$DistributionIdentity" "$APPDIR"
Duane Fields
источник
14

Для 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.

DawnSong
источник
1
как вы определяете профиль обеспечения с этим подходом. я попытался exportProvisioningProfile, но он сказал, что не может быть использован с exportOptionsPlist ... и нет никакого способа указать профиль в списке, который я могу найти ... кажется, просто взять самый старый с тем же именем, что и один который построил это (что противоположно тому, что я хочу, на самом деле)
Джон Эллис
Настройки проекта, включенные в файл с именем «project.pbxproj», уже подписывая параметры, так -schemeи -configurationпараметры определены , как подписать файл ИПС.
DawnSong
Когда вы говорите «просто отправьте это в Apple», что это за процесс, поскольку он выходит за рамки обычных шагов архивирования?
mix3d
Есть два способа «отправить его в Apple», войти на itunesconnect.apple.com или использовать Xcode-> Open Developer Tool-> Application Loader. @ mix3d
DawnSong
1
Я закончил тем, что нашел полностью автоматизированное решение, для которого я создал новый ответ!
mix3d
14

Ниже я дал краткое описание шагов, которые необходимо выполнить, и параметров, которые нужно передать при создании ipa с использованием terrminal:

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

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

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

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

  5. После успешного завершения сборки выполните следующую команду, чтобы сгенерировать .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”)
  1. ipa будет сгенерирован в выбранном выходном каталоге " $ {OUTDIR} "
Теджа Сваруп
источник
Я вижу эту ошибку "указанное приложение не существует или не является каталогом комплекта"
Ansari Awais
2
Пакетное приложение xcrun устарело.
Тунвир Рахман
8

Xcode 8:


Формат IPA:

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

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

Формат приложения:

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

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

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

Suhaib
источник
7

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

xcodebuild -project projectname -activetarget -activeconfiguration archive
erick2red
источник
7
Это не похоже на работу. Сборка 'archive' недоступна в XCode 3.2.2 (финальная версия).
Мартин Кот
4

Пройдя еще один шаг, загрузите в 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
mix3d
источник
3

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

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


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

Гийом
источник
@KunalBalani Нет, я бы не ожидал, что он будет правильно обрабатывать рабочее пространство. Посмотрите на код, его адаптация не займет много времени. Потяните запросы добро пожаловать!
Гийом
3

Как построить проект 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

AppStore:

exportOptions_release ~ method = app-store

развитие

exportOptions_dev ~ method = development

Hasnain Haider K Niazi
источник
2

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

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

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

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

Ситао Сюн
источник
2

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

источник

Максим Холявкин
источник
2

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

Джидонг Чен
источник
1

Вы имеете в виду проверить / поделиться / отправить варианты? Я думаю, что они специфичны для XCode и не подходят для инструмента сборки из командной строки.

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

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

Михаил Гринич
источник
Я уточнил свой вопрос. Когда вы говорите «я могу» выше, вы имеете в виду, что вы действительно можете сделать это сегодня?
Дан Фабулич
2
Да. Я использую Hudson Continuous Integration с пользовательским скриптом, который запускает xcodebuildи делает IPA.
Михаил Гринич
Извините, что опоздал на вечеринку, но у TestFlight есть супер простой API для загрузки, который вы должны проверить
self.name