Ошибка 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 должен будет обновить свое приложение, чтобы сделать это.