2009-11-06 4 views
4

Dans notre environnement, nous partageons des ressources entre plusieurs projets et plates-formes. Lors de la construction pour iPhone, seul un sous-ensemble de ces ressources est nécessaire. Puisque ce sous-ensemble est encore considérable, nous avons un fichier manifeste répertoriant ce qui entre, ce qui limite la copie. Nous avons notre propre script Python qui fait la copie, rafraîchissant seulement les fichiers qui ont changé. J'ai fait une phase de script d'exécution dans Xcode pour appeler ce script, mais j'ai quelques problèmes liés à la phase de signature de code.Forcer l'actualisation de la signature de code dans Xcode

Étant donné que nous utilisons un fichier manifeste distinct, mon Run Script Phase ne peut spécifier aucun fichier d'entrée/sortie dans l'interface graphique Xcode: il varie en fonction de ce qui est contenu dans les répertoires à ce moment. L'effet secondaire de ceci est que Xcode ne sait pas exactement quels fichiers seront copiés (les choses arrivent "sous la couverture", pour ainsi dire). Le problème que j'ai est que si je ne modifie que les fichiers de ressources entre les builds, la reconstruction de mon application appelle correctement mon script, qui copie les fichiers appropriés, seul Xcode ne relance pas l'étape de signature de code, et ne re -copy mon application sur mon appareil. J'ai trouvé cela étrange, étant donné que mes fichiers de ressources sont en effet répertoriés dans le fichier <app_bundle>/_CodeSignature/CodeResources, mais il semble que Xcode détermine les besoins de reconstruction indépendamment de cela (probablement uniquement les fichiers répertoriés dans le fichier projet), ce qui est compréhensible.

J'ai essayé de jouer des tours en touchant le répertoire de mon groupe d'applications, ou le binaire de l'application elle-même, mais cela ne fonctionne pas vraiment. Toucher le répertoire du paquet de l'application ne semble rien faire, alors que toucher le binaire fonctionnera, mais PAS POUR LA CONSTRUCTION ACTUELLE, seulement la suivante (puisque aucun fichier d'entrée ne nécessite de recompilation, Xcode infère qu'aucun nouveau binaire n'est généré, mais le suivant temps, il va en effet détecter que le binaire a été touché, et refaire à la fois le Code Signing et le).

Pourtant, cela est tout à fait une solution imparfaite, parce que:

  • avoir à construire est deux fois plus d'erreurs
  • Mon fichier dSYM sera inutilement regénérés

Est-ce que quelqu'un sait de toute façon forcer l'étape de signature de code dans Xcode (à partir d'un script d'exécution, ou ailleurs)?

Répondre

0

Vous pouvez appeler des codesign directement à partir de la ligne de commande ou d'un script shell, par ex.

codesign -f -s "iPhone Distribution" --entitlements Entitlements.xcent -vv location/MyApp.app/MyApp 

Run man codesign pour connaître l'utilisation.

Vous pouvez découvrir toutes les commandes internes exécutées en affichant la sortie de construction détaillée dans Xcode. Sélectionnez l'onglet Construire, puis cliquez sur la petite icône en bas à gauche de ce volet de la fenêtre - celui qui ressemble à du texte (il est à côté de l'icône d'avertissement). Cela affichera la sortie de génération complète dans un nouveau volet dans Xcode.

J'ai créé un code d'appel de script shell directement afin que je puisse re-signer un binaire existant en utilisant un nouveau certificat et profil d'approvisionnement (par exemple après la mise à jour de certains graphiques dans le binaire). Cela s'est avéré très compliqué car Xcode fait des choses subtiles dans le cadre de ses processus de construction internes (un exemple: Xcode incorpore le profil d'approvisionnement dans l'application binaire qui en résulte, mais change certaines de ses valeurs, par exemple le paramètre get-task-allow). Cela signifiait que je devais écrire un outil pour générer un approprié.xcent à partir du profil d'approvisionnement, selon que la construction Développement/Distribution/App Store est en cours. J'espère que rien de tout cela ne vous affectera ...

+0

Merci. Ça marche! – jhoule

+0

je fini par faire quelque chose d'équivalent à: – jhoule

+0

'exportation CODESIGN_ALLOCATE = "$ {} PLATFORM_DEVLOPER_BIN_DIR/codesign_allocate"' ' – jhoule

Questions connexes