Chiarimenti sui framework iOS statici e dinamici


115

Devo ammettere che con il rilascio di iOS 8 sono un po 'confuso sui framework dinamici e statici in iOS.

Sto cercando un modo per distribuire una libreria che ho creato e devo supportare iOS 7 e versioni successive. (Nota: questo sarà un framework proprietario. Non posso usare cialde di cacao e non posso nemmeno distribuire il sorgente). Ecco quello che già so:

  • iOS 8 ha introdotto "framework incorporati" per iOS, ma, da quanto ho capito, non funzionano per iOS 7, solo per iOS 8 e versioni successive.
  • Ho la possibilità di distribuire la mia libreria come libreria statica (file .a) e distribuire anche le intestazioni. So che questo è un modo comune di affrontare la situazione, ma mi piacerebbe trovare qualcosa di più semplice di quello (e anche raggruppare alcune risorse con esso, se possibile).
  • Ho anche scoperto che iOS 7 non supporta le librerie dinamiche .framework (solo statiche) perché non supporta il collegamento dinamico. Ma iOS 8 lo fa, così come il collegamento statico.

Ed ecco le mie domande riguardo a queste informazioni:

  • Ho visto che posso creare un target .framework e renderlo statico, cambiando il tipo Mach-O in "libreria statica. Sarebbe sufficiente per supportare iOS 7 senza problemi, e anche per distribuire la mia libreria come una .framework bundle? In tal caso, perché i "framework incorporati" in iOS 8 sono un grosso problema, come suggeriscono molte risorse su Internet?
  • È necessario codificare il .framework proprio come faccio con qualsiasi altra applicazione che realizzo?
  • Cosa succede se devo includere altre risorse (come i dati di base o le immagini) con il mio file .framework? Dovrò creare un file .bundle separato per questo?

1
"iOS 7 non supporta le librerie .framework perché non supporta il collegamento dinamico" Questa affermazione non è corretta.
Midhun MP

1
Vedo. puoi dirmi la frase corretta? È falso perché iOS 7 supporta il collegamento dinamico o perché iOS 7 supporta le librerie .framework? O entrambi?
csotiriou

1
Ricorda che AVFoundation e CoreGraphics sono tutti .framework. Probabilmente questo ti aiuterà a trovare le risposte a tutte le tue domande: raywenderlich.com/65964/create-a-framework-for-ios
Midhun MP

Ho corretto la frase. Ho già letto il collegamento, prima di pubblicare le mie domande. Questo collegamento non spiega nulla riguardo alle mie domande. Inizia da una libreria statica e lo avvolge in un file .framework MANUALMENTE. Sto parlando di un target Cocoa Touch Framework in Xcode 6 e quindi di cambiare il tipo in una libreria statica. Non menziona la firma del codice (perché e se è necessario), risorse aggiuntive, ecc.
csotiriou

1
Puoi utilizzare CocoaPods per distribuire un framework proprietario (ad esempio Parse)
Ric Santos

Risposte:


69

Prima di iOS8, Xcode consentiva solo la possibilità di creare librerie statiche per iOS. Il problema comune era che dovevamo spedire separatamente il file binario e le intestazioni.

Successivamente, alcuni sviluppatori hanno avuto l'idea di creare "framework statici". [il .framework è solo una cartella con collegamenti simbolici alla libreria e agli header]. Uno di questi esempi è https://github.com/jverkoey/iOS-Framework

Questa opzione funzionerà per iOS 7 o 8 o precedenti. Perché sono solo librerie statiche con la comodità di raggruppare insieme i file di intestazione.

Per quanto riguarda le tue domande sulle risorse, avremmo bisogno di raggrupparle in ".bundle" .. Per spedirle non sono sicuro se possiamo racchiuderle nella cartella .framework .. In passato spedivo le mie librerie come un framework statico e un bundle ...

Tuttavia l'opzione sopra non funzionerà per te se usi Swift. Xcode non supporta la creazione di librerie statiche che includono codice swift.

Devi andare con framework dinamici se c'è un utilizzo rapido. In teoria, i framework dinamici funzionano in iOS7 .. Ma penso che iTunes Connect rifiuterà se l'app punta a iOS7 e utilizza framework dinamici :-).

Spero che questo ti aiuti


17

Con Xcode 9 in poi puoi creare framework statici anche per Swift. Ciò è possibile grazie alla compatibilità delle sorgenti ABI. Tutto quello che devi fare è modificare le Mach-O typeimpostazioni di sottostruttura del framework di destinazione. Questa tecnica è applicabile anche a Hybrid Frameworks (framework con codice Swift e Objective-C).


Ottimo suggerimento. Non so perché questa risposta è stata sottovalutata perché mi ha aiutato. \ Target'Build Settings \ Mach-O-Type e selezionare Static Framework.
rustyMagnet

3
La compatibilità Abi non è disponibile in swift 4
csotiriou

8

statico dynamicin nome di solito punti in un Linking[Chi] tipo

I framework possono essere statico dynamic[Controlla statico o dinamico]

È possibile modificare il formato della libreria che avrà un impatto su a Linkermodificando Framework target -> Build Settings -> Mach-O Type[Informazioni su] in Static Libraryo Dynamic Library. Per impostazione predefinita, Xcode ha un Dynamic Libraryvalore.

A seconda di questa impostazione verranno generati diversi tipi di binario

Dopo aver configurato correttamente un consumatore [Link vs Embed]

Static Linker ld : in fase di compilazione includerà tutto il codice da static librarynel file oggetto eseguibile.

Dynamic Linker dyld : in fase di caricamento / esecuzione proverà a trovare il framework incorporato utilizzando @rpath[About] e collegarlo

[Vocabolario]


6

Swift non funziona in una libreria statica. Se devi utilizzare un framework dinamico, devi impostare min iOS su 8.0 perché AppStore rifiuta ios 7 con framework dinamico


È possibile importare una libreria statica in un progetto basato su swift
C0D3

5

Non ho tutte le risposte ma cercherò di rispondere ad alcune delle tue domande qui.

  • Riceverai un avviso per l'utilizzo di questi framework in iOS 7, tuttavia è tutto ciò che è, un avviso. Vedi questa risposta .

  • Puoi includere altre risorse come CoreData, tuttavia dovrai crearle manualmente nel codice. Ecco un tutorial che mostra come creare un modello di dati di base.

  • Devi firmare il codice delle librerie dinamiche per iOS.

  • Devi assicurarti che il tuo framework supporti sia l'architettura del simulatore che quella del dispositivo se hai intenzione di distribuirlo.

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.