Ошибка Xcode 6.1 при построении IPA
Просто обновлен до Xcode 6.1 сегодня и угадайте, что: Теперь у меня возникли проблемы с отправкой сборников с помощью приложения Desktop TestFlight. Здесь ошибка, которую я получаю, когда приложение начинает создавать IPA:
![The error]()
ошибка:/usr/bin/codesign --force --preserve-metadata = идентификатор, права, правила ресурсов --sign 854059d45eed724593debef577a562e1ba96ab55 --resource-правила =/TMP/QYFSJIvu7W/Полезная нагрузка /XX.app/ResourceRules.plist /tmp/QYFSJIvu 7W/Payload/XX.app не удалось с ошибкой 1. Выход: Предупреждение: использование -preserve-metadata с опцией "правила ресурсов" (устарел в Mac OS X >= 10.10)! Предупреждение: правила -resource были устарел в Mac OS X >= 10.10! /tmp/QYFSJIvu 7W/Payload/XX.app/ResourceRules.plist: невозможно прочитать ресурсы
"Статья поддержки" не знает, что происходит.
Это, похоже, не проблема с TestFlight, потому что то же самое происходит в среде CI, например, с Jenkins, используя xcrun или подобные инструменты.
Приложение не обновлялось в течение нескольких месяцев, поэтому я знаю, что я не должен ожидать каких-либо обновлений, чтобы исправить это в ближайшее время. Раньше это работало очень хорошо для меня и моих клиентов, поэтому я тоже не очень хочу отказаться от него и для чего-то другого.
Любые идеи о том, что это за ошибка, и как ее исправить, будут очень признательны.
Ответы
Ответ 1
Мне жаль, что я не знал, почему это работает, но вот исправление, которое сработало для меня:
Найдено исправление!
Нажмите на свой проект > Цели > Выберите цель > Настройки сборки >
Code Signing Resource Rules Path
и добавьте:
$(SDKROOT)/ResourceRules.plist
Ответ 2
Следующий патч для PackageApplications исправил его для меня, я удалил правила ресурсов, поскольку он говорит, что он устарел 10.10.
Testflight строит работу без него. Appstore тоже строит.
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin
% diff PackageApplication PackageApplicationFixed
155,157c155,156
< my @codesign_args = ("/usr/bin/codesign", "--force", "--preserve-metadata=identifier,entitlements,resource-rules",
< "--sign", $opt{sign},
< "--resource-rules=$destApp/ResourceRules.plist");
---
> my @codesign_args = ("/usr/bin/codesign", "--force", "--preserve-metadata=identifier,entitlements",
> "--sign", $opt{sign});
Ответ 3
Я отправил по электронной почте поддержку TestFlight и получил этот ответ:
Наша команда в настоящее время исследует эту проблему с помощью приложения TestFlight Desktop. Тем временем, пожалуйста, используйте Xcode для создания файла IPA, а затем загрузите его с помощью настольного приложения или веб-сайта TestFlight.
Рекомендуемый метод обхода работы.
Ответ 4
Ответ Тима Гостони больше не работает с момента выпуска Xcode 7. Теперь процесс подачи в App Store завершился неудачно, когда существуют правила ресурса. Решение состоит в том, чтобы очистить путь правил ресурсов подписи кода и заменить xcrun на инструмент xcodebuild:
xcodebuild -exportArchive -archivePath [path to archive] -exportPath [path to output directory] -exportOptionsPlist [path to options.plist file]
Простейший Option.plist для экспорта файлов ada hoc-распространения ipa выглядит следующим образом:
<?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>iCloudContainerEnvironment</key>
<string>Production</string>
<key>teamID</key>
<string>[YOUR TEAM ID]</string>
<key>method</key>
<string>ad-hoc</string>
</dict>
</plist>
В этом файле plist есть другие параметры, касающиеся bitcode, прореживания приложений и т.д. Поэтому я считаю, что инструмент xcodebuild - это правильный инструмент для экспорта файлов ipa для iOS 9 и выше.
Подробнее о параметрах plist доступны с помощью команды xcodebuild -help.
Ответ 5
В Yosemite w/XCode 6.4 даже с использованием патча SDKROOT сбой кодов. В следующей статье объясняется, как исправить XCode script, чтобы обойти это. Обратите внимание, что это исправление XCode, поэтому оно зависит от версии, но устраняет проблему.
http://www.jayway.com/2015/05/21/fixing-your-ios-build-scripts
Ответ 6
Ответ от Alistra работает для меня, но я не хочу менять script, который не является моим (будущий выпуск Xcode может изменить этот файл и коррекция будет потеряна).
diff PackageApplication PackageApplicationFixed 155,157c155,156
<- my @codesign_args = ("/usr/bin/codesign", "--force", "--preserve-metadata=identifier,entitlements,resource-rules",
<- "--sign", $opt{sign},
<- "--resource-rules=$destApp/ResourceRules.plist");
---
-> my @codesign_args = ("/usr/bin/codesign", "--force", "--preserve-metadata=identifier,entitlements",
-> "--sign", $opt{sign});
Я думаю, ответ от Владимира Григорова лучше всего, если у вас есть архив, используя:
xcodebuild -exportArchive -archivePath [path to archive] -exportPath [path to output directory] -exportOptionsPlist [path to options.plist file]
В моем случае у меня нет архива, потому что я изменяю приложение после его сборки, и мне нужно изменить идентификатор Bundle и подпись.
Решение, которое я нашел, - это вызвать codesign
сам, прежде чем использовать PackageApplication
, и попросить PackageApplication
не подписывать. Вот так:
replace :
/usr/bin/xcrun -sdk iphoneos PackageApplication -v "<app_path>" -o "<ipa_path>" --sign "<provisioning_profile.certificateSubject>" --embed "<provisioning_profile.path>"
by :
/bin/cp -rpfv "<provisioning_profile.path>" "<app_path>/embedded.mobileprovision"
/usr/bin/codesign -v -vvvv -f -s "<provisioning_profile.certificateSubject>" --entitlements="<entitlement_path>" "<app_path>"
/usr/bin/xcrun -sdk iphoneos PackageApplication -v "<app_path>" -o "<ipa_path>"
Не забудьте вставить файл .mobileprovision
, используя знак cp
.
Ответ 7
Как указано в другом ответе, вы также можете просто не указать сертификат распространения для подписывания, и он будет правильно упаковываться. TestFlight должен будет обновить свое приложение, чтобы сделать это.