Clarifications sur les frameworks statiques et dynamiques iOS

115

Je dois admettre qu'avec la sortie d'iOS 8, je suis un peu confus au sujet des cadres dynamiques et statiques dans iOS.

Je recherche un moyen de distribuer une bibliothèque que j'ai créée et je dois prendre en charge iOS 7 et supérieur. (Remarque: ce sera un framework propriétaire. Je ne peux pas utiliser de cabosses de cacao, et je ne peux pas non plus distribuer la source). Voici ce que je sais déjà:

  • iOS 8 a introduit des «frameworks embarqués» pour iOS, mais, si je comprends bien, ils ne fonctionnent pas pour iOS 7, uniquement pour iOS 8 et au-dessus.
  • J'ai la possibilité de distribuer ma bibliothèque en tant que bibliothèque statique (fichier .a) et également de distribuer les en-têtes. Je sais que c'est une façon courante de gérer la situation, mais j'aimerais trouver quelque chose de plus simple que cela (et aussi y regrouper quelques ressources, si possible).
  • J'ai également constaté qu'iOS 7 ne prend pas en charge les bibliothèques dynamiques .framework (uniquement statiques) car il ne prend pas en charge la liaison dynamique. Mais iOS 8 le fait, ainsi que la liaison statique.

Et voici mes questions concernant ces informations:

  • J'ai vu que je pouvais créer une cible .framework, et la rendre statique, en changeant le type Mach-O en "bibliothèque statique. Serait-ce suffisant pour supporter iOS 7 sans aucun problème, et aussi pour distribuer ma bibliothèque en tant que Si tel est le cas, pourquoi les "frameworks intégrés" dans iOS 8 sont-ils si importants, comme le suggèrent de nombreuses ressources sur Internet? Suis-je en train de manquer quelque chose?
  • Est-il nécessaire de coder le .framework comme je le fais avec toute autre application que je crée?
  • Que faire si je dois inclure d'autres ressources (comme des données de base ou des images) avec mon fichier .framework? Dois-je créer un fichier .bundle séparé pour cela?
csotiriou
la source
1
"iOS 7 ne prend pas en charge les bibliothèques .framework car il ne prend pas en charge la liaison dynamique" Cette déclaration n'est pas correcte.
Midhun MP
1
Je vois. pouvez-vous me dire la phrase correcte? Est-ce faux parce qu'iOS 7 prend en charge la liaison dynamique ou parce qu'iOS 7 prend en charge les bibliothèques .framework? Ou les deux?
csotiriou
1
Remeber AVFoundation et CoreGraphics sont tous des .framework. Cela vous aidera probablement à trouver les réponses à toutes vos questions: raywenderlich.com/65964/create-a-framework-for-ios
Midhun MP
J'ai fixé la phrase. J'ai déjà lu le lien, avant de poster mes questions. Ce lien n'explique rien concernant mes questions. Il part d'une bibliothèque statique et l'enveloppe MANUELLEMENT dans un fichier .framework. Je parle d'une cible Cocoa Touch Framework dans Xcode 6, puis de changer le type en bibliothèque statique. Il ne mentionne pas la signature de code (pourquoi et si c'est nécessaire), les ressources supplémentaires, etc.
csotiriou
1
Vous pouvez utiliser CocoaPods pour distribuer un framework propriétaire (par exemple Parse)
Ric Santos

Réponses:

69

Avant iOS8, Xcode permettait uniquement de créer des bibliothèques statiques pour iOS. Le problème commun avec cela était que nous devions expédier le binaire et les en-têtes séparément.

Plus tard, certains développeurs ont eu l'idée de créer des «frameworks statiques». [le .framework est juste un dossier avec des liens symboliques vers la bibliothèque et les en-têtes]. Un tel exemple est https://github.com/jverkoey/iOS-Framework

Cette option fonctionnera pour iOS 7 ou 8 ou avant cela. Parce qu'ils ne sont que des bibliothèques statiques avec la commodité de regrouper les fichiers d'en-têtes.

En ce qui concerne vos questions sur les ressources, nous aurions besoin de les regrouper dans '.bundle'. Pour les expédier, je ne suis pas sûr que nous puissions les inclure dans le dossier .framework .. Dans le passé, j'avais l'habitude d'expédier mes bibliothèques comme un cadre et un bundle statiques ...

Cependant, l'option ci-dessus ne fonctionnera pas pour vous si vous utilisez Swift. Xcode ne prend pas en charge la création de bibliothèques statiques qui incluent du code Swift.

Vous devez utiliser les frameworks dynamiques s'il y a une utilisation rapide. En théorie, les frameworks dynamiques fonctionnent sous iOS7 .. Mais, je pense qu'iTunes Connect rejettera si l'application cible iOS7 et utilise des frameworks dynamiques :-).

J'espère que cela t'aides

Subbu
la source
17

Avec Xcode 9 et les versions ultérieures, vous pouvez également créer des frameworks statiques pour Swift. Cela est possible grâce à la compatibilité de la source ABI. Tout ce que vous avez à faire est simplement de modifier les Mach-O typeparamètres de sous-construction de la cible du framework. Cette technique est également applicable aux Frameworks hybrides (frameworks avec code Swift et Objective-C).

Avijeet Dutta
la source
Bon conseil. Je ne sais pas pourquoi cette réponse a été réduite car elle m'a aidé. \ Target'Build Settings \ Mach-O-Type et sélectionnez Static Framework.
rustyMagnet
3
La compatibilité Abi n'est pas disponible dans Swift 4
Csotiriou
8

staticou dynamicle nom généralement des points dans un Linking[ A propos] Type

Les cadres peuvent être staticou dynamic[Vérifier statique ou dynamique]

Vous pouvez modifier le format de la bibliothèque qui aura un impact sur a Linkeren remplaçant Framework target -> Build Settings -> Mach-O Type[À propos] par Static Libraryou Dynamic Library. Par défaut, Xcode a une Dynamic Libraryvaleur.

Dépend de ce paramètre, différents types de binaires seront générés

Après avoir configuré avec succès un consommateur [Link vs Embed]

Static Linker ld : au moment de la compilation inclura tout le code du static librarydans le fichier objet exécutable.

Dynamic Linker dyld : au chargement / à l'exécution essaiera de trouver le framework intégré en utilisant @rpath[À propos] et le liera

[Vocabulaire]

yoAlex5
la source
6

Swift ne fonctionne pas dans la bibliothèque statique. Si vous devez utiliser un framework dynamique, vous devez définir min iOS sur 8.0 car l' AppStore rejette ios 7 avec un framework dynamique

AliasCocoa
la source
Vous pouvez importer une bibliothèque statique dans un projet basé sur Swift
C0D3
5

Je n'ai pas toutes les réponses, mais je vais essayer de répondre à certaines de vos questions ici.

  • Vous recevrez un avertissement pour l'utilisation de ces frameworks dans iOS 7, mais c'est tout, un avertissement. Voyez cette réponse .

  • Vous pouvez inclure d'autres ressources telles que CoreData, mais vous devrez les créer manuellement dans le code. Voici un didacticiel montrant comment créer un modèle de données de base.

  • Vous devez coder des bibliothèques dynamiques de signature pour iOS.

  • Vous devez vous assurer que votre infrastructure prend en charge à la fois les architectures de simulateur et de périphérique si vous prévoyez de la distribuer.

Beau Nouvelle
la source