Je travaille avec Xcode 4.1 build 4B110f en essayant de préparer mon application iOS pour le téléchargement. Elle passe l'étape Product|Archive sans erreur, demandant deux fois la permission de signer quelque chose. Mais lorsque j'essaie de valider l'archive à partir de l'Organizer, cela échoue :
### Codesigning '/Users/uqrchern/Library/MobileDevice/Provisioning Profiles/70D2381D-3733-4F5D-88B2-4729572C2864.mobileprovision' with 'iPhone Distribution: Ron Chernich'
+ /usr/bin/codesign --force --preserve-metadata --sign iPhone Distribution: 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). Aucune n'a fait la moindre différence.
J'ai également vérifié 3 fois que verify utilise le certificat "production", tout comme l'étape de codesign qui produit l'archive. J'ai même transformé la sortie ci-dessus en un schell script pour pouvoir essayer tous les certificats manuellement : même résultat à chaque fois.
Peut-être que le fichier .app signé est vraiment inadapté ?
Incidemment, codesign n'a pas de drapeau de version, mais la page de manuel est datée du 1er juin 2006. Le binaire a une date de fichier du 20 novembre 2010.
MISE À JOUR (le jour suivant) :
En poursuivant les recherches sur le problème, nous avons trouvé une référence obscure indiquant que le codesign nécessite l'environnement suivant : var set :
CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
En utilisant la sortie d'une exécution ratée de Validate, j'ai créé un shell script qui a exporté cette var juste avant l'étape ratée de codesign --force et viola ! Le codesign fonctionne.
Mais cela ne m'aide pas vraiment à préparer mon code pour le téléchargement. Existe-t-il un moyen d'inclure ceci dans le script exécuté par le bouton Validate de l'organisateur ? ?
UN PEU PLUS TARD ENCORE, LA SOLUTION :
Sous la théorie qu'il y a un script quelque part qui génère toutes les commandes exécutées pendant une exécution de Organizer Validate..., j'ai fait quelques recherches 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 la solution consiste à ajouter la variable d'environnement requise au tableau associatif %ENV dès le début, disons à la ligne 72 :
$ENV{CODESIGN_ALLOCATE} = '/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate';
Cela résout totalement le problème. Je n'ai aucune idée d'où viennent tous les autres posters sur le web qui pensent l'avoir réparé par des combinaisons de suppression de certificats, de construction propre, d'arrêt et de redémarrage de Xcode, etc, etc. Je vais juste affirmer tranquillement que cette correction favorise la science plutôt que la superstition et qu'elle fonctionne pour moi sous Xcode 4.1 Build 4B110f et son PackageApplication script associé, fonctionnant sous Snow Leopard 10.6.8 avec Perl 5.10.0