Erreur Xcode 6.1 lors de la construction de l'IPA

140

Je viens de passer à Xcode 6.1 aujourd'hui, et devinez quoi: maintenant, j'ai du mal à soumettre des builds à l'aide de l'application de bureau TestFlight. Voici l'erreur que j'obtiens lorsque l'application commence à créer l'IPA:

L'erreur

erreur: / usr / bin / codesign --force --preserve-metadata = identifiant, droits, règles de ressources --sign 854059d45eed724593debef577a562e1ba96ab55 --resource-rules = / tmp / QYFSJIvu7W / Payload / XX.app / ResourceRules.plist / tmp /QYFSJIvu7W/Payload/XX.app a échoué avec l'erreur 1. Sortie: Avertissement: utilisation de --preserve-metadata avec l'option "resource-rules" (obsolète sous Mac OS X> = 10.10)! Attention: --resource-rules est obsolète sous Mac OS X> = 10.10! /tmp/QYFSJIvu7W/Payload/XX.app/ResourceRules.plist: impossible de lire les ressources

L '«article de support» n'a aucune idée de ce qui se passe.

Cela ne semble pas être un problème TestFlight car la même chose se produit dans un environnement CI comme Jenkins en utilisant le xcrun ou des outils similaires.

L'application n'a pas été mise à jour depuis des mois, je sais donc que je ne devrais pas m'attendre à des mises à jour pour résoudre ce problème de sitôt. Cela fonctionnait très bien pour moi et mes clients, donc je n'ai pas vraiment envie de l'abandonner pour autre chose non plus.

Toute idée de ce qu'est cette erreur et de la manière de la corriger serait très appréciée.

Şafak Gezer
la source
4
Il ne semble pas être un problème de TestFlight parce que la même chose se produit dans un environnement de CI en utilisant la commande xcrun comme ceci: xcrun -sdk iphoneos PackageApplication -v <Path_to_App> -o <Path_to_IPA> --sign <Distribution_certificate> --embed <Provisioning_profile>. Avec Xcode 6.0.1, tout a bien fonctionné.
Daniel Martín

Réponses:

312

J'aimerais savoir pourquoi cela fonctionne, mais voici un correctif qui a fonctionné pour moi:

J'ai trouvé le correctif!

Cliquez sur votre projet> Cibles> Sélectionnez votre cible> Paramètres de construction>

Code Signing Resource Rules Path

et ajouter :

$(SDKROOT)/ResourceRules.plist

Tim
la source
7
Merci! Franchement, je ne me soucie pas de savoir pourquoi cela fonctionne :) juste la dernière en date de ce qu'Apple a cassé dans sa série de ratés au cours des deux derniers mois. Quoi qu'il en soit, merci d'avoir indiqué la solution. (et un vote négatif pour moi pour ne pas avoir recherché l'erreur à fond avant de publier)
Şafak Gezer
10
CODE_SIGN_RESOURCE_RULES_PATH est le nom de la variable si vous modifiez vos paramètres xcodeproj via un script ou une ligne de commande. developer.apple.com/library/ios/recipes/…
roblocop
5
Je ne vois pas Code Signing Resource Rules Pathdans mes paramètres de compilation. Une idée?
Georg
7
Assurez-vous que vous avez sélectionné TOUS et non les paramètres de BASE (la ligne ci-dessous "Général, capacités, informations, paramètres de construction, etc.")
COMME
Apparemment, votre application sera rejetée: stackoverflow.com/questions/26488077/…
Glenn Maynard
61

Le correctif suivant pour PackageApplications l'a corrigé pour moi, j'ai supprimé les règles de ressources car il dit qu'il est obsolète sur 10.10.

Les builds Testflight fonctionnent sans cela. L'Appstore se construit également.

