Создание iOS build/ipa больше не работает из командной строки

Обзор

Наши сборки командной строки (для создания и создания .ipa) больше не работают.

iTunesConnect начал отклонять сборки, которые используют настройку сборки CODE_SIGN_RESOURCE_RULES_PATH.

Если мы создадим WITHOUT, то не удастся установить инструмент PackageApplication (который мы используем для создания подписанного .ipa).

Кажется, что PackageApplication вызывает /usr/bin/codesign с аргументами правил ресурсов, даже если параметр CODE_SIGN_RESOURCE_RULES_PATH build исключен

Я подозреваю, что PackageApplication необходимо обновить, чтобы он не вызывал /usr/bin/codesign с аргументами правил ресурсов, когда параметр CODE_SIGN_RESOURCE_RULES_PATH build исключен.

Кто-нибудь нашел решение для этого?

Подробнее

Мы создаем наше приложение в командной строке следующим образом:

xcodebuild -workspace myApp.xcworkspace -scheme myApp -sdk iphoneos -configuration AppStoreDistribution OBJROOT=$PWD/build SYMROOT=$PWD/build ONLY_ACTIVE_ARCH=NO 'CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist'

Мы создаем подписанную .ipa в командной строке следующим образом:

xcrun -log -sdk iphoneos PackageApplication "/Users/mpv/dev/myApp/build/AppStoreDistribution-iphoneos/myApp.app" -o "/Users/mpv/dev/myApp/build/AppStoreDistribution-iphoneos/myApp.ipa" -sign "iPhone Distribution: MyTeam (XXXXXXXXXX)" -embed /Users/mpv/Library/MobileDevice/Provisioning\ Profiles/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.mobileprovision

iTunesConnect теперь отклоняет наши сборки со следующей ошибкой:

"Этот пакет недействителен. В Info.plist содержится недопустимый ключ 'CFBundleResourceSpecification' в пакете myApp [myApp.app]"

Если мы удалим бит 'CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist' из команды сборки, приложение будет создано без ключа CFBundleResourceSpecification plist (который, я полагаю, является тем, что мы хотим). Новая команда сборки выглядит следующим образом:

xcodebuild -workspace myApp.xcworkspace -scheme myApp -sdk iphoneos -configuration AppStoreDistribution OBJROOT=$PWD/build SYMROOT=$PWD/build ONLY_ACTIVE_ARCH=NO 

Теперь проблема заключается в том, что команда для сборки .ipa терпит неудачу со следующей ошибкой:

ошибка:/usr/bin/codesign --force --preserve-metadata = идентификатор, права, правила ресурсов --sign iPhone Распространение: MyTeam (XXXXXXXXXX) --resource-правила =/вар/папки/2b/7hylk7nn13dgrl9yyh2wp0lm0000gn/Т/zDRRJMkKtQ/Полезная нагрузка /myApp.app/ResourceRules.plist --entitlements/var/folders/2b/7hylk7nn13dgrl9yyh2wp0lm0000gn/T/zDRRJMkKtQ/entitlements_plistIUdGWLYe /var/folders/ 2b/7hylk7nn13dgrl9yyh2wp0lm0000gn/T/zDRRJMkKtQ/Payload/myApp.app с ошибкой 1. Выход: Предупреждение: использование -preserve-metadata с опцией "правила ресурсов" (устарела в Mac OS X >= 10.10)!

Предупреждение: --resource-правила устарели в Mac OS X >= 10.10! /var/folders/ 2b/7hylk7nn13dgrl9yyh2wp0lm0000gn/T/zDRRJMkKtQ/Payload/myApp.app/ResourceRules.plist: не может читать ресурсы

Кажется, что PackageApplication вызывает /usr/bin/codesign с аргументами правил ресурсов, даже если параметр CODE_SIGN_RESOURCE_RULES_PATH аргумент/построение исключен.

Я думаю, что PackageApplication необходимо обновить, чтобы он не вызывал /usr/bin/codesign с аргументами правил ресурсов, когда параметр CODE_SIGN_RESOURCE_RULES_PATH аргумент/построение исключен.

