Biblioteca? Statico? Dinamico? O quadro? Progetto all'interno di un altro progetto


151

Ho un'app iOS esistente e voglio aggiungere un grosso pezzo di codice che sto sviluppando come un altro progetto solo per facilità di test. Il nuovo blocco riguarda sostanzialmente il salvataggio di un'immagine su vari servizi di condivisione, ecc. Poiché quel codice di condivisione richiede molti test e aggiornamenti futuri, mi chiedevo quale sia il modo migliore per incorporare quel blocco di codice nella mia app esistente.

Non so se dovrebbe essere una libreria statica, una libreria dinamica o un framework, e onestamente, non sono davvero sicuro di quale sia la differenza, o come dovrei andare su di esso e impostarlo in Xcode.

Tutto quello che so è che ho bisogno / voglio mantenere un'app di test e aggiornamento separata per il codice di condivisione e farla utilizzare dall'app principale.


È possibile creare ombrello quadro che è qualcosa come 'la struttura interna quadro' stackoverflow.com/a/27638841/1582217
Mohd Iftekhar Qurashi

Risposte:


204

Innanzitutto, alcune definizioni generali (specifiche per iOS):

Libreria statica : un'unità di codice collegata in fase di compilazione, che non cambia.

Tuttavia, le librerie statiche iOS non possono contenere immagini / risorse (solo codice). Tuttavia, puoi aggirare questa sfida utilizzando un pacchetto multimediale .

Una definizione migliore e più formale può essere trovata su Wikipedia qui .

Libreria dinamica : un'unità di codice e / o risorse collegate in fase di esecuzione che possono cambiare.

Tuttavia, solo Apple è autorizzata a creare librerie dinamiche per iOS. Non sei autorizzato a crearli, in questo modo l'app verrà rifiutata. (Vedi questo altro post SO per la conferma e il ragionamento su tale).

Software Framework - un set compilato di codice che compie un'attività ... quindi, puoi effettivamente avere un framework statico o un framework dinamico , che in genere sono solo le versioni compilate di cui sopra.

Consulta la Wiki su Software Framework per maggiori dettagli.

Quindi su iOS, l'unica opzione è fondamentalmente l'uso di una libreria statica o di un framework statico (la differenza principale è che un framework statico viene distribuito come .afile compilato più spesso, mentre una libreria statica può essere semplicemente inclusa come sottoprogetto - puoi vedere tutto il codice, che viene compilato per primo e il .afile risultante utilizzato come dipendenza dal progetto).

Ora che siamo chiari (er) su questi termini, impostare una libreria statica e supportare il pacchetto multimediale per iOS non è troppo difficile e ci sono molti tutorial su come farlo. Personalmente consiglierei questo:

https://github.com/jverkoey/iOS-Framework

Questa è una guida piuttosto semplice e non ha lo svantaggio di avere a che fare con "false librerie statiche" ... controlla per maggiori informazioni ...

Una volta creata la tua libreria statica, è facile come includerla come sottomodulo in Git per l'utilizzo in diversi progetti.

In bocca al lupo.

MODIFICARE

Per quanto riguarda un sottoprogetto all'interno di un progetto, per quanto ne so, per farlo funzionare / compilare correttamente, devi essenzialmente impostare una catena di compilazione in cui il sottoprogetto viene compilato per primo, che crea un .afile di framework statico che viene utilizzato come dipendenza dal progetto.

Ecco un altro tutorial utile che parla di questo:

http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/

MODIFICA 2

A partire da iOS 8, Apple ora consente agli sviluppatori di creare framework dinamici! (Nota: l'app deve avere un target minimo di iOS 8 per includere un framework dinamico ... non è consentito il back porting.)

Questo è stato aggiunto come nuovo modello di progetto. In Xcode 6.1, questo può essere trovato su:

New Project -> iOS -> Framework & Library -> Cocoa Touch Framework

Finora, sembra che il sottoprogetto sia quello che voglio e che l'articolo sia stato perfetto. Ho notato uno strano effetto collaterale: il sottoprogetto che ho trascinato all'interno del mio progetto principale ha anche il mio codice di test (viewcontroller e pennino, appdelegate, ecc.) E mi sono assicurato che solo le classi che voglio usare nel il progetto principale viene controllato per essere utilizzato nella libreria statica. Ma per qualche motivo, quando sono andato a fare allegati al file pennino del mio progetto principale, mostrava anche punti vendita e azioni dal mio sottoprogetto. Ciò potrebbe sicuramente creare confusione. Qualche consiglio per sbarazzarsi di quelli? Grazie!
pizzafilms

Un progetto dinamico può essere trascinato e rilasciato in un progetto statico, rendendolo quindi un progetto statico? Sono davvero confuso, qualche chiarimento sarebbe davvero grandioso! Grazie in anticipo :-)
Ravindranath Akila,

