2012-11-07 13 views
20

Questo è per Xcode 4.5.x iOS armv7 armv7s e la sim e specificatamente sulla configurazione del progetto Xcode/configurazione del progetto:Xcode con iOS - Creazione di una libreria in modo semplice da eseguire in modalità di debug, distribuzione, iterazione

Ho un progetto "A" che è un'app nell'app store. Ho un progetto "B" che è una libreria che verrà utilizzata in A come dipendenza, ma anche distribuita come libreria di terze parti ad altre società da utilizzare nelle loro app. (Le app di terze parti di altre società sono rappresentate in questo caso come "Y").

Ecco i requisiti:

  • deve essere in grado di eseguire "A" in modalità debug, e, naturalmente, il debug del progetto nidificato "B" in concomitanza, nella stessa build/sessione.
  • Da "A" Posso CMD + Fare clic su una firma del metodo da "B" e saltare direttamente nel file src, dove sono libero di modificare e quindi ricompilare, come se fosse dello stesso progetto.
  • Una dev "X" in un'altra azienda deve essere in grado di trascinare facilmente la nostra libreria "B" nel suo progetto "Y", dove "B" è una libreria statica con solo i file di intestazione richiesti esposti. Naturalmente, "Y" chiama i metodi da un sottoinsieme di file di intestazione effettivi di "B". Solo i file di questo sottoinsieme dovrebbero essere inclusi nella distribuzione per Dev "X".
  • Dev "X" non dovrebbe essere necessario modificare nulla nel suo progetto Xcode, basta trascinare la cartella per "B" (che contiene la lib statica e il sottoinsieme di file di intestazione) nel suo progetto e fare clic su "Copia risorse, crea riferimenti, ecc. ".
  • Devo essere in grado di generare facilmente la libreria statica di "B", basata sugli stessi file che ho modificato tutto il tempo mentre eseguo l'iterazione e il debug di questo progetto "B" all'interno del suo progetto dipendente "A" .
  • "B" non ha risorse a parte il codice sorgente - non ci sono risorse immagine, xibs o qualcosa del genere.
  • Da "B", faccio clic su "Archivio" e Poof! c'è una lib statica (deve essere fat binary, con questo intendo che funziona sul simulatore + armv7 + armv7s, per favore !!) con i file header essenziali pronti per essere distribuiti.
  • Tutto ciò deve essere approvazione negozio app -friendly
  • Anche questo deve essere affidabile. Non va bene se devo continuare a tornare per apportare molte modifiche alla configurazione ogni volta che aggiungo un file.

UPDATE:
*PIÙ IMPORTANTE: Questo deve essere un repo posso verificare che è un completo modello di end-to-end di quello che sto cercando, e ho bisogno essere in grado di aprire Xcode 4.5.2+ e fare clic su Play e vedere questa cosa costruire, senza dolore.

