Codesign renvoyé 1 (object ifile format invalide ou inapproprié) bug

Je travaille avec Xcode 4.1 build 4B110f en essayant d'get mon application iOS prête pour le téléchargement. Il passe l'étape Product | Archive sans erreur, demandant deux fois la permission de signer quelque chose. Mais quand j'essaye une validation de l'archive de l'organisateur, elle échoue:

### Codesigning '/Users/uqrchern/Library/MobileDevice/Provisioning Profiles/70D2381D-3733-4F5D-88B2-4729572C2864.mobileprovision' with 'iPhone Dissortingbution: Ron Chernich' + /usr/bin/codesign --force --preserve-metadata --sign iPhone Dissortingbution: Ron Chernich --resource-rules=/var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/Payload/ABRA-D.app/ResourceRules.plist --entitlements /var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/entitlements_plistrZ1Vwko6 /var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/Payload/ABRA-D.app Program /usr/bin/codesign returned 1 : [/var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/Payload/ABRA-D.app: replacing existing signature /var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/Payload/ABRA-D.app: object file format invalid or unsuitable ] error: codesign failed with error 1 

J'ai examiné tous les problèmes et solutions similaires (dont certains n'ont aucun sens, ou s'appliquent à des versions très anciennes des outils). Aucun n'a fait la moindre différence.

J'ai également vérifié 3 fois que vérifier utilise le certificate de "production", comme c'est l'étape de codesign qui produit l'archive. J'ai même transformé la sortie ci-dessus en script schell afin que je puisse essayer tous les certificates manuellement: le même résultat à chaque fois.

Peut-être que le file .app en cours de signature est vraiment inapproprié?

Incidemment, codesign n'a pas de drapeau de version, mais la page de manuel est datée du 1er juin 2006. Le file binary a une date de file du 20 novembre 2010.

MISE À JOUR (le jour suivant):

La search du problème a également trouvé une reference obscure indiquant que codesign a besoin de l'environnement var set suivant:

 CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate 

En utilisant la sortie d'une exécution de Validate échouée, j'ai créé un script de shell qui exportait cette variable juste avant l'étape codesign –force échouée et l'alto! Le codeign fonctionne.

Mais cela ne m'aide pas vraiment à préparer mon code pour le téléchargement. Est-il possible d'inclure ceci dans le script lancé par le button Organiser Valider?

UN PEU PLUS TARD, LA SOLUTION! :

Sous la théorie il y a un script quelque part qui génère toutes les commands exécutées lors d'un Organizer Validate … run, j'ai fait quelques searchs avec grep et find. Le script existe en effet et son nom est:

 /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication 

C'est juste Perl et le correctif est d'append l'environnement requirejs var au tableau associatif% ENV juste au début, disons à la ligne 72:

 $ENV{CODESIGN_ALLOCATE} = '/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate'; 

Cela corrige totalement le problème. Je ne sais pas d'où viennent toutes les autres affiches sur le web qui pensent qu'elles ont été corrigées par des combinaisons de suppression de certificates, de construction propre, d'arrêt et de redémarrage de Xcode, etc. Je vais juste tranquillement affirmer que ce correctif favorise la science sur la superstition et fonctionne pour moi sous Xcode 4.1 Build 4B110f et son script PackageApplication associé, s'exécutant sous Snow Leopard 10.6.8 avec Perl 5.10.0

Juste pour que cela puisse être retiré de la list sans réponse. Comme vous l'avez dit, vous devez append CODESIGN_ALLOCATE au tableau $ENV :

 $ENV{CODESIGN_ALLOCATE} = '/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate'; 

Si tout le monde est d'accord ici, je pense que cette question peut enfin être close.

Lorsque vous utilisez une version plus récente de Xcode, l'location par défaut est:

 $ENV{CODESIGN_ALLOCATE} = '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate'; 

Dans le cas où vous obtenez ceci sur une version récente de Xcode, ce que vous voulez réellement est, dans le shell:

 export CODESIGN_ALLOCATE=`xcode-select -print-path`/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate 

qui utilisera le codesign_allocate de la version de Xcode que vous utilisez.

Vous pouvez mettre à jour la version de Xcode utilisée par les outils de command line en exécutant xcode-select -switch

J'ai eu cette solution de contournement en place pendant longtime, mais après la mise à niveau vers Xcode 4.3 avec iOS 5.1 SDK, mon script de signature (qui appelle codesign ) a cessé de fonctionner avec un cannot find code object on disk erreur cannot find code object on disk :

 output/Enterprise/Payload/MyProduct.app/MyProduct: replacing invalid existing signature output/Enterprise/Payload/MyProduct.app/MyProduct: cannot find code object on disk Code signing failed, not creating .ipa file 

Il semble que cette solution de contournement n'est pas nécessaire pour les binarys construits avec Xcode 4.3. Pour corriger, j'ai mis à jour mon script bash pour vérifier si l'location existe avant de l'exporter:

  # Only export the environment variable if the location exists, # otherwise it breaks the signing process! if [ -f "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate" ] then echo Export environment variable for codesign_allocate location export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate fi