Błąd Xcode 6.1 podczas budowania IPA

140

Właśnie zaktualizowałem Xcode 6.1 dzisiaj i zgadnij co: teraz mam problem z przesyłaniem kompilacji za pomocą aplikacji komputerowej TestFlight. Oto błąd, który otrzymuję, gdy aplikacja zaczyna tworzyć IPA:

Błąd

błąd: / usr / bin / codeign --force --preserve-metadata = identyfikator, uprawnienia, reguły zasobów --sign 854059d45eed724593debef577a562e1ba96ab55 --resource-rules = / tmp / QYFSvu7W / Payload / XX.app / ResourceRules.plist / tmp Błąd /QYFSJIvu7W/Payload/XX.app z powodu błędu 1. Wyjście: Ostrzeżenie: użycie opcji --preserve-metadata z opcją "resource-rules" (przestarzałe w Mac OS X> = 10.10)! Ostrzeżenie: --resource-rules jest przestarzałe w Mac OS X> = 10.10! /tmp/QYFSJIvu7W/Payload/XX.app/ResourceRules.plist: nie można odczytać zasobów

„Artykuł pomocniczy” nie ma pojęcia, co się dzieje.

Nie wydaje się, aby był to problem TestFlight, ponieważ to samo dzieje się w środowisku CI, takim jak Jenkins, przy użyciu xcrun lub podobnych narzędzi.

Aplikacja nie była aktualizowana od miesięcy, więc wiem, że nie powinienem oczekiwać żadnych aktualizacji, które to naprawią w najbliższym czasie. Kiedyś działał naprawdę dobrze dla mnie i moich klientów, więc nie chcę go porzucać dla czegoś innego.

Wszelkie pomysły na temat tego błędu i sposobu jego naprawienia będą bardzo mile widziane.

Şafak Gezer
źródło
4
To nie wydaje się być problemem TestFlight bo to samo dzieje się w środowisku CI używając polecenia xcrun takiego: xcrun -sdk iphoneos PackageApplication -v <Path_to_App> -o <Path_to_IPA> --sign <Distribution_certificate> --embed <Provisioning_profile>. Z Xcode 6.0.1 wszystko działało OK.
Daniel Martín

Odpowiedzi:

312

Chciałbym wiedzieć, dlaczego to działa, ale oto poprawka, która zadziałała:

Znalazłem poprawkę!

Kliknij projekt> Cele> Wybierz cel> Ustawienia kompilacji>

Code Signing Resource Rules Path

i dodaj :

$(SDKROOT)/ResourceRules.plist

Tim
źródło
7
Dzięki! Szczerze mówiąc, nie obchodzi mnie, dlaczego to działa :) tylko ostatnie z tego, co Apple złamało w ciągu ostatnich kilku miesięcy. W każdym razie dziękuję za wskazanie rozwiązania. (i negatywna opinia dla mnie za to, że nie sprawdziłem dokładnie błędu przed wysłaniem)
Şafak Gezer
10
CODE_SIGN_RESOURCE_RULES_PATH to nazwa zmiennej, jeśli edytujesz ustawienia xcodeproj za pomocą skryptu lub wiersza poleceń. developer.apple.com/library/ios/recipes/…
roblocop
5
Nie widzę Code Signing Resource Rules Pathw moich ustawieniach kompilacji. Dowolny pomysł?
Georg
7
Upewnij się, że wybrałeś WSZYSTKIE, a nie ustawienia PODSTAWOWE (wiersz poniżej „Ogólne, możliwości, informacje, ustawienia kompilacji itp.”)
AS
Najwyraźniej Twoja aplikacja zostanie odrzucona: stackoverflow.com/questions/26488077/…
Glenn Maynard
61

Następująca poprawka dla PackageApplications naprawiła to za mnie, usunąłem reguły zasobów, ponieważ mówi, że są przestarzałe w 10.10.

Kompilacje Testflight działają bez niego. Appstore też się buduje.

