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.
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
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)
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:
✕ Contre:
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:
✕ Contre:
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
:
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+.
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
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
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
La source et encore une . Lire aussi ici , ici , ici , ici , ici
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).