Ошибки при преобразовании 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.

Итак, мы должны сейчас:

  1. собрать архив с помощью архива xcodebuild

  2. создать .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 не является архивом из одного пакета.

Об этой ошибке:

  1. проверить схему редактирования -> Build
  2. снимите флажки с других целей, включая "Анализ", "Тест", "Выполнить", "Профиль", "Архив".
  3. xcodebuild архив
  4. снова экспортировать архив

Я недавно перешел на использование Fastlane gym инструмент для создания и создания файлов ipa... У меня была проблема, когда одна командная строка работала для создания специальных сборок, и мне была нужна другая конфигурация для создания сборок в магазине приложений, и я не смог ее решить. Фастлэйн в значительной степени работал из коробки.

https://github.com/fastlane/gym

Попробуйте использовать абсолютные пути в качестве параметров для xcodebuild варианты, а не относительные пути.

Так что-то вроде этого:

xcodebuild -exportArchive -archivePath "$PWD/foo.xcarchive" \
-exportPath "$PWD" -exportOptionsPlist "$PWD/ipa.plist"

Пока ваш .xcarchive не поврежден и подписан правильно, это должно работать. Это то, что я использую в своей системе сборки.

Другие вопросы по тегам