/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});
Alistra
źródło
Usunięto nieuczciwy przestarzały parametr z PackageApplication, a buildozer teraz buduje moją aplikację w Pythonie na iOS
Ian Ellis
Świetna poprawka! Wielkie dzięki :) Powyższe ustawienie „Ścieżka reguł zasobów podpisywania kodu” nie rozwiązało mojego problemu, ale tak się stało, a poprawka jest teraz globalna we wszystkich projektach :)
Pellet
@IanEllis: Czy mógłbyś dać mi znać, w jaki sposób usunąłeś parametr „resource-rules” z PackageApplication. Będzie to bardzo pomocne !!
Rashmi Ranjan Mallick
8
Oto oneliner do naprawy 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 "(dostosuj ścieżkę) I pełny skrypt do zastosowania tego: bitbucket.org/WeWantToKnow/xcode_scripts/raw/ ... do użycia: xcode_fix_PackageApplicationResourceRules.sh /Applications/Xcode6.1.1.app
coffeebreaks
To jest poprawna odpowiedź. Odpowiedź ustawienia kompilacji wymusza użycie przestarzałego interfejsu API.
Jameson,
10

Wysłałem e-mail do pomocy technicznej TestFlight i otrzymałem tę odpowiedź:

Nasz zespół obecnie bada ten problem w aplikacji TestFlight Desktop. W międzyczasie użyj Xcode, aby utworzyć plik IPA, a następnie prześlij go za pomocą aplikacji komputerowej lub witryny TestFlight.

Sugerowane obejście zadziałało.

Adam
źródło
1
Udało mi się po prostu utworzyć plik .ipa za pomocą Xcode i przesłać go za pomocą aplikacji komputerowej.
livingtech
@livingtech Tak, ale dostałem też przerażającego "Xcode generuje nowy profil zamiast wybierania tego, który chcę" -bug :) Przesyłanie z testflight bezpośrednio zadziałało świetnie.
helmesjo
10

Odpowiedź Tim Gostony nie działa już od momentu wydania Xcode 7. Teraz proces składania App Store zawodzi, gdy przepisy zasobów są obecne. Rozwiązaniem jest wyczyszczenie ścieżki reguł zasobów podpisywania kodu i zastąpienie xcrun narzędziem xcodebuild:

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

Najprostszy Options.plist do eksportowania plików ipa dystrybucji ad hoc wygląda następująco:

<?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>

Istnieją inne opcje dostępne dla tego pliku plist, dotyczące kodu bitowego, przerzedzania aplikacji itp. Dlatego uważam, że narzędzie xcodebuild jest odpowiednim narzędziem do eksportowania plików ipa na iOS 9 i nowsze.

Więcej szczegółów na temat opcji plist jest dostępnych za pomocą polecenia xcodebuild -help.

Vladimir Grigorov
źródło
dzięki Vladimir, byłem naprawdę zdezorientowany tym, jak to koliduje ze zgłoszeniami Xcode 7.
kevinl
jak dokładnie zastępujesz xcrun? Nie widzę żadnych ustawień dla tego we wtyczce Jenkins Xcode :(
Hlung
2

W Yosemite w / XCode 6.4, nawet przy użyciu poprawki SDKROOT, kodowanie kończy się niepowodzeniem. Poniższy artykuł wyjaśnia, jak załatać skrypt XCode, aby obejść ten problem. Zauważ, że jest to łatanie XCode, więc jest to zależne od wersji, ale rozwiązuje problem.

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

GrumpyGary
źródło
1

Odpowiedź od pracy Alistra dla mnie, ale ja nie chce zmienić skrypt, który nie jest moje (przyszłe uwolnienie Xcode może zmienić ten plik i korekty zostaną utracone).

 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});

Myślę, że odpowiedź Vladimira Grigorova jest najlepsza, jeśli masz archiwum wykorzystujące:

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

W moim przypadku nie mam archiwum, ponieważ modyfikuję aplikację po jej skompilowaniu i muszę zmienić Bundle ID i certyfikat podpisujący.

Rozwiązaniem, które znalazłem, jest zadzwonić do codesignsiebie przed użyciem PackageApplicationi poprosić, PackageApplicationaby nie podpisywać. Lubię to :

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>"

Nie zapomnij osadzić .mobileprovisionpliku, używając do podpisania cp.

gbitaudeau
źródło
0

Jak określono w innej odpowiedzi , możesz po prostu nie określać certyfikatu dystrybucyjnego do podpisania, a zostanie on prawidłowo spakowany. Aby to zrobić, TestFlight musiałby zaktualizować swoją aplikację.

pr1001
źródło