J'ai une application iOS existante et je souhaite ajouter un gros morceau de code que j'ai développé comme un autre projet juste pour faciliter les tests. Le nouveau bloc traite essentiellement de la sauvegarde d'une image sur divers services de partage, etc. Parce que ce code de partage nécessite beaucoup de tests et de mises à jour futures, je me demandais quelle était la meilleure façon d'incorporer ce bloc de code dans mon application existante.
Je ne sais pas si cela devrait être une bibliothèque statique, une bibliothèque dynamique ou un framework, et honnêtement, je ne suis pas vraiment sûr de la différence, ni de la façon dont je devrais m'y prendre et le configurer dans Xcode.
Tout ce que je sais, c'est que j'ai besoin / souhaite conserver une application de test et de mise à jour distincte pour le code de partage et que l'application principale l'utilise.
la source
Réponses:
Tout d'abord, quelques définitions générales (spécifiques à iOS):
Bibliothèque statique - une unité de code liée au moment de la compilation, qui ne change pas.
Cependant, les bibliothèques statiques iOS ne sont pas autorisées à contenir des images / ressources (uniquement du code). Vous pouvez toutefois contourner ce défi en utilisant un ensemble de médias .
Une meilleure définition plus formelle peut être trouvée sur Wikipedia ici .
Bibliothèque dynamique - une unité de code et / ou d'actifs liés au moment de l'exécution qui peuvent changer.
Cependant, seul Apple est autorisé à créer des bibliothèques dynamiques pour iOS. Vous n'êtes pas autorisé à les créer, car votre application sera rejetée. (Voir cet autre article SO pour confirmation et raisonnement à ce sujet).
Software Framework - un ensemble compilé de code qui accomplit une tâche ... par conséquent, vous pouvez réellement avoir un framework statique ou un framework dynamique , qui ne sont généralement que les versions compilées de ce qui précède.
Voir le Wiki sur le framework logiciel pour plus de détails.
Par conséquent, sur iOS, votre seule option est essentiellement d'utiliser une bibliothèque statique ou un framework statique (la principale différence étant qu'un framework statique est distribué sous forme de
.a
plus souvent fichier , alors qu'une bibliothèque statique peut simplement être incluse en tant que sous-projet - vous pouvez voir tout le code - qui est compilé en premier et son.a
fichier résultant utilisé comme dépendance par le projet).Maintenant que nous sommes clairs (euh) sur ces termes, configurer une bibliothèque statique et prendre en charge un ensemble de supports pour iOS n'est pas trop difficile, et il existe de nombreux tutoriels sur la façon de le faire. Je recommanderais personnellement celui-ci:
https://github.com/jverkoey/iOS-Framework
Ceci est un guide assez simple et n'a pas l'inconvénient de traiter de "fausses bibliothèques statiques" ... consultez-le pour plus d'informations ...
Une fois que vous avez créé votre bibliothèque statique, c'est aussi simple que de l'inclure en tant que sous - module dans Git pour une utilisation dans différents projets.
Bonne chance.
ÉDITER
En ce qui concerne un sous - projet dans un projet, pour autant que je sache, pour que cela fonctionne / compile correctement, vous devez essentiellement mettre en place une chaîne de compilation où le sous-projet est compilé en premier, ce qui crée un cadre statique
.a
fichier de qui est utilisé comme dépendance par le projet.Voici un autre tutoriel utile qui en parle:
http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/
MODIFIER 2
Depuis iOS 8, Apple permet désormais aux développeurs de créer des frameworks dynamiques! (Remarque: votre application doit avoir une cible minimale d'iOS 8 pour inclure un cadre dynamique ... le portage arrière n'est pas autorisé.)
Cela a été ajouté en tant que nouveau modèle de projet. Dans Xcode 6.1, cela peut être trouvé à:
la source
Format de fichier Mach-O (Mach Object -
.o
)Dans le monde iOS, chaque fichier source est converti en fichiers objets - ABI [About] Mach-O file [About] qui sera emballé dans un ensemble exécutable final (par exemple application, framework ...), fichier (par exemple bibliothèque ...) et son comportement est déterminé par
Mach-O type
[À propos]Package
est un répertoire qui se comporte comme un fichier -opaque file
. Il est créé pour que l'expérience utilisateur complique la modification de la structure interne qui peut provoquer un comportement imprévisible du programme. Le package est utilisé dansDocument Package
ou avec un fichierBundle
. Vous pouvez utiliserShow Package Contents
dans un FinderBundle
est un répertoire avec une structure spécifique pour organiser un binaire (code exécutable) et des ressources pour ce code (ex: images, nibs ...). Le bundle contient le fichierInfo.plist
[About] . Le bundle a été créé pour l' expérience des développeurs . Il peut également être emballé. Il existe plusieurs types de bundle:application bundle
-Application target
framework bundle
etversioned bundle
comme sous-type -Framework Target
loadable bundle
(akaplug-in bundle
) -Bundle target
(Ensemble de tests d'interface utilisateur, Ensemble de tests unitaires)dSYM
[À propos] )Application
-.ipa
,.app
[À propos] -packaged
application bundle
- programme lancable.Tests
-packaged
loadable bundle
qui sert à tester un binaire. L'architecture de plug-in nous permet d'ajouter une nouvelle fonctionnalité (cas de test) en tant que module séparé dans le binaire existantBibliothèques et cadres
Martin Fowler sur InversionOfControl
Bibliothèques et cadres sur iOS
Library
est une collection de fichiers objets Mach-O [vérifier statique ou dynamique] compilés pour une ou plusieurs architectures.Static library
-.a
(aka bibliothèque d'archives statiques, bibliothèque partagée statique liée [doc] ) - Lorsque vous l'ajoutez dans votre application, l' éditeur de liens statique pendant la compilation fusionnera les fichiers objets de la bibliothèque et les regroupera avec les fichiers objets de l'application dans un seul exécutable fichier. L'inconvénient est un gros fichier de sortieÀ partir de Xcode 9.0, la bibliothèque statique Swift est prise en charge.
Dynamic library
-.dylib
(aka bibliothèque partagée dynamique, objet partagé, bibliothèque liée dynamiquement [doc] ) est lié dynamiquement à l'exécutable de l'application au chargement ou à l'exécution , mais pas copié dedans. Le package de l'application d'entraînement contiendra le dossier Frameworks avec le.dylib
fichier. Toutes les bibliothèques système iOS et macOS sontdynamic
. L'inconvénient est un temps de lancement lent car toutes les bibliothèques dynamiques doivent être copiées et liées.[Liaison statique vs dynamique]
Text-based stub library
-.tbd
[À propos de] , il s'agit d'un talon de textedynamic library
situé sur un périphérique cible. Par conséquent, vous ne devez pas empaqueter une bibliothèque dynamique dans votre ensemble. Cela a un effet de taille.Framework
akabinary framework
-.framework
est unnot packaged framework bundle
(pour permettre aux développeurs de consulter facilement les en-têtes et les ressources) qui contient unestatic or dynamic
bibliothèque compilée , des fichiers d'en-tête et des ressources.Static framework
contiennent unstatic library
pack avec ses ressources.Dynamic framework
contient lesdynamic library
ressources et. En plus de cela, le framework dynamique peut inclure différentes versions de la même bibliothèque dynamique dans un seul bundle (versioned bundle
)[Cadre statique vs dynamique]
Embedded framework
est undynamic framework
qui vit dans le bac à sable de l'application. Ce type a été créé tout d'abord pour l' extension afin de partager du code et des ressources communs. Il est disponible lorsque la cible de déploiement est iOS 8+.Umbrella framework
[Cible agrégée] est un framework qui contient d'autres frameworks. Il n'est pas officiellement pris en charge sur iOS et c'est pourquoi il n'est pas recommandé aux développeurs de les créer [Document officiel] . En réalité, c'est un ensemble de sous-cadres (ou cadres imbriqués). Lorsque vous créez un framework qui a une dépendance, un consommateur (tel qu'une application) est responsable de l'ajout de cette dépendance avec votre framework dans le projet. En tant que développeur, il est naturel d'essayer de trouver un moyen de transférer cette obligation du consommateur vers le vôtre. En conséquence, vous pensez queUmbrella framework
c'est le sauvetage, mais cela entraîne généralement de graves problèmes de gestion des versions et la complexité de leur création et de leur prise en charge.Fake Framework
- est le résultat d'opérations spécifiques sous astatic library
pour créer un bundle avec une.framework
extension qui se comportera comme undynamic framework
. Cette technique a été utilisée lorsque Xcode ne prenait pas en charge la création d'un framework car il n'avait pas de modèle de framework. Un de réalisation d'un faux cadre . Avec Xcode 6, Apple a ajouté la prise en charge du framework iOS.Modular Framework
[About] -@import
c'est un framework qui contient un.modulemap
fichier à l'intérieur. Le module peut contenir des sous-modules. Le principal avantage est que vous économisez du temps de construction avecModular Framework
.Universal Library or Framework
(aka Fat) [lipo] [Aggregate target] contient plusieurs architectures. Par exemple, votre version de version doit prendre en charge une certaine arche que vous pouvez régler viaBuild Active Architecture Only
[ONLY_ACTIVE_ARCH]Dependency
[À propos] Vous pouvez utiliser du code tiers dans le cadre de votre cible. Il vous permet de réutiliser un code à partir de nombreuses sources telles que - un autre projet, un projet dans le même espace de travail, une autre cible, une bibliothèque, un cadre, etc.Comment créer et utiliser une bibliothèque statique:
Comment créer et utiliser un framework dynamique [passer en statique]
[Système de construction Xcode]
[Composants Xcode]
[Éditeur de liens dynamique]
la source
Vous pouvez également créer un fichier .podspec pour CocoaPods ( http://guides.cocoapods.org/making/private-cocoapods.html#1.-create-a-private-spec-repo ) et l'utiliser comme n'importe quel autre pod avec le seule différence que c'est votre pod privé et n'est pas visible du monde extérieur (je ne sais pas ce qui se passera si votre pod doit créer un modèle CoreData, mais ce n'est pas le cas, si je comprends bien).
la source