Bibliothèque? Statique? Dynamique? Ou cadre? Projet dans un autre projet

151

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.

pizzafilms
la source
Vous pouvez créer un cadre parapluie qui est quelque chose comme `` cadre à l'intérieur du cadre '' stackoverflow.com/a/27638841/1582217
Mohd Iftekhar Qurashi
duplication possible de Comment créer un framework Umbrella dans iOS sdk?
Mohd Iftekhar Qurashi

Réponses:

204

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 .afichier 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é à:

New Project -> iOS -> Framework & Library -> Cocoa Touch Framework
Développeur JRG
la source
Jusqu'à présent, il semble que le sous-projet est ce que je veux et cet article était parfait. J'ai remarqué un effet secondaire étrange: le sous-projet que j'ai traîné dans mon projet principal a également mon code de test (viewcontroller et nib, appdelegate, etc.), et je me suis assuré que seules les classes que je souhaite utiliser dans le les projets principaux sont vérifiés pour être utilisés dans la bibliothèque statique. Mais pour une raison quelconque, lorsque je suis allé créer des pièces jointes au fichier nib de mon projet principal, il montrait également les sorties et les actions de mon sous-projet. Cela pourrait certainement conduire à une certaine confusion. Avez-vous des conseils pour vous en débarrasser? Merci!
pizzafilms
Un projet dynamique peut-il être glissé et déposé dans un projet statique, ce qui en fait un projet statique? Je suis vraiment confus, une clarification serait vraiment géniale! Merci d'avance :-)
Ravindranath Akila
1
@ JRG-Developer Back porting dynamic framework est autorisé si vous suivez certaines règles: developer.apple.com/library/prerelease/ios/documentation
...
Est-il possible de définir une cible minimale inférieure et de rendre la bibliothèque facultative?
kukudas
1. pouvez-vous inclure des exemples bien connus de bibliothèque statique, de bibliothèque dynamique, de framework? 2. Pouvez-vous donner des exemples de domaines dans lesquels vous auriez besoin de le faire? 3. Curieux de savoir quelle est la différence entre un pod et une bibliothèque statique?
Honey
30

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]

Packageest 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é dans Document Packageou avec un fichier Bundle. Vous pouvez utiliser Show Package Contentsdans un Finder

Bundleest 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 fichier Info.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 bundleet versioned bundlecomme sous-type -Framework Target
  • loadable bundle(aka plug-in bundle) - Bundle target(Ensemble de tests d'interface utilisateur, Ensemble de tests unitaires)
  • autres (ensemble dSYM[À propos] )

Application- .ipa, .app[À propos] - packaged application bundle- programme lancable.

Tests- packaged loadable bundlequi 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 existant

Bibliothèques et cadres

Martin Fowler sur InversionOfControl

Une bibliothèque est essentiellement un ensemble de fonctions que vous pouvez appeler, généralement organisées en classes. Chaque appel effectue un certain travail et retourne le contrôle au client.

Un Framework incarne une conception abstraite, avec plus de comportement intégré. Pour l'utiliser, vous devez insérer votre comportement à divers endroits du framework soit en sous-classant, soit en ajoutant vos propres classes. Le code du framework appelle ensuite votre code à ces points. Le contrôle principal du programme est inversé, éloigné de vous vers le framework. (Inversion de contrôle)

Bibliothèques et cadres sur iOS

Libraryest 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 .dylibfichier. Toutes les bibliothèques système iOS et macOS sont dynamic. 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 texte dynamic librarysitué 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.

Frameworkaka binary framework- .frameworkest un not packaged framework bundle(pour permettre aux développeurs de consulter facilement les en-têtes et les ressources) qui contient une static or dynamicbibliothèque compilée , des fichiers d'en-tête et des ressources.

Static frameworkcontiennent un static librarypack avec ses ressources.

Dynamic frameworkcontient les dynamic libraryressources 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 frameworkest un dynamic frameworkqui 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 frameworkc'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 a static librarypour créer un bundle avec une .frameworkextension qui se comportera comme un dynamic 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] -@importc'est un framework qui contient un.modulemapfichier à 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 via Build 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]

yoAlex5
la source
1
Dans de nombreux didacticiels Swift, il est mentionné que Objective C ne prend pas en charge les bibliothèques dynamiques, alors que Swift prend en charge, [ altexsoft.com/blog/engineering / ... ] Mais comme je le sais i, OS8 et les versions ultérieures Objctive C supporte la bibliothèque dynamique. Pouvez-vous clarifier cela?
pratima le
@pratima, vous êtes capable de créer un framework dynamique sur Objective-C pour iOS
yoAlex5
1
"Le framework statique contient une bibliothèque statique fournie avec ses ressources." D'où vient cette définition? AFAK, la phase de construction "Copy Bundle Resources" du framework statique ne fonctionne pas, tout comme la bibliothèque statique. Quelle est la différence entre le framework statique et la bibliothèque statique?
toshi0383
@ toshi0383 Avez-vous trouvé un moyen de fusionner la bibliothèque statique (.a) et ses ressources (.bundle) dans un cadre unique que nous pouvons distribuer au consommateur?
user121095 le