2016-01-19 12 views
11

Ho costruito un framework in Swift. Il framework usa Cocoapods, uno dei pod è scritto nell'obiettivo C.Swift fat framework w/Objective-C Cocoapod

Io uso anche uno script personalizzato per rendere il framework un framework grasso in modo che supporti i sistemi a 32/64 bit. (Questo viene eseguito in un obiettivo separato sul progetto e mi chiedo se questo ha qualcosa a che fare con esso?)

UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal 

if [ "true" == ${ALREADYINVOKED:-false} ] 
then 
echo "RECURSION: Detected, stopping" 
else 
export ALREADYINVOKED="true" 

// Step 1. Build Device and Simulator versions 
xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build 
xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build 

//Step 2. Copy the framework structure (from iphoneos build) to the universal folder 
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/" 

// Step 3. Copy Swift modules (from iphonesimulator build) to the copied framework directory 
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/." "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule" 

// Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory 
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}" 

// Step 5. Convenience step to copy the framework to the project's directory 
cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}" 

// Step 6. Convenience step to open the project's directory in Finder 
open "${PROJECT_DIR}" 

fi 

Quando creo questo quadro grassi e metterlo in un progetto vorrei usare sul compilatore fallisce sempre b/c il progetto non può vedere il modulo c cacao oggettivo.

clang: error: linker command failed with exit code 1 (use -v to see invocation) 
ld: framework not found Pusher for architecture x86_64 

Non è stato trovato per nessuna architettura quando cambio la piattaforma di costruzione.

Qualsiasi soluzione in cui sia possibile creare un framework che possa essere utilizzato in un progetto Xcode separato (per tutti i sistemi iOS o OS X) sarebbe fantastico.

risposta

0

Apparentemente manca l'architettura a 64 bit per Simulator.

Quando si crea un target da Xcode, a seconda del tipo di simulatore selezionato, la libreria prodotta conterrà rispettivamente i386 o x86_64 per la versione selezionata a 32 bit o 64 bit del simulatore.

Immagino che il cli build stia producendo solo la versione i386.

Si può cercare di impostare le architetture nello script:

xcodebuild -target "${PROJECT_NAME}" ARCHS="i386 x86_64" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

In alternativa è possibile cercare di costruire a mano con simulatore di 64 bit (iPhone 5S +), quindi estrarre l'architettura mancante e poi mettilo nella libreria finale usando il comando lipo.

+0

Credo che sia gestito da ONLY_ACTIVE_ARCH = NO args. A parte questo funziona anche quando non c'è un cacao Objective-C. –

3

Non è possibile eseguire xcodebuild con -target quando si utilizza CocoaPods. Quando si utilizza -target, Xcode considererà solo il progetto attivo e non riuscirà a inserire le dipendenze di Pod, in modo simile a quando si è appena aperto il file di progetto in Xcode e si è tentato di creare.

Si dovrebbe essere in esecuzione xcodebuild -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${PROJECT_NAME}" ..., presupponendo che CocoaPods abbia generato lo spazio di lavoro e Xcode abbia generato uno schema utilizzando il nome di destinazione. Dovrai inoltre assicurarti che il tuo schema sia contrassegnato come condiviso se lo stai eseguendo su un altro dispositivo.

Una volta creato il framework, è necessario includerlo nello e nei framework che dipendono dallo nelle app che lo utilizzeranno. Per il tuo framework, significa includerlo in Generale> Binari incorporati e Generale> Strutture e librerie collegate. Per i framework di cui fai affidamento (ad esempio AlamoFire), puoi chiedere agli utenti di includerlo nel loro Podfile, puoi impacchettarlo e spedirlo insieme al tuo framework, oppure puoi fare entrambe le cose e lasciare che l'utente faccia ciò che funziona per loro.

+0

Potrebbe esserci qualcos'altro che devo fare o modificare? Non ho un errore del compilatore su di esso non trovando un modulo, ma quando provo a eseguire qualsiasi cosa ottengo: ~/Library/Developer/CoreSimulator/Devices/74636985-3538-4693-B131-983106003055/data/Containers/Bundle/Applicazione/FBC92D11-240D-45BB-9F21-C4372DE509B4/TestMyKit.app/TestMyKit Motivo: immagine non trovata (lldb) –

+0

È l'errore completo?Nessuna informazione su quale immagine non potrebbe essere caricata? .framework è elencato in entrambe le librerie per collegare e binari da incorporare per quella app? –

+0

Questo è l'errore completo: dyld: Libreria non caricata: @ rpath/Alamofire.framework/Alamofire Riferimento a: ~/Libreria/Sviluppatore/CoreSimulator/Devices/74636985-3538-4693-B131-983106003055/data/Containers/Bundle /Application/FFC6E8DA-4877-4142-A97B-73A3B7712319/TestMyKit.app/Frameworks/DICAPIKit.framework/DICAPIKit Motivo: immagine non trovata (lldb) - Sì, il framework è sia collegato che incorporato. –

Problemi correlati