J'ai une application iOS que je suis récemment passée à Xcode 8 . Dans le cadre de cela, nous sommes passés de Swift 2.2 à 2.3 (Swift 3 viendra plus tard).
J'ai un pipeline de construction automatisé qui exécute essentiellement xcodebuild
pour produire un binaire de publication sur une machine de construction dédiée, et après avoir trié tout cela (la signature automatique du code de Xcode 8 a tout bousillé), maintenant, lorsque je télécharge mon application sur iTunes se connecter, il échoue avec cette erreur:
ERREUR ITMS-90171: "Structure d'ensemble non valide - Le fichier binaire 'MyApp.app/libswiftRemoteMirror.dylib' n'est pas autorisé. Votre application ne peut pas contenir d'exécutables ni de bibliothèques autonomes, autres que CFBundleExecutable des ensembles pris en charge. Reportez-vous à la programmation d'ensemble. Guide sur https://developer.Apple.com/go/?id=bundle-structure pour plus d'informations sur la structure de l'ensemble d'applications iOS. "
Effectivement, si je décompresse le fichier .ipa et jette un œil, il y a libswiftRemoteMirror.dylib
assis.
Si j'archive/exporte pour iTunes via Xcode, il génère alors un ensemble d'applications qui n'a pas libswiftRemoteMirror.dylib
, mais toutes les autres versions de mon application semblent l'avoir. Même en effectuant une construction de débogage dans Xcode, le résultat final montre que libswiftRemoteMirror.dylib est assis dans le bundle de mon application, ce qui indique que Xcode lui-même est en train de la placer ici, pas dans mon script de construction automatique.
Quel est ce fichier, pourquoi y est-il placé et que dois-je faire à ce sujet? Je peux modifier mon script de génération pour supprimer ce fichier pour les versions validées, mais je crains que cela n’affecte le processus de signature du code. Je vais essayer quand même et voir ce qui se passe, mais j'ai l'impression que ce n'est pas la bonne chose à faire.
Tout avis sera le bienvenu.
Je ne pourrais jamais obtenir que xcodebuild en ligne de commande fonctionne avec la signature de code automatique. Je suppose que parce que la machine de construction automatisée fonctionne sous un compte différent auquel on ne peut accéder que via SSH - elle n'a jamais exécuté Xcode "complet" en tant que compte d'utilisateur et ne contient aucun certificat dans son trousseau de connexion ou quoi que ce soit du genre.
Je ne voulais pas utiliser quelque chose comme shenzhen
car je n'ai eu que de mauvaises expériences dans le passé. Le système de construction Xcode est assez compliqué et fragile, sans avoir à ajouter plus de scripts et d’éléments qui pourraient mal tourner ou être périmés.
Voici ce que j'ai fini par faire pour résoudre le problème (c'est horrible, mais c'est la seule chose que j'ai pu trouver qui a permis de le faire fonctionner à la fin)
Dans le script de génération automatique, éditez le .pbxproj
pour rechercher et remplacer Provisioning Style = Automatic;
par Provisioning Style = Manual;
. Remplacez également iOS Developer
par iOS Distribution
pour les éléments de signature de code dans le même fichier pbxproj. Ces deux choses désactivent la signature automatique
Exécutez xcodebuild
pour construire (mais pas archiver) le projet de la même manière que dans Xcode7. Xcode compile l'application et la signe, mais elle n'est pas encore valide car elle contient libswiftRemoteMirror.dylib
et, pour une raison quelconque, ne contient aucun fichier de droits d'accès.
Supprimer libswiftRemoteMirror.dylib
de l'ensemble d'applications (cela invalidera la signature)
Générez un Entitlements.plist
dans le dossier de l'ensemble d'applications en extrayant le bit de droits d'accès du profil d'approvisionnement (comme ce que fait le script le script SWSiOSResign.sh de} de BlackBerry
Re-signez le bundle d'applications en utilisant codesign --entitlements <file>
À partir de là, utilisez une technique similaire à celle utilisée par bq/package_ipa.sh
, copiez le dossier SwiftSupport, puis compressez le fichier dans un ipa
.
Je ne pouvais pas utiliser le fichier package_ipa.sh
; je devais ré-implémenter une logique similaire car je devais faire référence à Swift_2.3.toolchain
pour obtenir SwiftSupport car mon application est toujours Swift 2.3 - et non XcodeDefault.toolchain
(qui est Swift 3).
Il semble que je devrais pouvoir utiliser xcodebuild --archive
en combinaison avec d'autres éléments pour éviter certaines de ces étapes. Je ne pourrais jamais obtenir que cela fonctionne sous Xcode7, mais je pourrais essayer à nouveau avec XC8 si j'en ai le temps
Dans mon cas, j'ai eu l'erreur ITMS-90171 parce que j'utilise des frameworks personnalisés.
"Structure de paquet non valide - Le fichier binaire 'MyFramework.framework/libswiftRemoteMirror.dylib'
(Je ne l'ai pas eu pour ma candidature.)
J'ai essayé la gym mais ça s'est bloqué à xcrun . J'ai donc essayé de faire rm -rf libswiftRemoteMirror
dans l'expression de construction (avec un script d'exécution personnalisé) pour chaque framework personnalisé que j'ai et, chose intéressante, je n'ai rien cassé: cela a fonctionné.
J'ai rencontré le même problème après l'installation de Xcode 8, en construisant via shenzhen .
J'ai décidé de regarder Fastlane comme une alternative, et leur programme gym
génère un ipa pouvant être soumis à Apple.
Il était relativement facile pour moi de remplacer l'appel à ipa
(le fichier exécutable de shenzhen) par un appel à gym
, et le reste de mes scripts de génération et de téléchargement a fonctionné sans modification.
Si vous préférez construire directement, j’ai soulevé ce qui suit dans le fichier readme gym
. Il produit un .xcarchive
contenant un fichier .app
sans le libswiftRemoteMirror.dylib
. Je n'utilise pas ce type de flux moi-même, donc je ne peux pas dire comment vous procéderiez à partir de là.
xcodebuild \
-scheme Scheme \
-workspace Project.xcworkspace \
-configuration 'Release' \
-destination 'generic/platform=iOS' \
-archivePath './Output.xcarchive' \
archive
Allez simplement dans le paramètre de construction et faites comme c'est votre problème qui va résoudre.
archivez simplement votre construction à partir de Xcode. Cliquez avec le bouton droit de la souris sur le fichier d’archive -> Afficher dans le Finder -> Clic droit -> Afficher le contenu du package -> Produit -> Application -> Copier le fichier .app Générer une charge utile et le télécharger à l’aide d’Application Loader . dans mon cas.