Qual è la differenza tra binari incorporati e framework collegati


87

Quando si utilizza un framework esterno, Xcode ora ha una sezione Binari incorporati e Framework collegati .

inserisci qui la descrizione dell'immagine

Quando scarichi un framework esterno e Finder-> trascinalo in Xcode, posizionerà il framework nella sezione Frameworks e librerie collegati .

Quando crei una libreria con Carthage, ti consigliamo di trascinarla nella sezione Binari incorporati .

Entrambi sembrano funzionare in termini di collegamento, poiché l'API diventa disponibile in entrambi i modi, ulteriormente quando si aggiunge un framework nei binari incorporati sezione viene aggiunto automaticamente anche nella sezione Framework e librerie collegati .

Allora, chi ha ragione? Cartagine o il resto di Internet? e perché ci sono 2 opzioni per includere risorse esterne nei progetti Xcode?


E funziona quando provi sul dispositivo?
trojanfoe

@trojanfoe sì lo fa.
Maxim Veksler

Ciò non ha senso, a meno che non sia 1) nella sezione dei binari incorporati o 2) abbia un passaggio di compilazione per copiare il framework nel bundle dell'app durante la compilazione.
trojanfoe

2
Carthage consiglia di trascinare in "Binari incorporati" solo per le applicazioni OSX. Per iOS, consigliano solo "Framework e librerie collegati".
Damnum

Risposte:


72
  1. Collegamento: dobbiamo collegare un framework se utilizziamo un'API definita in esso.

  2. Incorporamento: questo processo garantirà che il framework aggiunto sarà incorporato nel pacchetto dell'app e potenzialmente aiuterà a condividere il codice tra l'app e qualsiasi pacchetto di estensioni. Incorporiamo solo framework di terze parti e non quelli forniti da iOS poiché sono prontamente disponibili nel dispositivo. Se stiamo incorporando, significa che dovremo collegarci anche a loro in modo che Xcode possa compilare e creare la build. Quando l'app viene eseguita nel dispositivo, il framework incorporato verrà caricato in memoria quando necessario.


1
Cosa intendi con la parte "quando necessario"? Ciò significa che il framework incorporato viene caricato quando è necessario durante il runtime? Inoltre, quando pensi che il collegamento avverrà per un framework dinamico?
Bartosss

C'è un caso di cui abbiamo bisogno embed e no link? E viceversa? E perché?
allenlinli

Penso che tu abbia solo bisogno di collegare framework le cui API usi direttamente nel codice, le dipendenze transitive che non sono referenziate nel codice dell'applicazione dovrebbero essere semplicemente incorporate se ho ragione.
Werner Altewischer

15

Se incorpori il file binario, verrà incluso nel tuo prodotto. Se colleghi solo una libreria o un framework senza incorporarlo, non farà parte del tuo prodotto.

Tuttavia, in iOS8 tutti i framework di terze parti devono essere "incorporati". Anche un framework condiviso tra vari programmi deve essere "incorporato" in ognuno di quei programmi. Nel caso in cui sia stato installato sul dispositivo in un percorso condiviso, qualsiasi altro processo di installazione che utilizza lo stesso codice "incorporato" dal percorso condiviso può riutilizzare l'installazione esistente. Questo è specifico per iOS8, non era possibile prima di iOS8 e al di fuori del mondo iOS questa risposta non sarebbe accurata.


2
"L'incorporamento del binario renderà più facile installare il tuo prodotto per l'utente nel caso in cui non abbia già un'installazione funzionante di quella roba sulle loro macchine" suona come OSX, non iOS ... se non hanno la libreria installato (cioè non è standard) quindi l'app semplicemente non verrà caricata.
trojanfoe

non solo non si carica, @trojanfoe, verrebbe rifiutato e non è possibile installarlo in primo luogo (a meno che tu non sia lo sviluppatore o usi un account Enterprise ...)
dogsgod

I framework collegati dinamicamente sono possibili da iOS 8
Basti

Quando l'utente installa la tua app e se tale app include un framework collegato dinamicamente, quel framework può essere cercato automaticamente. Tuttavia, questo è un punto aggiuntivo che potrebbe non riuscire durante il processo di installazione dell'utente, generando un errore di modifica del collegamento che termina l'applicazione. Quindi non vedo alcun motivo per cui la risposta dovrebbe applicarsi solo a OS X e non a iOS. Per favore sii più specifico se vedi margini di miglioramento riguardo alla mia risposta. Oppure vota la risposta per rendere un collega sviluppatore un membro a pieno titolo SO, se pensi che la risposta sia già accurata;)
Basti

È l'aspetto facoltativo della tua risposta a cui mi oppongo. Se il framework è di terze parti, deve far parte del pacchetto dell'app. Periodo. Questo vale anche per le app OSX (sicuramente per le app distribuite tramite il Mac App Store).
trojanfoe

0

Linkingdi più su Linkerquesto funziona in fase di compilazione o caricamento / esecuzione. Linker copia a Libraryin un binario di destinazione. Poiché Frameworkè autonomo, Linkerin questo caso è responsabile di trovare e collegare il percorso Dynamic Frameworkinterno del caricatore di sistema o di trovare e collegare all'interno di un bundle .

Embeddingè un processo di copia del binario nel binario di destinazione. Di conseguenza si troverà all'interno.

Leggi di più qui


-3

A quanto mi risulta, il binario incorporato include solo un framework dinamico disponibile su iOS 8 e versioni successive, altrimenti puoi collegare solo il framework statico.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.