web-dev-qa-db-fra.com

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

J'ai une application iOS existante et je veux ajouter une grande quantité de code que j'ai développé comme un autre projet simplement pour faciliter les tests. La nouvelle partie concerne essentiellement la sauvegarde d’une image dans divers services de partage, etc. Comme ce code de partage nécessite beaucoup de tests et de mises à jour, je me demandais quel était le meilleur moyen d’incorporer cette partie de code dans mon application existante.

Je ne sais pas s'il devrait s'agir d'une bibliothèque statique, d'une bibliothèque dynamique ou d'un framework, et honnêtement, je ne suis pas vraiment sûr de la différence, ni de la manière dont je devrais m'y prendre et l'installer dans Xcode.

Tout ce que je sais, c'est que je dois/veux garder une application de test et de mise à jour distincte pour le code de partage et que l'application principale l'utilise.

130
pizzafilms

Tout d’abord, quelques définitions générales (spécifiques à iOS):

Bibliothèque statique - 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/éléments (uniquement du code). Vous pouvez contourner ce problème en utilisant un kit média .

Une meilleure définition, plus formelle, peut être trouvée sur Wikipedia ici .

Bibliothèque dynamique - unité de code et/ou d'actifs liés au moment de l'exécution qui peut 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 this autre SO poste pour confirmation et raisonnement sur tel).

Software Framework - un ensemble de code compilé qui accomplit une tâche ... par conséquent, vous pouvez réellement avoir un statique framework 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 Software Framework pour plus de détails.

