it-swarm.com.ru

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

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

The error

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

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

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

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

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

140
Şafak Gezer

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

Нашел исправление!

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

Code Signing Resource Rules Path

и добавить :

$(SDKROOT)/ResourceRules.plist

312
Tim

Следующий патч для 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});
60
Alistra

ответ Тима Гостони больше не работает с момента выпуска Xcode 7. Теперь процесс отправки в App Store завершается сбоем при наличии правил ресурса. Решение состоит в том, чтобы очистить путь правил ресурса подписи кода и заменить xcrun инструментом xcodebuild:

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

Простейший Options.plist для экспорта специальных файлов 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-файла доступны другие параметры, касающиеся битового кода, утонения приложений и т.д. Вот почему я считаю, что инструмент xcodebuild является правильным инструментом для экспорта файлов ipa для iOS 9 и выше.

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

10
Vladimir Grigorov

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

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

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

10
Adam

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

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

2
Gary Skiba

ответ от 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]

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

Решение, которое я нашел, состоит в том, чтобы самому 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.

1
gbitaudeau

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

0
pr1001