Ошибка Xcode 6.1 при создании IPA

140

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

Ошибка

ошибка: / usr / bin / codeign --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 или аналогичных инструментов.

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

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

Шафак Гезер
источник
4
Это , кажется, не является проблемой , так как TestFlight то же самое происходит в среде CI , используя команду xcrun вроде этого: xcrun -sdk iphoneos PackageApplication -v <Path_to_App> -o <Path_to_IPA> --sign <Distribution_certificate> --embed <Provisioning_profile>. С Xcode 6.0.1 все работало нормально.
Даниэль Мартин

Ответы:

312

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

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

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

Code Signing Resource Rules Path

и добавить :

$(SDKROOT)/ResourceRules.plist

Тим
источник
7
Благодарность! Честно говоря, мне все равно, почему это работает :) Просто последнее из того, что Apple сломала из-за своей грандиозной серии неудач за последние пару месяцев. В любом случае, спасибо, что указали на решение. (и отрицательный голос за то, что я не просмотрел внимательно ошибку перед публикацией)
Шафак Гезер
10
CODE_SIGN_RESOURCE_RULES_PATH - это имя переменной, если вы редактируете настройки xcodeproj с помощью скрипта или командной строки. developer.apple.com/library/ios/recipes/…
roblocop
5
Я не вижу Code Signing Resource Rules Pathв настройках сборки. Любая идея?
Георг
7
Убедитесь , что выбраны все и не принципиален настройки (строка ниже «Общие, возможности, информация, Build Settings и т.д.»)
AS
Очевидно, это приведет к отклонению вашего приложения: stackoverflow.com/questions/26488077/…
Гленн Мейнард
61

Следующий патч для 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});
Алистра
источник
Удален устаревший параметр rogue из PackageApplication, и buildozer теперь создает мое приложение Python для iOS
Ян Эллис
Отличное исправление! Большое спасибо :) Вышеупомянутый параметр «Путь к правилам ресурсов для подписи кода» не устранил мою проблему, но этот ответ помог, плюс исправление теперь глобально для всех проектов :)
Pellet
@IanEllis: Не могли бы вы сообщить мне, как вы удалили параметр "resource-rules" из PackageApplication. Это будет большим подспорьем !!
Рашми Ранджан Маллик
8
Вот единственный способ исправить PackageApplication: perl -p -i'Orig '-e' BEGIN {undef $ /;} s /, resource-rules (. * Sign}). * ResourceRules.plist "/ $ 1 / smg '" / Applications / Xcode6.1.1.app / Contents / Developer / Platforms / iPhoneOS.platform / Developer / usr / bin / PackageApplication "(измените свой путь) И полный сценарий для применения этого: bitbucket.org/WeWantToKnow/xcode_scripts/raw/… использовать: xcode_fix_PackageApplicationResourceRules.sh /Applications/Xcode6.1.1.app
кофе-брейки
Это правильный ответ. Ответ о настройке сборки требует использования устаревшего API.
Jameson
10

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

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

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

Адам
источник
1
У меня сработало просто сделать .ipa с Xcode и загрузить через настольное приложение.
livingtech
@livingtech Да, но я также получил ужасную ошибку «Xcode генерирует новый профиль вместо того, чтобы выбирать тот, который мне нужен» :) Загрузка с помощью testflight прошла отлично.
helmesjo
10

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

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

Владимир Григоров
источник
спасибо, Владимир, я действительно запутался в том, как это конфликтует с отправкой Xcode 7.
Кевинл
как именно заменить xcrun? Я не вижу никаких настроек для этого в плагине Jenkins Xcode :(
Хлунг,
2

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

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

GrumpyGary
источник
1

Ответ от Алистра работы для меня , но я не хочу , чтобы изменить скрипт , который не мой (будущий 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файл, используя для подписи cp.

Gbitaudeau
источник
0

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

pr1001
источник