Ошибки при преобразовании xcarchive в IPA - архив с одним пакетом + отсутствующие значения метода plist
Я пытаюсь преобразовать мой xcarchive в IPA (XCode 7.1.1). Следующая команда
xcodebuild
-exportArchive -archivePath foo.xcarchive -exportPath . -exportFormat IPA
Сбой с ошибкой
архив по пути 'foo.xcarchive' не является архивом из одного пакета
Поскольку приведенная выше команда технически устарела, я также попробовал новую форму:
xcodebuild
-exportArchive -archivePath foo.xcarchive -exportPath .
-exportOptionsPlist ipa.plist
Где ipa.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>method</key>
<string>app-store</string>
</dict>
</plist>
Что привело к ошибке:
error: exportArchive: exportOptionsPlist Ошибка для ключа 'method': ожидался один из {}, но найден магазин приложений
Теперь, пытаясь отладить это, я открыл папку xcarchive и проверил ее структуру. Я заметил, что у меня есть папка на том же уровне, что и Products\Applications\foo.app
поэтому я удалил его и попытался снова безрезультатно (те же результаты). Затем я продолжил удалять файлы из foo.app до тех пор, пока у меня не осталось ничего, кроме двоичного файла DWARF - все еще без сигары (тот же результат), хотя это могло быть связано с тем, что я испортил подпись приложения, удалив файлы вручную.
7 ответов
Проблема заключалась в том, что один из наших шагов после сборки оставил случайную папку в TARGET_BUILD_DIR
, Это вызвало сгенерированный xcarchive
быть отформатирован как страшный общий архив. Мои попытки удалить папку после факта из xcarchive
Сам был обречен на провал, так как xcarchive
был помечен как универсальный в момент его создания (о чем свидетельствуют некоторые Info.plist
поля). Однажды я убедился TARGET_BUILD_DIR
содержал только .app
после того, как все этапы сборки были сказаны и выполнены, генерируется xcarchive
был правильно отформатирован как архив приложения iOS. Тот xcarchive
в свою очередь, был легко экспортирован в надлежащий IPA через xcodebuild -exportArchive -exportPlistOptions
Это официально поддерживаемая рекомендация Apple, которая заботится обо всех проблемных папках поддержки SWIFT и т.п.
Apple вернулась ко мне с решением. Начиная с Xcode 7 мы должны использовать xcodebuild вместо PackageApplication для создания .ipa
файл.
В xcodebuild появился новый -exportArchive
возможность создать .ipa
это работает больше как Xcode Organizer.
Итак, мы должны сейчас:
собрать архив с помощью архива xcodebuild
создать
.ipa
с помощью xcodebuild-exportArchive
Теперь мы строим архив следующим образом:
xcodebuild -workspace myApp.xcworkspace -scheme myApp -sdk iphoneos -configuration AppStoreDistribution archive -archivePath $PWD/build/myApp.xcarchive
Теперь мы экспортируем.ipa следующим образом:
xcodebuild -exportArchive -archivePath $PWD/build/myApp.xcarchive -exportOptionsPlist exportOptions.plist -exportPath $PWD/build
Эти две команды создают файлы build/myApp.xcarchive и build/myApp.ipa
Обратите внимание, что xcodebuild -exportArchive
требует -exportOptionsPlist
Аргумент, указывающий на файл.plist с параметрами экспорта. Чтобы получить полный список того, что вы можете поместить в этот список, запустите xcodebuild -help. Минимальное содержимое файла выглядит так:
<?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>method</key>
<string>app-store</string>
<key>teamID</key>
<string>YOUR_TEN_CHARACTER_TEAM_ID</string>
</dict>
</plist>
Так как способ создания IPA устарел, вы должны сделать следующее:
xcodebuild -scheme "Foo" -configuration Release clean build CODE_SIGN_IDENTITY="iPhone Distribution: Foo Corporation" -derivedDataPath "/path/to/some/folder/"
xcrun -sdk iphoneos PackageApplication "/path/to/some/folder/Build/Products/Release-iphoneos/foo.app" -o "/path/to/some/folder/foo.ipa"
Убедитесь, что вы заменили "Foo" именем своей схемы, а "iPhone Distribution: Foo Corporation" - своей подписью. И "/path/to/some/folder/" должен быть какой-то папкой сборки.
Я получил несколько похожих странных ошибок из XCode 7.2 при сборке симулятора в командной строке. Вы можете попробовать добавить -sdk iphoneos
на ваш xcodebuild
команда (чтобы пропустить сборки симулятора), или добавить что-то вроде -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest'
если вы строите для симулятора.
Архив по пути foo.xcarchive
не является архивом из одного пакета.
Об этой ошибке:
- проверить схему редактирования -> Build
- снимите флажки с других целей, включая "Анализ", "Тест", "Выполнить", "Профиль", "Архив".
xcodebuild
архив- снова экспортировать архив
Я недавно перешел на использование Fastlane gym
инструмент для создания и создания файлов ipa... У меня была проблема, когда одна командная строка работала для создания специальных сборок, и мне была нужна другая конфигурация для создания сборок в магазине приложений, и я не смог ее решить. Фастлэйн в значительной степени работал из коробки.
Попробуйте использовать абсолютные пути в качестве параметров для xcodebuild
варианты, а не относительные пути.
Так что-то вроде этого:
xcodebuild -exportArchive -archivePath "$PWD/foo.xcarchive" \
-exportPath "$PWD" -exportOptionsPlist "$PWD/ipa.plist"
Пока ваш .xcarchive
не поврежден и подписан правильно, это должно работать. Это то, что я использую в своей системе сборки.