Ottenere "file non trovato" in Bridging Header durante l'importazione di framework Objective-C nel progetto Swift


96

Ho un progetto Swift per il quale sto cercando di importare framework basati su ObjC. Il framework si trova in una directory sotto il percorso del progetto ed è referenziato dal progetto in Xcode. Viene anche aggiunto a "Collega file binario con librerie" nella pagina "Fasi di compilazione" del progetto.

Tuttavia, per qualche motivo, non riesco a includere il framework nel file Bridging-Header. Ottengo il seguente errore:

BridgingHeader.h:5:9: error: 'Parse/Parse.h' file not found
#import <Parse/Parse.h>
        ^
<unknown>:0: error: failed to import bridging header 'BridgingHeader.h'

Cose che ho controllato:

  1. "Install Objective-C Compatibility Header" è impostato su "YES".
  2. I percorsi di ricerca delle intestazioni includono il percorso dei framework.

Sono sicuro che mi manca qualcosa, quindi se qualcuno ha qualche indizio, sarebbe fantastico.


3
Ho dimenticato di inserire il percorso della libreria Header Search Paths, in questo caso la domanda ha aiutato: D
Aishwat Singh

Risposte:


78

Trovato una soluzione:

  • L'impostazione "Objective-C Bridging Header" (aka SWIFT_OBJC_BRIDGING_HEADER) deve essere impostata a livello di destinazione e NON a livello di progetto. Assicurati di eliminare il valore dell'impostazione a livello di progetto.

(a me sembra un bug di Xcode, dato che non so perché lo risolve).


1
Questo è davvero strano, ho avuto lo stesso errore e si scopre che avevo l'intestazione definita a livello di progetto. Anche se l'avevo già definito a livello di destinazione, ho dovuto rimuoverlo dal livello di progetto per consentire l'aggiunta di Framework di terze parti. Con aria di sfida sembra che sia un bug di Xcode.
Jojodmo

2
@MarcoAlmeida, se hai un target di test, prova a rimuovere anche l'impostazione "Objective-C Bridging Header" da quello. Dovrebbe aiutare.
Davlat Mirmanov

3
Incredibile. Grazie.
Darren

1
Ehilà! Hanno lo stesso problema qui :( Anche se non è stato risolto con il metodo sopra descritto ...
Mike K

1
Questo ha funzionato per me in Xcode 9.2. Ancora non risolto dopo tanti anni ...
Oliver Eichhorn

58

Ho lo stesso problema. Ad esempio, ho cambiato tutte le mie importazioni da #import "HMSegmentedControl.h"a #import <HMSegmentedControl/HMSegmentedControl.h>.


7
Per lavorare con i cocoapodi questo è necessario. Nell'intestazione Bridging non importare mai un pod come #import "abc.h" utente #import <abc / abc.h> Thumbs up.
NaXir

1
Tu sei il dio! Grazie mille per questo.
Alper

Nel mio caso ho convertito #import <ios-qr-encoder / UIImage + MDQRCode.h> in #import "UIImage + MDQRCode.h" e ha funzionato
Mashhadi

Tu sei il re
Itai Spector

27

Ho dovuto aggiungere la mia libdirectory nei percorsi di ricerca dell'intestazione utente:

impostazioni del target di test: percorso di ricerca dell'intestazione dell'utente

Nel mio caso la libdirectory contiene il .afile -library e alcuni file header. Questi sono inclusi nel file di intestazione del bridging. Tuttavia, il compilatore rapido non li troverebbe. Solo quando ho aggiunto ${PROJECT_DIR}/libal percorso di ricerca dell'intestazione dell'utente, ha creato l'obiettivo del test.

(Sto usando Xcode 6.2 su Mavericks 10.9.5)


1
Potrei risolvere questo problema aggiungendo Pods / * ai percorsi di ricerca delle intestazioni dell'obiettivo principale. È interessante notare che non ho avuto questo problema prima di aggiungere i framework Swift come dipendenze al mio obiettivo. Xcode 7 beta 6.
bizz84

Questo era esattamente ciò che ha funzionato per me. Ho un framework incluso nel mio progetto che contiene la libreria (.a). Ho dovuto creare un percorso di ricerca per le intestazioni per la libreria nei percorsi di ricerca delle intestazioni utente.
Chris Livdahl

Ho anche dovuto importare pod / cartella della libreria, grazie mille!
thibaut noah

17

Abbiamo riscontrato lo stesso messaggio di errore, con una causa completamente diversa.

Impostare:

  • Target dell'app, tutto il codice Obj-C
  • Obiettivo di unit test con un singolo caso di test rapido e un'intestazione di collegamento che fa riferimento al codice dell'app

Quando abbiamo aggiunto il secondo caso di test rapido, dopo un clean (o sulla macchina di un compagno di squadra), abbiamo visto questo errore durante la costruzione del target di unit test.

È stato risolto aggiungendo una classe Obj-C fittizia all'obiettivo dello unit test.


5
Grazie. Questo ha funzionato assolutamente nonostante non avesse assolutamente senso.

In seguito sono stato in grado di eliminare la classe Obj-C fittizia. La mia ipotesi è che un effetto collaterale di questa soluzione sia la creazione di un'intestazione di bridging specifica per il target di test, che a sua volta (sospetto) fa sì che Xcode ignori l'intestazione di bridging dell'applicazione host.
clozach

Addendum a sopra: dopo aver eseguito una build pulita, ho iniziato a ricevere un errore di segmentazione 11 durante la compilazione. Dopo alcuni tentativi ed errori, sembra che il file fittizio .m debba essere presente, ma può essere vuoto. Follia.
clozach

L'aggiunta di una classe objc fittizia al mio obiettivo di test, risolto per me!
neoneye

5

Se utilizzi cocoapods, prova a reinstallare i pod eseguendo il seguente comando.

pod install

Questo mi ha aiutato poiché di recente avevo creato una nuova configurazione che non si stava compilando (lo stesso problema di file non trovato), mentre le altre configurazioni (Debug e Release) lo erano. pod installsembra essere richiesto per qualsiasi nuova configurazione aggiunta ...
Mete

5

Questo in qualche modo ha funzionato per me:

  • Progetto pulito
  • Pulisci la cartella di build
  • Riavvia Xcode

Vieni con risposte generiche non colpire e prova tric.
Nico

Questo particolare trucco metti e prova richiede uno sforzo molto minore, quindi non dovrebbe far male provare mentre pensi ad altre soluzioni. ;)
Hlung