/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
la source
Suppression du paramètre obsolète escroc de PackageApplication et buildozer construit maintenant mon application Python pour iOS
Ian Ellis
Super solution! Merci beaucoup :) Le paramètre ci-dessus "Chemin des règles de ressources de signature de code" n'a pas résolu mon problème, mais cette réponse l'a fait, et le correctif est maintenant global pour tous les projets :)
Pellet
@IanEllis: Pourriez-vous s'il vous plaît me faire savoir comment vous avez supprimé le paramètre "resource-rules" de PackageApplication. Ce sera d'une grande aide !!
Rashmi Ranjan mallick
8
Voici un oneliner pour corriger 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 "(ajustez votre chemin) Et un script complet pour appliquer ceci: bitbucket.org/WeWantToKnow/xcode_scripts/raw/… à utiliser: xcode_fix_PackageApplicationResourceRules.sh /Applications/Xcode6.1.1.app
coffeebreaks
C'est la bonne réponse. La réponse du paramètre de construction force l'utilisation d'une API obsolète.
Jameson
10

J'ai envoyé un e-mail au support TestFlight et j'ai obtenu cette réponse:

Notre équipe étudie actuellement ce problème avec l'application de bureau TestFlight. En attendant, veuillez utiliser Xcode pour créer le fichier IPA, puis le télécharger à l'aide de l'application de bureau ou du site Web TestFlight.

La solution de contournement suggérée a fonctionné.

Adam
la source
1
Cela a fonctionné pour moi de simplement créer le .ipa avec Xcode et de le télécharger via l'application de bureau.
livingtech
@livingtech Ouais, mais j'ai aussi le redoutable "Xcode générant un nouveau profil au lieu de choisir celui que je veux" -bug :) Le téléchargement avec testflight a fonctionné directement à merveille.
helmesjo
10

La réponse de Tim Gostony ne fonctionne plus depuis la sortie de Xcode 7. Désormais, le processus de soumission de l'App Store échoue lorsque des règles de ressources sont présentes. La solution consiste à effacer le chemin des règles de ressources de signature de code et à remplacer xcrun par l'outil xcodebuild:

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

Le fichier Options.plist le plus simple pour exporter des fichiers ipa de distribution ad-hoc ressemble à ceci:

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

Il existe d'autres options disponibles pour ce fichier plist concernant le bitcode, l'amincissement des applications, etc. C'est pourquoi je pense que l'outil xcodebuild est le bon outil pour exporter des fichiers ipa pour iOS 9 et supérieur.

Plus de détails sur les options plist sont disponibles avec la commande xcodebuild -help.

Vladimir Grigorov
la source
merci Vladimir, je devenais vraiment confus à ce sujet avec la façon dont cela entre en conflit avec les soumissions Xcode 7.
kevinl le
comment remplacez-vous exactement xcrun? Je ne vois aucun paramètre pour cela dans le plugin Jenkins Xcode :(
Hlung
2

Sur Yosemite avec XCode 6.4, même en utilisant le patch SDKROOT, la signature de code échoue. L'article suivant explique comment patcher le script XCode pour contourner ce problème. Notez que cela corrige XCode, donc il est spécifique à la version, mais résout le problème.

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

GrumpyGary
la source
1

La réponse d'Alistra fonctionne pour moi mais je ne veux pas changer un script qui n'est pas le mien (une future version de Xcode pourrait changer ce fichier et la correction sera perdue).

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

Je pense que la réponse de Vladimir Grigorov est la meilleure si vous avez une archive utilisant:

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

Dans mon cas, je n'ai pas l'archive, car je modifie l'application après l'avoir créée et je dois changer l'ID du bundle et le certificat de signature.

La solution que j'ai trouvée est de m'appeler codesignavant d'être utilisé PackageApplicationet de demander PackageApplicationà ne pas signer. Comme ça :

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

N'oubliez pas d'intégrer le .mobileprovisionfichier en utilisant pour vous connecter cp.

gbitaudeau
la source
0

Comme spécifié dans une autre réponse , vous pouvez également ne pas spécifier le certificat de distribution avec lequel vous connecter et il emballera correctement. TestFlight devrait mettre à jour son application pour ce faire.

pr1001
la source