Ошибки, преобразующие 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

  • создайте .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 с параметрами экспорта. Для полного списка того, что вы можете добавить в этот 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 архив
  • снова экспортировать архив