1
@ JRG-Developer Il framework dinamico di back porting è consentito se si seguono alcune regole: developer.apple.com/library/prerelease/ios/documentation/…
klefevre

È possibile impostare un target minimo inferiore e rendere facoltativa la libreria?
kukudas,

1. puoi includere alcuni esempi ben noti di libreria statica, libreria dinamica, framework? 2. Puoi fornire esempi di dove dovresti fare questo? 3. Curioso qual è la differenza tra un pod e una libreria statica?
Miele,

30

Formato file Mach-O (Mach Object - .o)

Nel mondo iOS ogni file sorgente viene convertito in file oggetto: ABI [Informazioni] Mach-O file [Informazioni] che verranno impacchettati in un pacchetto eseguibile finale (ad es. Applicazione, framework ...), file (ad es. Libreria ...) e il suo comportamento è determinato da Mach-O type[Informazioni]

Packageè una directory che si comporta come un file - opaque file. È stato creato per l'esperienza dell'utente per complicare apportare alcune modifiche alla struttura interna che possono causare comportamenti imprevedibili del programma. Il pacchetto viene utilizzato in Document Packageo con a Bundle. Puoi usarlo Show Package Contentsin un Finder

Bundleè una directory con una struttura specifica per organizzare un binario (codice eseguibile) e risorse per quel codice (ad es. immagini, pennini ...). Il pacchetto contiene il file Info.plist[Informazioni] . Il pacchetto è stato creato per l' esperienza degli sviluppatori . Inoltre può essere impacchettato. Esistono diversi tipi di bundle:

  • application bundle - Application target
  • framework bundlee versioned bundlecome sottotipo -Framework Target
  • loadable bundle(aka plug-in bundle) - Bundle target(Pacchetto test interfaccia utente, pacchetto test unità)
  • altri ( pacchetto dSYM[Informazioni] )

Application- .ipa, .app[Informazioni] - packaged application bundle- programma lavabile.

Tests- packaged loadable bundleche viene utilizzato per testare un binario. L'architettura plug-in ci consente di aggiungere una nuova funzionalità (casi di test) come modulo separato nel binario esistente

Librerie e quadri

Martin Fowler su InversionOfControl

Una libreria è essenzialmente un insieme di funzioni che è possibile chiamare, oggigiorno in genere organizzate in classi. Ogni chiamata fa un po 'di lavoro e restituisce il controllo al client.

Un Framework incarna un disegno astratto, con più comportamenti integrati. Per poterlo utilizzare è necessario inserire il proprio comportamento in vari punti del framework effettuando la sottoclasse o collegando le proprie classi. Il codice del framework chiama quindi il tuo codice in questi punti. Il controllo principale del programma viene invertito, spostato da te al framework. (Inversione di controllo)

Librerie e Frameworks su iOS

Libraryè una raccolta di file oggetto Mach-O [verifica statica o dinamica] compilata per una o più architetture.

Static library- .a(aka libreria di archivio statica, libreria condivisa collegata statica [doc] ) - Quando lo aggiungi nella tua applicazione, il linker statico durante il tempo di compilazione unirà i file oggetto dalla libreria e li impacchetterà insieme ai file oggetto dell'applicazione in un unico eseguibile file. Lo svantaggio è un grande file di output

Da Xcode 9.0 è supportata la libreria statica Swift.

Dynamic library- .dylib(aka libreria dinamica condivisa, oggetto condiviso, libreria collegata dinamicamente [doc] ) è collegata dinamicamente all'eseguibile dell'app in fase di caricamento o di runtime , ma non viene copiata in essa. In pratica il pacchetto dell'app conterrà la cartella Frameworks con .dylibfile. Tutte le librerie di sistema iOS e macOS lo sono dynamic. Lo svantaggio è un tempo di avvio lento poiché tutte le librerie dinamiche devono essere copiate e collegate.

