Libreria iOS per Zip di files

iOS_ZIP-KIT_ZipKit_Framework_Xcode_tutorialUno sviluppatore i3Factory sta lavorando in un progetto di invio di percorsi  allegando foto, testi e audio/video  per cui ha necessità di importare una libreria per zippare dei file.
Ha trovato questa libreria che sembra essere costantemente aggiornata (di solito si trovano solo quelle “no arc” per iOS4..) https://github.com/kolpanic/ZipKit .

In ZipKit e’ presente una breve guida per l’installazione ma Claudio, il nostro developer italiano, la trova estremamente superficiale e non è riescito ad importare nulla (sia ZipKit.framework che libtouchzipkit.a gli rimangono “rossi”). All’interno di Zip Kit ci sono pure linkate delle app che dovrebbero essere d’esempio, ma scaricando quella per iOS e provando a farla partire da subito “Build Failed”. Il nostro sviluppatore è ancora inesperto su come integrare progetti su altri progetti e sull’impostazione delle dipendenze.

Vediamo quindi di spiegare come funziona tutto il meccanismo, cosa bisogna toccare, cosa non, etc…

Innanzi tutto dato che il progetto è per iOS è necessario escludere il Framework (i Framework esistono solo per OSX e sono stati introdotti nell’ultimo WWDC solo da iOS8; ora per creare un Framework in iOS7 bisogna seguire un procedimento abbastanza intricato spiegato qui: http://www.raywenderlich.com/65964/create-a-framework-for-ios).
Quindi la libreria statica di interesse e’ la libtouchzipkit.a (l’altra e’ la libreria statica per OSX).
Il nostro CTO, Carlo Vigiani, ha proceduto in questo modo ed è riuscito a compilare un progetto semplice (ZKtest da scaricare qui) che usi la classe ZKFileArchive (non abbiamo provato il risultato, ma presumo che funzioni).
Sperando che questa spiegazione sara’ utile, importare i progetti non e’ sempre scontato:
1) Aprire il progetto contenente l’applicazione
2) Clonare da github l’intero progetto ZipKit e copiare l’intera cartella del progetto all’interno del vostro progetto (quest’ultimo passo non e’ necessario ma suggerito cosi’ siete sicuri di avere la versione di ZipKit giusta per il vostro progetto).
ZipKit_Test-0
3) dal Finder, trascinare il file ZipKit.xcodeproj dentro la cartella del progetto (vedi figura: Carlo ha creato un’app ZKTest)
ZipKit_Test-1
4) a questo punto dovete definire nelle Build Phases del target della tua app (nella figura ZKTest) le librerie che userai: qui ho aggiunto libz.dylib (di sistema) e libtouchzkpkit.a (che devi vedere dato che hai caricato il progetto ZipKit come sotto-progetto del progetto principale); vedi figura
5) inoltre affinché possiate vedere gli header dovete aggiungere nell’header path il path dove si trova ZipKit. Se nel passo (2) avevevato copiato la cartella del sotto progetto ZipKit dentro la cartella del progetto principale, vi basta aggiungere ./ZipKit. Nel nostro caso invece dato che Carlo non ha copiato il progetto deve scoprire il path relativo o assoluto rispetto al suo progetto. In genere Carlo procede cosi’:
5.1) selezioniamo in XCode il sotto-progetto (in questo caso ZipKit)
ZipKit_Test-35.2) nell’assistant di XCode recuperiamo il path del sotto-progetto relativo al progetto principale (vedi figura): in questo caso era ../../Frameworks/Data/ZipKit/ZipKit.xcodeproj
5.3) ora il file .h principale e’ ZipKit.h che si trova proprio sotto la directory appena cercata, quindi andiamo nel nostro target principale, selezioniamo Build Settings ed Header Search Path e aggiungiamo il path precedentemente trovato (vedi figura)
ZipKit_Test-4
5.4) inoltre cerchiamo la sezione “Other Linker Flags” e aggiungo “-ObjC -all_load” (vedi figura)
A questo punto il progetto (ZKtest da scaricare qui) e’ pronto. Importiamo dove ci serve il file “ZipKit.h” (nota che abbiamo indicato ZipKit/ZipKit.h dato che l’header file si trova due livelli sotto ZipKit rispetto all’header path che avevamo indicato prima: ../../Frameworks/Data/ZipKit/ZipKit/ZipKit.h
 
#import “ZipKit/ZipKit.h”
In generale bisogna tenere a mente queste cose quando si importa un progetto:
  • gli header servono per il compilatore per controllare la correttezza del vostro codice e generare il codice binario che richiama le funzioni; l’header search path di default punta al progetto e ai framework di sistema, quindi sta a voi aggiungere manualmente gli header search path aggiuntivi
  • anche se avete inserito correttamente gli header, poi il linker dovete trovare il codice binario associato alle funzioni da voi referenziate: con iOS, non essendoci i framework (almeno fino ad iOS7), dovete caricare delle librerie statiche (che quindi vengono copiate nell’applicazione e staticamente caricate insieme al resto del binario dell’app): potete indicare le librerie statiche nella sezione Build Phases —> Link Binary With Libraries
  • opzionalmente potete aggiungere nelle “Target Dependencies” il target “touchzipkit”: questo garantisce che la compilazione del vostro codice va sempre preceduta dalla compilazione della libreria originale: questo e’ utile se per caso fate dei cambiamenti, in tal caso forzate la generazione del target. Probabilmente a voi non servirà fare questo se compilate a parte ZipKit e poi non lo toccate più. Ma tenete conto che questo e’ suggerito nel caso abbiate deciso di  supportare diverse architetture o cambiate SDK (la compilazione vi assicura che non vi siano incompatibilita’). Questo ovviamente non va fatto se vi forniscono una libreria senza codice sorgente (per esempio Urban Airship o Google Analytics non ti danno i codice sorgente e quindi non serve aggiungere il progetto nelle target dependencies).

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*