web-dev-qa-db-fra.com

Précisions sur les cadres iOS statiques et dynamiques

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

Je cherche un moyen de distribuer une bibliothèque que j'ai créée et je dois prendre en charge iOS 7 et les versions ultérieures. (Remarque: ce sera un cadre propriétaire. Je ne peux pas utiliser de cosses de cacao et je ne peux pas non plus distribuer la source). Voici ce que je sais déjà:

  • iOS 8 a introduit les "frameworks intégrés" pour iOS, mais si je comprends bien, ils ne fonctionnent pas pour iOS 7, mais uniquement pour iOS 8 et les versions ultérieures.
  • J'ai la possibilité de distribuer ma bibliothèque en tant que bibliothèque statique (fichier .a) et de distribuer les en-têtes. Je sais que c'est une façon habituelle de gérer la situation, mais j'aimerais trouver quelque chose de plus simple que cela (et aussi de regrouper des ressources avec, 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 les liaisons dynamiques. 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 modifiant le type de Mach-O en "bibliothèque statique. Serait-ce suffisant pour prendre en charge iOS 7 sans aucun problème et pour distribuer ma bibliothèque en tant que Si oui, pourquoi les "frameworks embarqués" dans iOS 8 sont-ils si gros, alors que de nombreuses ressources sur Internet le suggèrent? Est-ce que je manque quelque chose?
  • Est-il nécessaire de coder le .framework comme je le fais avec n'importe quelle autre application que je crée?
  • Que se passe-t-il si je dois inclure d'autres ressources (telles que Core Data ou Images) dans mon fichier .framework? Devrai-je créer un fichier .bundle séparé pour cela?
106
csotiriou

Avant iOS8, Xcode permettait uniquement la création de bibliothèques statiques pour iOS. Le problème commun à 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 "cadres statiques". [.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. Parce que ce ne sont que des bibliothèques statiques avec la possibilité de regrouper les fichiers d'en-tête.

Pour ce qui est de vos questions sur les ressources, nous aurions besoin de les regrouper dans '.bundle' .. Pour les expédier, je ne sais pas si nous pouvons les inclure dans le dossier .framework. un framework statique et bundle ...

Cependant, l'option ci-dessus ne fonctionnera pas pour vous si vous utilisez Swift. Xcode ne prend pas en charge la construction de bibliothèques statiques incluant le code Swift.

Vous devez utiliser les frameworks dynamiques s'il y a Swift. En théorie, les frameworks dynamiques fonctionnent dans 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

66
Subbu

À partir de Xcode 9, vous pouvez créer des cadres statiques pour Swift. Cela est possible grâce à la compatibilité de source ABI. Il vous suffit de changer le Mach-O type sous les paramètres de construction de la cible du cadre. Cette technique est également applicable aux frameworks hybrides (frameworks avec Swift et code Objective-C).

15
Avijeet Dutta

Swift ne fonctionne pas dans la bibliothèque statique. Si vous devez utiliser un cadre dynamique, vous devez définir min iOS à 8.0 car AppStore rejet ios 7 avec cadre dynamique

6
AliasCocoa

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 utiliser ces frameworks dans iOS 7, mais c'est tout, un avertissement. Voir ceci réponse .

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

  • Vous devez coder en signant les bibliothèques dynamiques pour iOS.

  • Si vous envisagez de le distribuer, vous devez vous assurer que votre infrastructure prend en charge les architectures de simulateur et de périphérique.

5
Beau Nouvelle

Les frameworks sont static ou dynamic des bibliothèques regroupées dans un bundle avec des actifs supplémentaires, une méta-description pour la gestion des versions, etc.

Vous pouvez changer le format de la bibliothèque qui aura un impact sur un Linker en changeant Framework target -> Build Settings -> Mach-O Type[À propos] à Static Library ou Dynamic Library. Par défaut, Xcode a Dynamic Library valeur.

Dépend de ce paramètre, différents types de binaires seront générés [cocher statique ou dynamique]

Après avoir configuré avec succès un consommateur [Lien vs Intégrer]

Static Linker: ld à compiler moment inclura tout le code du static library dans le fichier objet exécutable.

Dynamic Linker: dyld au chargement/à l'exécution essaiera de trouver la structure intégrée à l'aide de @rpath[À propos] et le lier

0
yoAlex5