Ошибки, преобразующие 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': ожидал один из {}, но нашел app-store
Теперь, пытаясь отладить это, я открыл папку xcarchive и проверил ее структуру. Я заметил, что у меня есть папка на том же уровне, что и Products\Applications\foo.app
, поэтому я удалил ее и попробовал снова безрезультатно (такие же результаты). Затем я приступил к удалению файлов из foo.app до тех пор, пока я не остался ни с чем, кроме двоичного файла DWARF - все равно не было сигары (такой же результат), хотя это могло быть связано с тем, что я испортил подпись приложения, удалив файлы вручную.
Ответы
Ответ 1
Проблема заключалась в том, что один из наших шагов после сборки оставил бродячую папку в TARGET_BUILD_DIR
. Это привело к тому, что сгенерированный xcarchive
был отформатирован как ужасный общий архив. Мои попытки удалить папку после факта из самого xcarchive
были обречены на провал, поскольку xcarchive
был отмечен как общий в момент его создания (о чем свидетельствуют некоторые отсутствующие поля Info.plist
). Как только я убедился, что TARGET_BUILD_DIR
содержит только .app
после того, как все этапы сборки были сказаны и выполнены, сгенерированный xcarchive
был правильно отформатирован как архив приложений iOS. То, что xcarchive
, в свою очередь, было легко экспортировано в надлежащий IPA через xcodebuild -exportArchive -exportPlistOptions
, что является официально поддерживаемой рекомендацией Apple, которая заботится обо всех проблемных папках поддержки SWIFT и т.п.
Ответ 2
Apple вернулась ко мне с решением. Начиная с Xcode 7 мы должны использовать xcodebuild вместо PackageApplication для создания файла .ipa
.
xcodebuild имеет новый параметр -exportArchive
для создания .ipa
, который больше похож на Xcode Organizer.
Итак, теперь мы должны:
Теперь мы создадим архив следующим образом:
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 с параметрами экспорта. Для полного списка того, что вы можете добавить в этот 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>
Ответ 3
Поскольку способ создания 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/" должна быть какая-то папка сборки.
Ответ 4
Попробуйте использовать абсолютные пути как параметры для опций xcodebuild
, а не относительные пути.
Так что-то вроде этого:
xcodebuild -exportArchive -archivePath "$PWD/foo.xcarchive" \
-exportPath "$PWD" -exportOptionsPlist "$PWD/ipa.plist"
Пока ваш .xcarchive
не поврежден и подписан правильно, это должно работать. Это то, что я использую в своей системе сборки.
Ответ 5
Я получил некоторые похожие странные ошибки из XCode 7.2 при создании для симулятора в командной строке. Вы можете попытаться либо добавить -sdk iphoneos
к вашей команде xcodebuild
(чтобы пропустить сборки симулятора), либо добавить что-то вроде -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest'
, если вы создаете для симулятора.
Ответ 6
Недавно я переключился на использование инструмента fastlane gym
для создания и создания файлов ipa... У меня возникла проблема, когда одна командная строка работала для создания специальных сборок, и мне нужна была другая конфигурация, чтобы создавать сборки хранилища приложений и не мог ее решить. Быстрые вещи в значительной степени работали из коробки.
https://github.com/fastlane/gym
Ответ 7
Архив на пути foo.xcarchive
не является архивом с одним пакетом.
Об этой ошибке:
- проверить схему редактирования → Build
- отключить другие цели, включая анализ, тест, запуск, профиль, архив
-
xcodebuild
архив
- снова экспортировать архив