Par conséquent, sur iOS, votre seule option consiste à utiliser essentiellement une bibliothèque statique ou un framework statique (la principale différence étant qu'un framework statique est le plus souvent distribué sous la forme d'un fichier .a Compilé, alors qu'une bibliothèque statique peut simplement être incluse en tant que un sous-projet - vous pouvez voir tout le code - qui est compilé en premier et son fichier .a résultant utilisé comme dépendance par le projet).

Maintenant que nous sommes clairs sur ces termes, il n'est pas trop difficile de configurer une bibliothèque statique et de prendre en charge un ensemble de supports pour iOS. De nombreux tutoriels expliquent comment procéder. Personnellement, je recommanderais celui-ci:

https://github.com/jverkoey/iOS-Framework

C'est un guide assez simple qui n'a pas l'inconvénient de traiter avec les "fausses bibliothèques statiques" ... consultez-le pour plus d'informations ...

Une fois que vous avez créé votre bibliothèque statique, il vous suffit de l’inclure en tant que sous-module dans Git pour l’utiliser dans différents projets.

Bonne chance.

[~ # ~] éditer [~ # ~]

En ce qui concerne un sous-projet dans un projet, autant que je sache, pour que cela fonctionne/compile correctement, vous devez essentiellement configurer une chaîne de compilation dans laquelle le sous-projet est compilé en premier, ce qui crée une framework statique .a fichier 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/

EDIT 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 framework dynamique ... le port arrière n'est pas autorisé. .)

Cela a été ajouté en tant que nouveau modèle de projet. Dans Xcode 6.1, vous pouvez le trouver sur:

New Project -> iOS -> Framework & Library -> Cocoa Touch Framework
181
JRG-Developer

Bibliothèques et cadres

Martin Fowler sur InversionOfControl

Un library est essentiellement un ensemble de fonctions que vous pouvez appeler, ces journées étant généralement organisées en classes. Chaque appel effectue un travail et rend le contrôle au client.

Un framework représente un dessin abstrait, avec plus de comportement intégré. Pour l'utiliser, vous devez insérer votre comportement à différents endroits du cadre, soit en sous-classant, soit en y insérant vos propres classes. Le code de la structure appelle ensuite votre code à ces points. Le contrôle principal du programme est inversé, déplacé de vous vers le cadre. (Inversion de contrôle)

Bibliothèques et Frameworks sur iOS

Un library est un ensemble de ressources et le code lui-même, compilé pour une ou plusieurs architectures. Il se compose de fichiers *.o (Fichiers d'objets Mach-O).

static libraries (*.a) - le code utilisé par l'application est copié dans le fichier exécutable généré par un static linker lors de la compilation .

À partir de Xcode 9.0, Les bibliothèques statiques Swift sont maintenant supportées.

Le problème commun à cela est que nous devrions expédier le binaire et les en-têtes séparément.

✓ Avantages:

  • Les bibliothèques statiques sont assurées d'être présentes dans l'application et d'avoir une version correcte.
  • Pas besoin de garder une application à jour avec les mises à jour de la bibliothèque.
  • Meilleure performance des appels de bibliothèque.

✕ Contre:

  • Taille de l'application gonflée.
  • Le temps de lancement se dégrade à cause d'un exécutable d'application gonflé.
  • Doit copier toute la bibliothèque même si vous utilisez une seule fonction.

Dynamic libraries (*.dylib) sont différents de static libraries dans le sens où ils sont liés dynamiquement à l'exécutable de l'application à load ou runtime, mais ne sont pas copiés dans celle-ci. En conséquence, le fichier exécutable est plus petit et, comme le code est chargé uniquement lorsque cela est nécessaire, le temps de démarrage est généralement plus rapide.

Toutes les bibliothèques système iOS et macOS sont dynamiques. Par conséquent, nos applications bénéficieront des améliorations futures apportées par Apple aux infrastructures de bibliothèque standard, sans création ni expédition de nouvelles versions.

✓ Avantages:

  • Peut bénéficier d'améliorations de la bibliothèque sans recompiler une application. Particulièrement utile avec les bibliothèques système.
  • Prend moins d’espace disque, car il est partagé entre les applications.
  • Temps de démarrage plus rapide, car il est chargé à la demande pendant l'exécution.
  • Chargé par morceaux: nul besoin de charger toute la bibliothèque si vous utilisez une seule fonction.

✕ Contre:

  • Peut potentiellement interrompre le programme si quelque chose change dans la bibliothèque.
  • Appels plus lents aux fonctions de la bibliothèque, car elles se trouvent en dehors de l'exécutable de l'application.

A bundle est un répertoire de fichiers contenant des sous-répertoires. Sur iOS, bundles permet de regrouper aisément des fichiers liés dans un même package, par exemple des images, des nibs ou du code compilé. Le système le traite comme un seul fichier et vous pouvez accéder aux ressources de l'ensemble sans connaître sa structure interne.

Le library peut également disposer de ressources supplémentaires: en-têtes, fichiers de localisation, images, documentation et exemples d'utilisation. Nous pouvons regrouper tout cela dans un bundle - et le nom de ceci est framework (*.framework).

Static frameworks Contient un static library Contenant ses ressources.

Dynamic frameworks Contient le dynamic library Avec ses ressources. En plus de cela, dynamic frameworks Peut facilement inclure différentes versions du même dynamic library Dans le même cadre!

Embedded framework:

  1. Embedded framework Est un Dynamic framework Et est placé dans le bac à sable d'une application et n'est disponible que pour cette application. Ce type a tout d'abord été créé pour extension afin de partager du code et des ressources communes. Il est disponible lorsque La cible de déploiement est iOS 8+.

  2. Embedded framework Est un Static framework Intégré à une cible d'application. lisez plus

Umbrella framework[Cible globale] est un bundle de framework contenant d'autres frameworks (alias Nested Framework). Bien qu'il soit possible de créer des frameworks parapluies, cela est inutile pour la plupart des développeurs et n'est pas recommandé. [Doc officiel]

Fake Framework - Un faux framework est une technique courante de "transformation" d'un paquet en un framework mais est en réalité un bundle. Par exemple, lorsque vous créez votre propre framework et utilisez une bibliothèque tierce à l'intérieur, vous pouvez envoyer votre code et la bibliothèque tierce ensemble (en tant que framework). Un de réalisation fake framework .

Universal Framework (Aussi appelé Fat Framework) [Cible globale] - est un Static framework qui contient deux versions du fichier .framework pour Simulator c'est-à-dire x86_64, i386 et pour Device c'est-à-dire armv7, armv7s, arm64. Cela peut être une solution parfaite pour vous si vous n'avez vraiment besoin que de deux versions ou si le code source de la bibliothèque est gardé privé. Cela dit, il vous reste toujours la tâche de conserver des versions prédéfinies des bibliothèques (plus le travail supplémentaire de les regrouper dans un seul fichier).

Vous pouvez utiliser Cross-Project References (Aussi appelé Project inside another project) [Sur] au lieu de Universal Framework Cette approche vous permet de construire automatiquement un fichier binaire avec le reste de votre application, en utilisant votre configuration de construction actuelle (par exemple, le débogage, la publication, etc.) et d'éviter de pré-construire plusieurs versions du binaire séparément (où chaque version a été construite pour un environnement/une configuration spécifique).

Dans XCode 4, l’idée de Workspaces[Sur] est supposé remplacer les fonctionnalités de XCode 3s cross-project references

Comment construire et utiliser une bibliothèque statique:

Consommateur Swift -> Swift bibliothèque statique
Consommateur Swift -> Bibliothèque statique Objective-C
Consommateur Objective-C -> Swift bibliothèque statique
Consommateur Objective-C -> Bibliothèque statique Objective-C

Comment construire et utiliser un cadre statique:

Consommateur Swift -> Swift cadre statique
Consommateur Swift -> Cadre statique Objective-C
Consommateur Objective-C -> Swift cadre statique
Consommateur Objective-C -> Bibliothèque d'infrastructure Objective-C

Liens

La source et encore une . Lire aussi ici , ici , ici , ici , ici

11
yoAlex5

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 utiliser c'est comme n'importe quel autre pod avec la seule différence que c'est votre pod privé et qu'il n'est pas visible par le monde extérieur (je ne sais pas ce qu'il se passera si votre pod crée le modèle CoreData, mais ce n'est pas le cas, si je comprends bien).

1
Timur Kuchkarov