Ответ 1

Apple вернулась ко мне с решением. Начиная с Xcode 7 мы должны использовать xcodebuild вместо PackageApplication для создания файла .ipa.

xcodebuild имеет новый параметр -exportArchive для создания .ipa, который больше похож на Xcode Organizer.

Итак, теперь мы должны:

  • создать архив с xcodebuild archive
  • создайте .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>

В Xcode 9 вам теперь нужно указать более подробную информацию в файле exportOptions.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>compileBitcode</key>
  <false/>
  <key>method</key>
  <string>ad-hoc</string>
  <key>provisioningProfiles</key>
  <dict>
    <key>my.bundle.idenifier</key>
    <string>My Provisioning Profile Name</string>
  </dict>
  <key>signingCertificate</key>
  <string>iPhone Distribution</string>
  <key>signingStyle</key>
  <string>manual</string>
  <key>stripSwiftSymbols</key>
  <true/>
  <key>teamID</key>
  <string>YOURTEAMID</string>
  <key>thinning</key>
  <string>&lt;none&gt;</string>
</dict>
</plist> 

Ответ 2

Шаги по созданию терминала iPA Usig

Чистый проект:

Release

xcodebuild clean -project ProjectPath/myApp.xcodeproj -configuration  ReleaseAdhoc  -alltargets

Отладка

xcodebuild clean -project ProjectPath/myApp.xcodeproj -configuration Debug -alltargets

Архивный проект:

Отладка

xcodebuild archive -project  ProjectPath/myApp.xcodeproj  -scheme "myApp" -configuration Debug  -archivePath  pathForArchiveFolder/myApp.xcarchive

Release

xcodebuild archive -project  ProjectPath/myApp.xcodeproj  -scheme "myApp"  -archivePath  pathForArchiveFolder/myApp.xcarchive

Экспорт IPA

Старая версия: это может привести к добавлению, изменению или удалению подписанного ресурса. Ошибка

xcodebuild -exportArchive -archivePath  projectPath/myapp.xcarchive  -exportPath  projectPath/myApp.ipa  -exportFormat ipa  -exportProvisioningProfile  "provisioning profile"

Новая версия:

xcodebuild -exportArchive -archivePath  ProjectPath/myapp.xcarchive  -exportPath  projectPath/myApp.ipa  -exportOptionsPlist  ProjectFolder/exportPlist.plist

Ответ 3

Вот быстрый совет, если вам нужно создать файл exportOptions.plist как часть вашего процесса сборки (возможно, Дженкинса).

Вы можете использовать инструмент plutil, чтобы превратить JSON в plist. Пример:

echo "{\"method\":\"app-store\"}" | plutil -convert xml1 -o /tmp/exportOptions.plist -- -

Наслаждайтесь!

Ответ 4

Перейдите в папку проекта:

Архив:

для DEBUG:

xcrun xcodebuild -scheme MyApp -configuration Debug archive -archivePath build/MyApp.xcarchive

для выпуска:

xcrun xcodebuild -scheme MyApp -configuration Release archive -archivePath build/MyApp.xcarchive

Извлечь iPA:

xcrun xcodebuild -exportArchive -exportPath build/ -archivePath build/MyApp.xcarchive/

Ответ 5

Я создал имя проекта myFirstApp, а местом проекта является Desktop/myFirstApp. Протестировано на Xcode 8.3

Шаг 1 -

cd /Users/Ved/Desktop/myFirstApp/

Шаг 2 -

xcodebuild -scheme myFirstApp archive \

-archivePath /Users/Ved/Desktop/myFirstApp.xcarchive

Шаг 3 -

xcodebuild -exportArchive -exportFormat ipa \

-archivePath "/Users/Ved/Desktop/myFirstApp.xcarchive" \

-exportPath "/Users/Ved/Desktop/myFirstApp.ipa" \

-exportProvisioningProfile "myFirstAppDevProfile"