Avec Xcode 6, nous avons la possibilité de créer notre propre dynamique Cocoa Frameworks
.
En raison de:
Le simulateur utilise toujours la
32-bit
bibliothèque-
à compter du 1er juin 2015, les mises à jour des applications soumises à l'App Store doivent inclure la prise en charge 64 bits et être créées avec le SDK iOS 8 ( developer.apple.com )
Nous devons créer une grosse bibliothèque pour exécuter des projets sur des appareils et des simulateurs. c'est-à-dire prendre en charge les 32 et 64 bits dans les cadres.
Mais je n'ai trouvé aucun manuel sur la façon d' exporter Universal Fat Framework pour une intégration future avec d'autres projets (et de partager cette bibliothèque avec quelqu'un).
Voici mes étapes pour reproduire:
Situé
ONLY_ACTIVE_ARCH=NO
dans leBuild Settings
Ajouter un support
armv7 armv7s arm64 i386 x86_64
àArchitectures
(bien sûr)
- Construisez Framework et ouvrez-le dans Finder:
- Ajouter ce cadre à un autre projet
Résultat actuel:
Mais à la fin, j'ai toujours un problème avec l'exécution du projet avec ce cadre sur les appareils et le simulateur à la fois.
si je prends le cadre du
Debug-iphoneos
dossier - cela fonctionne sur les appareils et obtient une erreur sur les simulateurs:ld: symbol(s) not found for architecture i386
xcrun lipo -info CoreActionSheetPicker
Les architectures dans le fichier fat: CoreActionSheetPicker sont: armv7 armv7s arm64
si je prends le cadre du
Debug-iphonesimulator
dossier - cela fonctionne sur des simulateurs. et j'ai une erreur sur l'appareil:ld: symbol(s) not found for architecture arm64
xcrun lipo -info CoreActionSheetPicker
Les architectures dans le fichier fat: CoreActionSheetPicker sont: i386 x86_64
Alors, comment créer un framework dynamique qui fonctionne sur les appareils et les simulateurs?
Cette réponse concernait Xcode 6 iOS Création d'un cadre Cocoa Touch - Problèmes d'architecture, mais ce n'est pas en double.
Mettre à jour:
J'ai trouvé un "sale hack" pour cette affaire. Voir ma réponse ci-dessous . Si quelqu'un connaît un moyen plus pratique - s'il vous plaît, faites le moi savoir!
Réponses:
La réalité de cette réponse est: juillet 2015. Il est fort probable que les choses changeront.
TLDR;
Actuellement, Xcode ne dispose pas d'outils pour l'exportation automatique du framework fat universel, le développeur doit donc recourir à l'utilisation manuelle de l'
lipo
outil. Toujours selon ce radar, avant la soumission au développeur AppStore, le consommateur du framework doit également utiliserlipo
pour supprimer les tranches de simulateur d'un framework.Une réponse plus longue suit
J'ai fait des recherches similaires sur le sujet (le lien au bas de la réponse).
Je ne l' avais pas trouvé aucune documentation officielle sur la distribution de ce que ma recherche était basée sur l' exploration d'Apple Forums de développement, les projets de Carthage et Realm et mes propres expériences avec
xcodebuild
,lipo
, descodesign
outils.Voici une longue citation (avec un peu de balisage de ma part) du fil de discussion Apple Developer Forums Exporting app avec framework intégré :
Cela décrit le processus à peu près de la même manière que @skywinder l'a fait dans sa réponse.
C'est ainsi que Carthage utilise le lipo et Realm utilise le lipo .
DÉTAIL IMPORTANT
Il y a un radar: Xcode 6.1.1 & 6.2: les frameworks iOS contenant des tranches de simulateur ne peuvent pas être soumis à l'App Store et une longue discussion autour de celui-ci sur Realm # 1163 et Carthage # 188 qui s'est terminée par une solution de contournement spéciale:
avant d'être soumis à AppStore, les binaires du framework iOS doivent être supprimés des tranches de simulateur
Carthage a un code spécial: CopyFrameworks et la documentation correspondante:
Realm a un script spécial: strip-frameworks.sh et la documentation correspondante:
Il existe également un bon article: Suppression des architectures indésirables des bibliothèques dynamiques dans Xcode .
J'ai moi-même utilisé Realm
strip-frameworks.sh
qui a parfaitement fonctionné pour moi sans aucune modification, bien que tout le monde soit libre d'en écrire un à partir de zéro.Le lien vers mon sujet que je recommande de lire car il contient un autre aspect de cette question: la signature de code - Création de Frameworks iOS / OSX: est-il nécessaire de les coder avant de les distribuer à d'autres développeurs?
la source
Ce n'est pas une solution si claire, mais il n'y a qu'un moyen, que je trouve:
Situé
ONLY_ACTIVE_ARCH=NO
dans leBuild Settings
Ouvrir dans le
Products
dossier de la console pour votre framework (vous pouvez l'ouvrir en ouvrant le dossier du framework et àcd ..
partir de là)Products
dossier. Il crée de gros Framework dans ce dossier. (ou faites-le manuellement comme expliqué ci-dessous en 3. 4. )Ou:
Combinez ces 2 Frameworks en utilisant lipo par ce script (remplacez-le
YourFrameworkName
par le nom de votre Framework)Remplacez par un nouveau binaire des frameworks existants:
./YourFrameworkName.framework
- est un binaire gras prêt à l'emploi! Vous pouvez l'importer dans votre projet!Pour le projet, que pas dans les espaces de travail:
Vous pouvez également essayer d'utiliser cet essentiel comme décrit ici . Mais il semble que cela ne fonctionne pas pour les projets dans les espaces de travail.
la source
Debug-
dossier est utilisé aveclipo -create
? Ce framework pourrait-il être utilisé pour laRelease
configuration et pourquoi? Merci.La réponse @Stainlav a été très utile, mais ce que j'ai fait à la place était de compiler deux versions du framework (une pour l'appareil et une pour le simulateur), puis j'ai ajouté ce qui suit
Run Script Phase
pour copier automatiquement le framework précompilé requis pour l'architecture en cours d'exécutionDe cette façon, je n'ai pas besoin
lipo
de créer un gros framework ni du Royaumestrip-frameworks.sh
pour supprimer les tranches inutiles lors de la soumission à l'App Store.la source
${SRCROOT}/Frameworks/Active
dossier. Ils sont remplacés par les bons frameworks précompilés pour l'architecture active au moment de la compilation.lipo
approche combiner puis déchirer .essentiellement pour cela, j'ai trouvé une très bonne solution. il vous suffit de suivre ces étapes simples.
et c'est tout. Ici, nous fusionnons le simulateur et la version de l'appareil du binaire MyFramework présent dans MyFramework.framework. Nous obtenons un cadre universel qui se construit pour toutes les architectures, y compris le simulateur et l'appareil.
la source
Je veux juste mettre à jour cette excellente réponse par @odm. Depuis Xcode 10, la
CURRENT_ARCH
variable ne reflète plus l'architecture de construction. J'ai donc changé le script pour vérifier la plate-forme à la place:J'ai également ajouté une ligne pour effacer le répertoire cible avant de copier, car j'ai remarqué que les fichiers supplémentaires dans les sous-répertoires ne seraient pas écrasés autrement.
la source
Ma réponse couvre les points ci-dessous:
Créer un cadre qui fonctionne à la fois pour le simulateur et l'appareil
Comment exporter le «gros» Cocoa Touch Framework (pour Simulator et Device à la fois)?
Symboles non définis pour l'architecture x86_64
ld: symbole (s) introuvable (s) pour l'architecture x86_64
Étapes 1: commencez par créer vos frameworks avec la cible Simulator
Étapes 2: Une fois le processus de création du simulateur réussi, créez maintenant pour votre infrastructure avec la sélection de la cible de l'appareil ou la sélection de l'appareil iOS générique
Étape 3: Sélectionnez maintenant votre cadre cible et pour cela, sous "Build Phases", sélectionnez "Add Run Script" et copiez le code de script ci-dessous)
Étape 4: Enfin, reconstruisez à nouveau et votre framework est prêt pour la compatibilité du simulateur et des appareils. Hourra!!!!
[Remarque: nous devons avoir les deux cadres compatibles prêts avant l'étape finale 4 (le simulateur et l'architecture de l'appareil compatibles, sinon, veuillez suivre correctement les étapes 1 et 2 ci-dessus)
Voir l'image de référence:
Mettez le code ci-dessous dans la zone shell:
la source