2015-02-27 21 views
5

Ho creato un framework Objective-C personalizzato. Vorrei importarlo in qualsiasi progetto iOS e utilizzare la sua funzionalità fornita su iOS Simulator e su un dispositivo reale. Per importare il framework, lo collego utilizzando l'impostazione Fasi di creazione> Collega binaria con librerie nella destinazione dell'app. Sono quindi in grado di importarlo in una delle mie classi con questa affermazione:Errore Xcode 6 - "Missing Required Architecture i386" Quando si costruisce per iOS Simulator

#import <CustomFramework/CustomFramework.h> 

posso istanziare le classi di mio framework bene, ma quando provo a fare funzionare il mio progetto su un dispositivo, ottengo il seguente errore messaggio:

dyld: Library not loaded: @rpath/CustomFramework.framework/CustomFramework 
Referenced from: /var/mobile/Applications/A61E882D-481A-4C0B-B4FD-69F5D24968BF/TestApp.app/TestApp 
Reason: image not found 

E se provo a farlo funzionare sul simulatore, ottengo un messaggio di errore diverso:

ld: warning: ignoring file /Users/user/Desktop/CustomFramework.framework/CustomFramework, missing required architecture i386 in file /Users/user/Desktop/CustomFramework.framework/CustomFramework (2 slices) 
Undefined symbols for architecture i386: 
    "_OBJC_CLASS_$_CustomFramework", referenced from: 
     objc-class-ref in AppDelegate.o 
ld: symbol(s) not found for architecture i386 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Ciò si verifica quando un'istanza di una classe dal quadro. Se imposto il framework ma non lo uso, la mia app si costruisce con successo. Si sbaglia solo quando istanzio una classe dal framework per qualche ragione.

Per far sì che l'app sia stata creata su un dispositivo, ho seguito la risposta this SO. Invece di collegare il framework, ho aggiunto una nuova fase di copia dei file nell'impostazione Fasi di creazione del target, impostare Destination to Framework e aggiunto il framework.

Che funziona benissimo; tuttavia, mi piacerebbe testare la mia app anche su iOS Simulator. Quando provo a eseguire la mia app sul simulatore, ottengo ancora l'errore "mancante architettura richiesta i386". Ho provato le soluzioni proposte in quasi tutti gli argomenti SO relativi che ho trovato e nulla mi ha aiutato a risolvere questo problema.

Si prega di notare che sto cercando di utilizzare il mio framework personalizzato in un nuovo progetto Xcode, quindi nessuna delle impostazioni di app/build sono state modificate dai loro valori predefiniti.

Come posso risolvere questo errore in modo che possa eseguire la mia app sia su iOS Simulator sia su un dispositivo con il mio framework incluso nel progetto? Qualsiasi intuizione sarebbe molto apprezzata!

risposta

5

Il problema era che il framework non è stato compilato per l'architettura di iOS Simulator, che è i386. Xcode compila solo un framework per l'architettura di destinazione, quindi se avessi costruito il framework per iOS Simulator, non funzionerebbe su un dispositivo, e se avessi costruito il framework per un dispositivo, non funzionerebbe su iOS Simulator.

ho creato il mio quadro da zero con l'aiuto di questo tutorial: http://www.raywenderlich.com/65964/create-a-framework-for-ios

Lo script di build multi-architettura è ciò che ha permesso il mio quadro per l'esecuzione sia sul simulatore iOS e un dispositivo.

+2

Grazie per la risposta! Eppure è assurdo che fino al 2015, dobbiamo ancora ricorrere alla costruzione manuale per ottenere una struttura decente (il tutorial è come, lungo 10 pagine ?!). Vergogna, Apple! – Rick77

+1

@ Rick77 Felice di aiutare! Sono completamente d'accordo.Sviluppo anche app per Windows e Windows Phone e non ho nemmeno dovuto pensarci su quelle piattaforme. – Alexander

+0

@Alexander Il mio framework non è stato compilato per l'architettura di iOS Simulator. Supporta solo il dispositivo, Come far funzionare il mio framework in Simulator. Sto usando il framework . – Arun

0

Ho riscontrato questo stesso problema con Xcode 7.1 durante il tentativo di creare il simulatore. Qualcun altro ha detto che ha funzionato per loro con Xcode 8.2.1, quindi ho provato a creare/eseguire lì e ha funzionato. Non ho dovuto cambiare obiettivi o qualcosa nel mio progetto.

Quindi prova ad aggiornare il tuo Xcode se puoi, presumibilmente avrai anche correzioni di bug aggiuntive.