1
Purtroppo, questo particolare trucco metti e prova è troppo spesso la risposta corretta.
Robert Schmid

5

Questo errore è apparso durante l'installazione con Cocoapods della libreria CocoaImageHashing. Il problema era che i percorsi di ricerca erano sbagliati. Quindi a livello di destinazione, in Impostazioni build -> Percorsi di ricerca -> Percorsi di ricerca intestazione, i percorsi corrispondevano a cartelle inesistenti, ad esempio "$ {PODS_ROOT} / Headers / Public / CocoaImageHashing", quando la struttura della cartella Headers / Public / non esisteva. Ho aggiunto il percorso $ {PODS_ROOT} / CocoaImageHashing e l'errore è scomparso.


4

Beh, è ​​un po 'strano, ma immagino che tu debba aggiungere una risorsa alla fase "Copia risorse bundle" del tuo obiettivo di test per far sì che carichi tutte le intestazioni dalla destinazione dell'app principale. Nel mio caso, ho aggiunto main.storyboarde si è preso cura dell'errore.

inserisci qui la descrizione dell'immagine


4

Questo è successo a me dopo aver aggiunto / rinominato le configurazioni correnti e ha senso.

Ogni configurazione utilizza il set di configurazioni generato da cocoapods, quindi queste cose devono corrispondere.

Quindi, se si aggiungono / rinominano le configurazioni, queste dovranno utilizzare i corretti set di configurazione, e per questo l'esecuzione pod installlo farà.


3

Se aiuta qualcuno.

Nel mio caso i miei file obj-c sono stati aggiunti ha una cartella di riferimento (le cartelle blu in xcode) e l'intestazione non è riuscita a trovarli. Ho appena aggiunto i file, non la cartella, dal finder a xcode e risolto.


2

Ho avuto lo stesso problema. Per me il motivo era che stavo usando la stessa intestazione di collegamento sia per la mia app che per la mia estensione Today. La mia estensione Today non include Parse, ma poiché era definita nell'intestazione di bridging, stava cercando di cercarla. Ho creato una nuova intestazione di bridging per la mia estensione Today e l'errore è scomparso.


Non sembra lo stesso problema che ho io. Non ho l'estensione Today. Nel mio caso, sto usando un'intestazione di bridging per l'app e il framework Parse è incluso nelle dipendenze dell'app. L'errore si verifica anche per altri framework, non solo per Parse.
Dia Kharrat

2

Il mio framework funzionava prima e improvvisamente smise di funzionare e nessuna di queste risposte funzionava per me. Ho rimosso il framework in Build Phases> Link Binary With Libraries e l'ho aggiunto di nuovo. Ha ricominciato a lavorare.


2

Ho riscontrato un problema e l'ho risolto dopo aver impiegato 2 ore per trovarlo. Il mio ambiente come di seguito:

cocoapod 0.39.0

swift 2.x

XCode 7.3.1

Passaggi:

  1. percorso del progetto: nome_progetto / nome_progetto / your_bridging_header.h
  2. Nella sezione Swift in Build Setting, Objective-C Bridging Header dovrebbe essere: project_name / your_bridging_header.h
  3. In your_bridging_header.h , modifica tutte le dichiarazioni da .h a #import
  4. Nella classe che viene utilizzata your_3rd_party . Dichiara import your_3rd_party

La tua risposta è corretta, aggiungi la risposta @jamesthakid al terzo punto per renderla più chiara. Ha funzionato per me grazie.
NaXir

5
Cosa intendi esattamente con "cambia tutte le dichiarazioni da .h a #import"?
Chris Gunawardena