[Collegamento statico vs dinamico]

Text-based stub library- .tbd[Informazioni] , è un troncone di testo dynamic libraryche si trova su un dispositivo di destinazione. Di conseguenza non è necessario impacchettare una libreria dinamica nel pacchetto. Ha un effetto dimensionale.

Frameworkaka binary framework- .frameworkè un not packaged framework bundle(per consentire agli sviluppatori di dare un'occhiata alle intestazioni e alle risorse) che contiene una static or dynamiclibreria compilata , file di intestazione e risorse.

Static frameworkcontenere un static librarypacchetto con le sue risorse.

Dynamic frameworkcontiene le dynamic libraryrisorse e. Inoltre, il framework dinamico può includere diverse versioni della stessa libreria dinamica in un unico bundle ( versioned bundle)

[Quadro statico vs dinamico]

Embedded frameworkè uno dynamic frameworkche vive nella sandbox dell'app. Questo tipo è stato creato prima di tutto affinché l' estensione condividesse codice e risorse comuni. È disponibile quando Target di distribuzione è iOS 8+.

Umbrella framework [Target aggregato] è un framework che contiene altri framework. Non è ufficialmente supportato su iOS ed è per questo che non è raccomandato agli sviluppatori di crearli [Documento ufficiale] . In realtà è un insieme di sotto-framework (o Frame nidificati). Quando si crea un framework che ha una dipendenza, un consumatore (come un'app) è responsabile dell'aggiunta di questa dipendenza insieme al framework nel progetto. Come sviluppatore, è naturale cercare di trovare un modo per trasferire questo dovere dal consumatore al tuo. Di conseguenza pensi cheUmbrella frameworksia il salvataggio, ma di solito porta a seri problemi con la gestione delle versioni e la complessità della creazione e del supporto.

Fake Framework- è il risultato di operazioni specifiche in a static libraryper creare un pacchetto con .frameworkestensione che si comporterà come a dynamic framework. Questa tecnica è stata utilizzata quando Xcode non supportava la creazione di un framework poiché non aveva un modello di framework. Uno di realizzazione di un quadro falso . Con Xcode 6, Apple ha aggiunto il supporto per il framework iOS.

Modular Framework[Informazioni] -@importè un framework che contiene un.modulemapfile all'interno. Il modulo può contenere sottomoduli. Il vantaggio principale è che risparmi un tempo di costruzione conModular Framework.

Universal Library or Framework(aka Fat) [lipo] [Target aggregato] contiene più architetture. Ad esempio, la tua build di rilascio dovrebbe supportare un arco che puoi regolare tramite Build Active Architecture Only [ONLY_ACTIVE_ARCH]

Dependency[Informazioni] Sei in grado di utilizzare codice di terze parti come parte del tuo target. Ti consente di riutilizzare un codice da molte fonti come: un altro progetto, progetto nello stesso spazio di lavoro, un altro target, libreria, framework ecc.

Come creare e utilizzare una libreria statica:

Come costruire e utilizzare un framework dinamico [passare a statico]

[Xcode Build System]
[Componenti Xcode]
[Dynamic linker]


1
In molti tutorial di Swift è stato menzionato il fatto che Objective C non supporta le librerie dinamiche, dove come supporta swift, [ altexsoft.com/blog/engineering/… ] Ma, come so io, OS8 in poi Objctive C supporta la libreria dinamica. Potete chiarire questo?
Pratima

@pratima, sei in grado di creare un framework dinamico su Objective-C per iOS
yoAlex5

1
"Il framework statico contiene una libreria statica impacchettata con le sue risorse." Da dove viene questa definizione? AFAK, la fase di costruzione "Copia risorse bundle" di framework statico non funziona, proprio come la libreria statica. Qual è la differenza tra framework statico e libreria statica?
toshi0383,

@ toshi0383 Hai trovato un modo per unire la libreria statica (.a) e le sue risorse (.bundle) in un unico framework che possiamo distribuire al consumatore?
user121095,

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.