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?
Réponses:
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
la source
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 type
paramètres de sous-construction de la cible du framework. Cette technique est également applicable aux Frameworks hybrides (frameworks avec code Swift et Objective-C).la source
static
oudynamic
le nom généralement des points dans unLinking
[ A propos] TypeLes cadres peuvent être
static
oudynamic
[Vérifier statique ou dynamique]Vous pouvez modifier le format de la bibliothèque qui aura un impact sur a
Linker
en remplaçantFramework target -> Build Settings -> Mach-O Type
[À propos] parStatic Library
ouDynamic Library
. Par défaut, Xcode a uneDynamic Library
valeur.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 dustatic library
dans 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]
la source
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
la source
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.
la source