Ошибка Xcode 6.1 При построении IPA


просто обновлен до Xcode 6.1 сегодня, и угадайте, что: теперь у меня возникли проблемы с отправкой сборок с помощью настольного приложения TestFlight. Вот ошибка, которую я получаю, когда приложение начинает строить IPA:

ошибка: / usr / bin / codesign --force -- сохранить-метаданные=идентификатор, права, ресурс-правила --знак 854059d45eed724593debef577a562e1ba96ab55 -- resource-rules=/tmp/QYFSJIvu7W/Payload/XX.app / ResourceRules.plist /tmp / QYFSJIvu7W / полезная нагрузка / XX. app Ошибка 1. Выход: Предупреждение: использование --preserve-metadata с опцией " resource-rules" (не рекомендуется в Mac OS X >= 10.10)! Предупреждение: --resource-правила были устарело в Mac OS X >= 10.10! /tmp/QYFSJIvu7W/полезная нагрузка/XX.app / ResourceRules.plist: не могу читать ресурсы

"статья поддержки" понятия не имеет, что происходит.

Это не кажется проблемой тестового полета, потому что то же самое происходит в среде CI, такой как Дженкинс, использующий xcrun или аналогичные инструменты.

приложение не обновлялось в течение нескольких месяцев, так что я знаю, что я не должен ожидать обновлений, чтобы исправить это в ближайшее время. Он работал очень хорошо для меня и моих клиентов, поэтому я не очень хочу отказаться от него для чего-то еще.

любые идеи о том, что это за ошибка, и как ее исправить, будут очень оценены.

7 140

7 ответов:

хотел бы я знать почему это работает, но вот исправление это сработало для меня:

нашел исправить !

нажмите на свой проект > цели > выберите цель > настройки сборки >

Code Signing Resource Rules Path

и добавить :

$(SDKROOT)/ResourceRules.plist

следующий патч для PackageApplications исправил его для меня, я удалил resource-rules, поскольку он говорит, что он устарел на 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});

Я отправил по электронной почте поддержку TestFlight и получил этот ответ:

наша команда в настоящее время исследует эту проблему с настольным приложением TestFlight. В то же время, пожалуйста, используйте Xcode для создания файла IPA, а затем загрузите его с помощью настольного приложения или веб-сайта TestFlight.

предложенный обходной путь действительно работал.

The ответ by Tim Gostony больше не работает с момента выхода Xcode 7. Теперь процесс отправки магазина приложений завершается неудачей при наличии правил ресурсов. Решение состоит в том, чтобы очистить путь к правилам ресурса подписи кода и заменить xcrun инструментом xcodebuild:

xcodebuild -exportArchive -archivePath [path to archive] -exportPath [path to output directory] -exportOptionsPlist [path to options.plist file]

самые простые варианты.plist для экспорта файлов ipa ad-hoc дистрибутива выглядит так:

<?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, app прореживание и т. д. Вот почему я думаю, что xcodebuild tool-это правильный инструмент для экспорта ipa-файлов для iOS 9 и выше.

более подробная информация о параметрах plist доступна с помощью команды xcodebuild-help.

на Yosemite w / XCode 6.4 даже при использовании патча SDKROOT кодирование не выполняется. В следующей статье объясняется, как исправить сценарий XCode, чтобы обойти это. Обратите внимание, что это исправление XCode, поэтому оно зависит от версии, но устраняет проблему.

http://www.jayway.com/2015/05/21/fixing-your-ios-build-scripts

The ответ от Alistra работают для меня, но я не хочу менять скрипт, который не является моим (будущий выпуск 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]

в моем случае у меня нет архива, потому что я изменяю приложение после его сборки, и мне нужно измените идентификатор пакета и сертификат подписи.

решение, которое я нашел, это позвонить 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 file using to sign with cp.

Как указано в еще один ответ, вы также можете просто не указывать сертификат распространения для подписания, и он будет правильно упакован. Использовать TestFlight придется обновить свои приложения, чтобы сделать это.