1

Avevo appena duplicato uno schema esistente e aggiunto un'altra configurazione al progetto. Ho dovuto aggiungere una configurazione con lo stesso nome al progetto del framework in modo che anch'esso si compilasse nella stessa DerivedData/($AppName)/Build/Products/($CONFIGURATION_NAME)cartella. In caso contrario, il file .framework non viene creato e quindi non può essere importato.


1

Oggi ho riscontrato lo stesso problema durante il tentativo di utilizzare un pod scritto in Objective-C nel mio progetto Swift, nessuna delle soluzioni di cui sopra sembrava funzionare.

Nel podfile che avevo use_frameworks!scritto. Commentare questa riga e quindi eseguire di pod installnuovo ha risolto questo problema e l'errore è scomparso.


1

(Aggiornato al 27 maggio 2017)

Xcode 8. Swift Project - importazione di Objective C.

Cose da sapere:

  1. Il file di intestazione del bridging DEVE essere salvato nella cartella del progetto. (cioè non salvato allo stesso livello in cui viene salvato .xcodeproj, ma invece un livello più in basso nelle cartelle in cui vengono salvati tutti i tuoi file swift e oggettivi c). Può ancora trovare il file al livello superiore, ma non si collegherà correttamente e non sarà in grado di importare i file Objective C nel file di intestazione del bridging
  2. Il file di intestazione di bridging può essere denominato qualsiasi cosa, purché sia ​​un file di intestazione .h
  3. Assicurati che il percorso in Build Settings> Swift Compiler - General> Objective C Bridging Header punti correttamente al tuo file di intestazione di bridging che hai creato
  4. IMPORTANTE: se continui a ricevere "non trovato", prova a svuotare prima il file di intestazione del bridging e cancellare tutte le importazioni che hai attualmente scritto lì. Assicurati che il file di intestazione del bridging possa essere trovato prima, quindi inizia ad aggiungere le importazioni dell'obiettivo c a quel file. Per qualche motivo, restituirà lo stesso errore "non trovato" anche se viene trovato ma non gli piace l'importazione che stai provando per qualche motivo
  5. Non dovresti #importare "MyBridgingHeaderFile.h" in nessuno dei tuoi file C oggettivi. Ciò causerà anche un errore "file non trovato"

1
Tutti questi punti sono controllati e hanno ancora lo stesso problema :( Eventuali ulteriori punti dovrebbero essere presi in considerazione?
Amjad Husseini

@AmjadHusseini prova a pulire i tuoi file di progetto, quindi cancella i dati derivati ​​dal tuo progetto e riavvia xCode. che ha funzionato con me
Mohammad Allam

0

Ho avuto un problema simile e solo una soluzione ha funzionato per me. Ho provato tutto ciò che mi è stato suggerito e sapevo di aver impostato correttamente la mia intestazione di bridging, perché avevo qualche altra libreria funzionante.

Quando ho copiato la libreria (drag and drop) nel progetto, senza Cocoapods, solo dopo ho potuto importare le intestazioni senza errori.

Ho usato la libreria facebook / Shimmer.


0

Ho avuto un problema simile con i pod. Fondamentalmente cercando di eseguire i miei test dell'interfaccia utente, Xcode si è lamentato dei pod mancanti. La soluzione a questo è stata molto più semplice di quanto descritto sopra:

  1. vai al file di progetto (main non è un target)
  2. fare clic sulla scheda "Informazioni" (più a sinistra)
  3. impostare la corretta configurazione del pod per la destinazione dei test dell'interfaccia utente (sezione "Configurazioni" sotto "Destinazione di distribuzione")

Lavorando!

L'ho trovato in un thread: https://github.com/CocoaPods/CocoaPods/issues/2695

Suona un po 'come un insetto per i baccelli di cacao, ma posso capire i motivi per cui potrebbe essere un caso complicato.



0

Pulisci progetto, Pulisci cartella build, Riavvia Xcode. Ho appena rimosso il percorso in goto progetto> Impostazioni build> Cerca la parola chiave. Swift Compiler - General -> Objective-C Bridging header ha funzionato per me.


0

Agosto 2019

Nel mio caso volevo utilizzare un protocollo Swift in un file di intestazione Objective-C che proviene dallo stesso target e per questo avevo bisogno di utilizzare una dichiarazione in avanti del protocollo Swift per referenziarlo nell'interfaccia Objective-C. Lo stesso dovrebbe essere valido per l'utilizzo di una classe Swift in un file di intestazione Objective-C. Per utilizzare la dichiarazione in avanti, vedere il seguente esempio dalla documentazione in Include Swift Classes in Objective-C Headers Using Forward Declarations :

// MyObjcClass.h
@class MySwiftClass; // class forward declaration
@protocol MySwiftProtocol; // protocol forward declaration

@interface MyObjcClass : NSObject
- (MySwiftClass *)returnSwiftClassInstance;
- (id <MySwiftProtocol>)returnInstanceAdoptingSwiftProtocol;
// ...
@end
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.