500 punti a chiunque che possa fornire un modello di progetto che dimostra tutto quello che ho descritto sopra, "A", "B" e "Y" (con la "B" lib statica usato come dep) . Tutto ciò di cui ho bisogno è una serie di progetti skeleton ("A", "B" (nidificati all'interno di "A") e "Y") che mostrano come questo può essere fatto. Si prega di non trattenere la risposta fino a quando non viene pubblicata la taglia. Se soddisferà le mie esigenze, farò in modo di ottenere i miei punti di merito.

Sono un po 'preoccupato che con le limitazioni di Xcode che questo non è nemmeno possibile in un modo che non è una seccatura completa. Per favore dimmi che sbaglio.

AGGIORNAMENTO: Ho deciso che non mi importa più di armv6. Addio, armv6. Credito extra se è possibile ottenere armv6 arrotolato nell'output dist insieme a armv7, armv7s, i386/simulator.

P.S. Prometto che sarò ragionevole ad assegnare i punti. Non sto cercando di trattenerli su un aspetto tecnico. Se rendi la mia vita drammaticamente meno dolorosa in questa zona, ti assegnerò i punti.

risposta

6

Questo non sarà possibile solo in Xcode. Avrai bisogno di alcuni script di compilazione (che puoi chiamare dall'interno di Xcode ovviamente) a causa dell'interruttore di destinazione della compilazione (simulatore, dispositivo, ecc.).

Penso che sarà necessario aggiungere ulteriori intestazioni di distribuzione a un passaggio di "Copia file" almeno. Ma altre modifiche non dovrebbero essere necessarie se cambi qualcosa.

Ho fatto qualcosa del genere per libturbojpeg, vedere https://github.com/dunkelstern/libturbojpeg-ios come riferimento. Attualmente mette una libreria grassa in "lib" se si chiama il file "build.sh" dal terminale, ma omette le intestazioni di distribuzione. Nel caso di libturbojpeg avevo bisogno di 2 file di progetto perché ogni target compila un sottoinsieme diverso di file assembler nella libreria (meglio non guardare le cose del makefile dell'assemblatore). Per compilare hai bisogno di una versione recente del NASM poiché la versione di Apple è antica (prendila con brew). Pubblicherò a breve un modello per un progetto di costruzione di una biblioteca simile sullo stesso account. (Will modificare o commentare se fatto qui con collegamenti adeguati)

In pratica funziona così:

  1. Creare uno script di build che chiama xcodebuild per ogni bersaglio piattaforma necessaria
  2. Il progetto della libreria Xcode deve contenere uno script per cadere le biblioteche costruite in una directory script di build può trovare
  3. intestazioni supplementari devono essere copiati da un'azione target "Copiare i file"
  4. sceneggiatura
  5. la costruzione deve unire tutte biblioteca costruisce con lipo
  6. aggiungere lo script di build come target "Esegui script" per il vostro costruire, ma essere consapevoli non si crea un ciclo infinito (o semplicemente chiamare dal terminale per la creazione di una build di rilascio)
  7. Nel progetto principale aggiungere il sottoprogetto biblioteca

è quindi possibile distribuire il dir di uscita con i file di intestazione copiati e il lipo fuse biblioteca universale e utilizzare la libreria normalmente come sottoprogetto nel vostro spazio di lavoro come si farebbe normalmente (si costruisce e collegamenti solo le librerie necessarie quindi, non il lib universale ma quello non dovrebbe essere nessun problema)

Questo non risolve il problema della creazione di file DSYM per la libreria. Ma normalmente i simboli di debug dovrebbero essere nella libreria stessa quando si costruisce una build di debug. Spaccherà i simboli di debug sulla build di rilascio e quindi non avrai DSYM.

Link al progetto di esempio: https://github.com/dunkelstern/StaticLibraryTemplate

+0

Grazie per la risposta, sembra promettente a prima vista. Ci tufferò più tardi oggi, quando avrò un momento libero. Se questo risolve i miei problemi, ti assegnerò i punti. Dice "altre 12 ore" fino a quando posso offrire comunque la taglia. Grazie!! – jpswain

+0

Quindi stavo passando attraverso i progetti libturbojpeg. Sembra un codice C baller. So come usare lipo per combinare le build, ma soprattutto voglio un modo per eseguire facilmente il mio progetto di lib static come normale codice sorgente all'interno del progetto dipendente e come libreria statica altrettanto bene e facilmente scambiabile. Ti capita di avere un esempio che incorpori libturbojepg in questo modo? Grazie!! Jamie – jpswain

+0

Basta trascinare il file di progetto per la build della libreria nel progetto, non creare un'area di lavoro ma trascinarlo nell'albero del progetto. Non funzionerà con il progetto libturbojpeg perché ha 2 architetture distinte. Quindi creare una dipendenza nella fase di costruzione del progetto principale e inserire il file * .a nella fase di collegamento. In questo modo: http://media.dunkelstern.de/images/Xcode_library_project.png – Dunkelstern

3

sto usando https://github.com/jverkoey/iOS-Framework per realizzare qualcosa di molto simile alle vostre esigenze. Dagli tutto il merito, sto solo riassumendo come lo faccio.

creare una libreria statica, come al solito, più queste modifiche:

  • Aggiungi una fase di copiare i file da copiare le intestazioni. Non uso una corretta fase "Copia intestazioni" perché leggo da qualche parte che non è consigliata per le librerie statiche iOS.
    • Destinazione: Manufacturers Directory
    • sottotracciato: ${PROJECT_NAME}/Headers
  • modificare alcune impostazioni:
    • "Codice Della Paura Spogliarello" => Non ci sono (per tutte le impostazioni)
    • "Simboli Striscia di debug durante Copia "=> No (per tutte le impostazioni)
    • " Strip Style "=> Simboli non globali (per tutte le impostazioni)
  • aggiungere uno script corsa per preparare un quadro con la libreria:
    • utilizzare lo script prepare_framework.sh.

È possibile utilizzare il progetto libreria statica nella vostra applicazione: trascinarlo al progetto app, aggiungere la libreria .a come dipendenza e legame con esso. È possibile eseguire il debug la libreria insieme con la tua applicazione, passo in metodi, passare a definizioni di simboli, ecc

Il quadro preparato verrà utilizzato per distribuire una versione binaria:

Nello stesso progetto libreria statica aggiungere un aggregato target:

  • Aggiungere la libreria statica come dipendenza.
  • Aggiungere una fase di script di esecuzione per creare le architetture mancanti. Utilizzare lo script build_framework.sh.

Lo script di indovinare che cosa c'è l'altra piattaforma e utilizzare xcodebuild per compilarlo. Quindi utilizzare lipo per creare un file binario grasso con tutte le architetture. La destinazione della grossa libreria statica sarà l'albero quadro che abbiamo creato prima. Il framework finale viene copiato nella cartella prodotti nella cartella build.

Con questo approccio è possibile:

  • Costruire e il debug vostra applicazione con la libreria statica come progetto nidificato.
  • Creare una versione distribuibile della libreria in un passo con le intestazioni incorporate in un pacchetto simile a un framework. Il framework costruito si trova nella directory Products del progetto.
  • Usa la funzione Xcode Archive. Per qualche motivo i file finali non vengono copiati nel percorso dell'archivio. Puoi usarlo per costruire una versione ridotta del framework.

Sentiti libero di clonare un progetto utilizzando questa tecnica per impacchettare la libreria: json-framework fork. Ho modificato leggermente gli script, controlla la mia forcella di iOS-framework.

Riguardo a armv6, credo che sia necessario e vecchio iOS SDK 4.3 e aggiungere manualmente il valore letterale armv6 all'elenco di architetture e architetture reali valide. Non ho e vecchio SDK per testarlo proprio ora.

+0

Grazie amico!Non vedo l'ora di provare la tua soluzione e la soluzione di @Dunkelstern stasera dopo il lavoro. Per quanto riguarda armv6, in realtà non mi interessa abbastanza per fare più danni al cervello lì. Apple sta praticamente costringendo tutti ad abbandonare quell'arch in ogni modo rimuovendolo da Xcode. – jpswain

+0

Questa cosa è piuttosto interessante, non sono sicuro di essere pronto per passare a un framework ancora, ma mi piace molto allo stesso tempo. Posso soprattutto vedere come sarebbe bello per i progetti che utilizzano molte risorse come Xib, immagini, ecc. – jpswain

+1

Nella mia risposta non ho incluso un fascio di risorse (xibs, pngs, ecc.), Solo il 'falso' 'Struttura iOS. In effetti, questo framework ha esattamente la * stessa * libreria statica creata con lo * stesso * strumento lipo e script di esecuzione (non c'è altro modo). Ha il vantaggio di configurare automaticamente il percorso delle intestazioni e di presentarsi come un pacchetto in Xcode e Finder. È un gioco da ragazzi IMHO. – djromero

2

Cocoapods copre le vostre esigenze. Sebbene il modo standard per usarlo è di inviare le specifiche del pod ad un repository git centrale. Supporta l'aggiunta di repository alternativi per la distribuzione o la loro creazione manuale, vedere here. I vantaggi dell'utilizzo di cocoapods sono che soddisfa entrambi i requisiti e che sta diventando un metodo molto standard per la distribuzione di librerie (ad esempio utilizzato da aziende come facebook & stackmob) e open source (ad esempio un servizio di rete). Quindi, se dipendi da librerie di terze parti ora o in futuro, è probabile che i cocoapodi ti aiutino a gestire questa dipendenza.

+0

Sfortunatamente, la necessità di CocoaPods non è qualcosa che voglio imporre ai clienti di terze parti. Personalmente non l'ho ancora provato, ma sembra un'idea interessante. – jpswain