Quelle est la différence entre les binaires incorporés et les cadres liés

87

Lors de l'utilisation d'un framework externe, Xcode a désormais une section Binaires incorporés ainsi qu'une section Frameworks liés .

entrez la description de l'image ici

Lorsque vous téléchargez un framework externe et que Finder-> faites-le glisser dans Xcode, il place le framework dans la section Frameworks et bibliothèques liés .

Lorsque vous créez une bibliothèque avec Carthage, il vous est recommandé de la faire glisser dans la section Binaires incorporés .

Les deux semblent fonctionner en termes de lien, car l'API devient disponible dans les deux cas, de plus lors de l'ajout d'un cadre dans la section Binaires incorporés , il est également automatiquement ajouté dans la section Frameworks et bibliothèques liés .

Alors, qui a raison? Carthage ou le reste d'Internet? et pourquoi existe-t-il 2 options pour inclure des ressources externes dans les projets Xcode?

Maxim Veksler
la source
Et cela fonctionne-t-il lorsque vous testez sur l'appareil?
trojanfoe
@trojanfoe oui.
Maxim Veksler
Cela n'a pas de sens, à moins que ce ne soit 1) dans la section binaires incorporés ou 2) a une étape de construction pour copier le framework dans le bundle d'applications pendant la construction.
trojanfoe
2
Carthage recommande de glisser dans "Binaires incorporés" uniquement pour les applications OSX. Pour iOS, ils recommandent uniquement "Frameworks et bibliothèques liés".
Damnum

Réponses:

72
  1. Liaison - Nous devons lier un cadre si nous utilisons une API définie dans celui-ci.

  2. Intégration - Ce processus garantira que le cadre ajouté sera intégré dans l'offre groupée d'applications et contribuera potentiellement au partage de code entre l'application et les ensembles d'extension. Nous n'intégrons que des frameworks tiers et non ceux fournis par iOS car ils sont facilement disponibles dans l'appareil. Si nous intégrons, cela signifie que nous devrons également créer un lien vers eux afin que Xcode puisse compiler et créer la construction. Lorsque l'application s'exécute sur l'appareil, le framework intégré est chargé en mémoire en cas de besoin.

Shripada
la source
1
Que voulez-vous dire par la partie «au besoin»? Cela signifie-t-il que l'infrastructure intégrée est chargée lorsqu'elle est nécessaire pendant l'exécution? De plus, quand pensez-vous que la liaison se produira pour un framework dynamique?
bartosss
Y a-t-il un cas dont nous avons besoin embedet non link? Et vice versa? Et pourquoi?
allenlinli
Je pense qu'il vous suffit de lier les frameworks dont vous utilisez l'API directement dans le code, les dépendances transitives qui ne sont pas référencées dans le code de l'application doivent simplement être intégrées si j'ai raison.
Werner Altewischer
15

Si vous intégrez le binaire, il sera inclus dans votre produit. Si vous liez uniquement une bibliothèque ou un framework sans l'incorporer, il ne fera pas partie de votre produit.

Cependant, dans iOS8, tous les frameworks tiers doivent être «intégrés». Même un cadre partagé entre divers programmes doit être «intégré» dans chacun de ces programmes. Dans le cas où il a été installé sur l'appareil dans un emplacement partagé, tout autre processus d'installation utilisant le même code «intégré» à partir de l'emplacement partagé peut réutiliser cette installation existante. Ceci est spécifique à iOS8, cela n'a pas été possible avant iOS8 et en dehors du monde iOS cette réponse ne serait pas exacte.

Basti
la source
2
«L'intégration du binaire facilitera l'installation de votre produit pour l'utilisateur au cas où il n'aurait pas déjà une installation fonctionnelle de ce matériel sur ses machines» ressemble à OSX, pas iOS ... s'ils n'ont pas la bibliothèque installé (c'est-à-dire non standard), l'application ne se chargera tout simplement pas.
trojanfoe
non seulement il ne se chargerait pas, @trojanfoe, il serait rejeté et vous ne pourriez pas l'installer en premier lieu (à moins que vous ne soyez le développeur ou que vous n'utilisiez un compte Enterprise ...)
dogsgod
Les frameworks liés dynamiquement sont possibles depuis iOS 8
Basti
Lorsque l'utilisateur installe votre application et si cette application comprend un cadre lié dynamiquement, ce cadre peut être recherché automatiquement. Cependant, il s'agit d'un point supplémentaire qui peut échouer pendant le processus d'installation de l'utilisateur, provoquant une erreur d'édition de lien qui met fin à l'application. Je ne vois donc aucune raison pour laquelle la réponse ne devrait s'appliquer qu'à OS X et non à iOS. Veuillez être plus précis si vous voyez une marge d’amélioration concernant ma réponse. Ou votez pour cette réponse afin de faire d'un autre développeur un membre SO à part entière, si vous pensez que la réponse est déjà exacte;)
Basti
C'est l'aspect facultatif de votre réponse auquel je m'oppose. Si le framework est tiers, il doit faire partie du bundle d'applications. Période. Cela est également largement vrai pour les applications OSX (certainement pour les applications distribuées via le Mac App Store).
trojanfoe
0

Linkingen savoir plus sur Linkercela fonctionne au moment de la compilation ou au moment du chargement / de l'exécution. Linker copiez a Librarydans un binaire cible. Comme il Frameworkest autonome, le Linker, dans ce cas, est chargé de rechercher et de lier l' Dynamic Frameworkintérieur du chemin du chargeur système ou de rechercher et de lier à l'intérieur d'un bundle .

Embeddingest un processus de copie du binaire dans le binaire cible. En conséquence, il sera situé à l'intérieur.

En savoir plus ici

yoAlex5
la source
-3

À ma connaissance, le binaire intégré comprend uniquement le cadre dynamique disponible sur iOS 8 et les versions ultérieures, sinon vous ne pouvez lier que le cadre qui est statique.

Lei Zhang
la source