Создание 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><none></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"