Beim Importieren von Objective-C-Frameworks in das Swift-Projekt wird "Datei nicht gefunden" in Bridging Header angezeigt

96

Ich habe ein Swift-Projekt, für das ich versuche, ObjC-basierte Frameworks zu importieren. Das Framework befindet sich in einem Verzeichnis unter dem Projektpfad und wird vom Projekt in Xcode referenziert. Es wird auch zum "Link Binary with Libraries" auf der Seite "Build Phases" des Projekts hinzugefügt.

Aus irgendeinem Grund kann ich das Framework jedoch nicht in die Bridging-Header-Datei aufnehmen. Ich erhalte folgende Fehlermeldung:

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'

Dinge, die ich überprüft habe:

  1. Der "Install Objective-C Compatibility Header" ist auf "YES" gesetzt.
  2. Die Header-Suchpfade enthalten den Pfad zu den Frameworks.

Ich bin mir sicher, dass mir etwas fehlt. Wenn also jemand irgendwelche Hinweise hat, wäre das großartig.

Dia Kharrat
quelle
3
Ich habe vergessen, den Bibliothekspfad Header Search Paths
einzugeben.

Antworten:

78

Eine Lösung gefunden:

  • Die Einstellung "Objective-C Bridging Header" (auch bekannt als SWIFT_OBJC_BRIDGING_HEADER) muss auf Zielebene und NICHT auf Projektebene festgelegt werden. Stellen Sie sicher, dass Sie den Einstellungswert auf Projektebene löschen.

(Für mich scheint es ein Xcode-Fehler zu sein, da ich nicht weiß, warum er behoben wird).

Dia Kharrat
quelle
1
Das ist wirklich komisch, ich hatte den gleichen Fehler und es stellte sich heraus, dass ich den Header auf Projektebene definiert hatte. Obwohl ich es bereits auf Zielebene definiert hatte, musste ich es aus der Projektebene entfernen, damit Frameworks von Drittanbietern hinzugefügt werden konnten. Es scheint trotzig, als wäre es ein Xcode-Fehler.
Jojodmo
2
@MarcoAlmeida, wenn Sie ein Testziel haben, versuchen Sie auch, die Einstellung "Objective-C Bridging Header" daraus zu entfernen. Es sollte helfen.
Davlat Mirmanov
3
Unglaublich. Danke.
Darren
1
Sie da! Haben Sie das gleiche Problem hier :( Obwohl es nicht mit der oben beschriebenen Methode behoben wird ...
Mike K
1
Dies hat bei mir in Xcode 9.2 funktioniert. Nach so vielen Jahren immer noch nicht behoben ...
Oliver Eichhorn
58

Ich habe das gleiche Problem. Ich habe zum Beispiel alle meine Importe von #import "HMSegmentedControl.h"auf geändert #import <HMSegmentedControl/HMSegmentedControl.h>.

Jamesthakid
quelle
7
Um mit Cocoapods arbeiten zu können, ist dies notwendig. Importieren Sie im Bridging-Header niemals einen Pod als #import "abc.h" Benutzer #import <abc / abc.h> Daumen hoch.
NaXir
1
Du bist der Gott! Vielen Dank dafür.
Alper
In meinem Fall habe ich #import <ios-qr-encoder / UIImage + MDQRCode.h> in #import "UIImage + MDQRCode.h" konvertiert und es hat funktioniert
Mashhadi
Du bist der König
Itai Spector
27

Ich musste mein libVerzeichnis in User Header Search Paths hinzufügen :

Zieleinstellungen testen - Suchpfad für Benutzer-Header

In meinem Fall libenthält das Verzeichnis die .a-library-Datei und einige Header-Dateien. Diese sind in der Bridging-Header-Datei enthalten. Der schnelle Compiler würde sie jedoch nicht finden. Erst als ich ${PROJECT_DIR}/libdem Suchpfad für den Benutzerkopf hinzugefügt habe , wurde das Testziel erstellt.

(Ich verwende Xcode 6.2 unter Mavericks 10.9.5)

Rainer Schwarze
quelle
1
Ich könnte dieses Problem beheben, indem ich Pods / * zu den Header-Suchpfaden des Hauptziels hinzufüge. Interessanterweise hatte ich dieses Problem nicht, bevor ich Swift-Frameworks als Abhängigkeiten zu meinem Ziel hinzufügte. Xcode 7 Beta 6.
Bizz84
Genau das hat bei mir funktioniert. Ich habe ein Framework in meinem Projekt, das die Bibliothek (.a) enthält. Ich musste einen Suchpfad zu den Headern für die Bibliothek in den Benutzerpfad-Suchpfaden erstellen.
Chris Livdahl
Musste auch Pods / Bibliotheksordner importieren, vielen Dank!
Thibaut Noah
17

Wir haben dieselbe Fehlermeldung mit einer völlig anderen Ursache festgestellt.

Konfiguration:

  • App-Ziel, alle Obj-C-Code
  • Unit-Test-Ziel mit einem einzelnen schnellen Testfall und einem Bridging-Header, der sich auf den App-Code bezieht

Als wir den zweiten schnellen Testfall nach einer Reinigung (oder auf der Maschine eines Teamkollegen) hinzufügten, sahen wir diesen Fehler beim Erstellen des Einheitentestziels.

Es wurde behoben, indem dem Einheitentestziel eine Dummy-Obj-C-Klasse hinzugefügt wurde.

Dan Jackson
quelle
5
Danke dir. Dies funktionierte absolut, obwohl es absolut keinen Sinn ergab.
Danach konnte ich die Dummy-Obj-C-Klasse löschen. Ich vermute, dass ein Nebeneffekt dieser Lösung die Erstellung eines testzielspezifischen Bridging-Headers ist, der (wie ich vermute) dazu führt, dass Xcode den Bridging-Header der Host-Anwendung ignoriert.
Clozach
Nachtrag zu oben: Nach einem sauberen Build wurde beim Kompilieren ein Segmentierungsfehler 11 angezeigt. Nach einigem Ausprobieren scheint es, dass die Dummy-M-Datei vorhanden sein muss, sie kann jedoch leer sein. Wahnsinn.
Clozach
Durch Hinzufügen einer Dummy-Objektklasse zu meinem Testziel wurde dies für mich behoben!
Neoneye
5

Wenn Sie Cocoapods verwenden, installieren Sie die Pods erneut, indem Sie den folgenden Befehl ausführen.

pod install
Ankit Goel
quelle
Dies hat mir geholfen, da ich kürzlich eine neue Konfiguration erstellt hatte, die nicht kompiliert wurde (dieselbe Datei wurde nicht gefunden), während die anderen Konfigurationen (Debug und Release) dies waren. pod installscheint für alle neu hinzugefügten Konfigurationen erforderlich zu sein ...
Mete
5

Das hat irgendwie den Trick für mich getan:

  • Projekt reinigen
  • Bereinigungsordner bereinigen
  • Starten Sie Xcode neu
Hlung
quelle
Kommen Sie mit generischen Antworten, nicht mit Trics.
Nico
Dieser spezielle Hit & Try-Trick erfordert sehr wenig Aufwand, sodass es nicht schaden sollte, ihn zu versuchen, während Sie an andere Lösungen denken. ;)
Hlung
1
Leider ist dieser spezielle Trick zu oft die richtige Antwort.
Robert Schmid
5

Dieser Fehler trat bei der Installation der Bibliothek CocoaImageHashing mit Cocoapods auf. Das Problem war, dass die Suchpfade falsch waren. Auf der Zielebene entsprachen die Pfade unter Build-Einstellungen -> Suchpfade -> Header-Suchpfade nicht vorhandenen Ordnern, z. B. "$ {PODS_ROOT} / Headers / Public / CocoaImageHashing", wenn die Ordnerstruktur Headers / Public / hat nicht existiert. Ich habe den Pfad $ {PODS_ROOT} / CocoaImageHashing hinzugefügt und der Fehler ist verschwunden.

Nicoara Talpes
quelle
4

Nun, es ist etwas seltsam, aber ich denke, Sie müssen Ihrer "Copy Bundle Resources" -Phase Ihres Testziels eine Ressource hinzufügen, damit alle Header von Ihrem Haupt-App-Ziel geladen werden. In meinem Fall habe ich hinzugefügt main.storyboardund es hat den Fehler behoben.

Geben Sie hier die Bildbeschreibung ein

Yas T.
quelle
4

Dies ist mir nach dem Hinzufügen / Umbenennen aktueller Konfigurationen passiert und macht Sinn.

Jede Konfiguration verwendet das von Cocoapods generierte Konfigurationsset, sodass diese Dinge übereinstimmen müssen.

Wenn Sie also Konfigurationen hinzufügen / umbenennen, müssen diese die richtigen Konfigurationssätze verwenden, und für diese Ausführung pod installwird dies ausgeführt.

rgkobashi
quelle
3

Wenn jemand hilft.

In meinem Fall haben meine obj-c-Dateien einen Referenzordner (die blauen Ordner in xcode) und der Header konnte sie nicht finden. Fügte einfach die Dateien, nicht den Ordner, vom Finder zu xcode hinzu und löste sie.

DaSilva
quelle
2

Ich hatte das gleiche Problem. Für mich war der Grund, dass ich sowohl für meine App als auch für meine Today-Erweiterung denselben Bridging-Header verwendete. Meine Today-Erweiterung enthält keine Analyse, aber da sie im Bridging-Header definiert wurde, wurde versucht, danach zu suchen. Ich habe einen neuen Bridging-Header für meine Today Extension erstellt und der Fehler ist verschwunden.

Fischer
quelle
Klingt nicht nach dem gleichen Problem, das ich habe. Ich habe keine Today-Erweiterung. In meinem Fall verwende ich einen Bridging-Header für die App, und das Parse-Framework ist in den App-Abhängigkeiten enthalten. Der Fehler tritt auch bei anderen Frameworks auf, nicht nur bei Parse.
Dia Kharrat
2

Mein Framework funktionierte vorher und hörte plötzlich auf zu arbeiten, und keine dieser Antworten funktionierte für mich. Ich habe das Framework unter Build-Phasen> Binär mit Bibliotheken verknüpfen entfernt und erneut hinzugefügt. Wieder angefangen zu arbeiten.

James
quelle
2

Ich hatte ein Problem und habe es behoben, nachdem ich 2 Stunden damit verbracht hatte, es zu finden. Meine Umgebung wie folgt:

Cocoapod 0.39.0

schnell 2.x.

XCode 7.3.1

Schritte:

  1. Projektpfad: Projektname / Projektname / your_bridging_header.h
  2. Im Abschnitt "Swift" unter "Build-Einstellung" sollte der Objective-C-Bridging-Header wie folgt lauten: project_name / your_bridging_header.h
  3. Ändern Sie in your_bridging_header.h alle Deklarationen von .h in #import
  4. In der Klasse, die verwendet wird your_3rd_party . Deklarieren Sie den Import Ihrer_3rd_party
Binh Le
quelle
Ihre Antwort ist korrekt. Fügen Sie einfach die Antwort @jamesthakid im dritten Punkt hinzu, um sie klarer zu machen. Arbeitete für mich danke.
NaXir
5
Was genau meinst du mit "Alle Deklarationen von .h in #import ändern"?
Chris Gunawardena
1

Ich hatte gerade ein vorhandenes Schema dupliziert und dem Projekt eine weitere Konfiguration hinzugefügt. Ich musste dem Projekt des Frameworks eine Konfiguration mit demselben Namen hinzufügen, damit es auch im selben DerivedData/($AppName)/Build/Products/($CONFIGURATION_NAME)Ordner erstellt werden konnte. Andernfalls wird die .framework-Datei nicht erstellt und kann daher nicht importiert werden.

iMaddin
quelle
1

Ich bin heute auf dasselbe Problem gestoßen, als ich versuchte, einen in Objective-C geschriebenen Pod in meinem Swift-Projekt zu verwenden. Keine der oben genannten Lösungen schien zu funktionieren.

In der Poddatei hatte ich use_frameworks!geschrieben. Das Kommentieren dieser Zeile und das pod installerneute Ausführen dieses Problems lösten dieses Problem für mich und der Fehler verschwand.

Rikh
quelle
1

(Aktualisiert am 27. Mai 2017)

Xcode 8. Swift Project - Importieren von Ziel C.

Sachen zu wissen:

  1. Die Bridging-Header-Datei MUSS im Projektordner gespeichert werden. (dh nicht auf derselben Ebene gespeichert, auf der .xcodeproj gespeichert ist, sondern eine Ebene weiter unten in den Ordnern, in denen alle Ihre schnellen und objektiven c-Dateien gespeichert sind). Es kann die Datei immer noch auf der obersten Ebene finden, aber es wird nicht korrekt verknüpft und kann Objective C-Dateien in die Bridging-Header-Datei importieren
  2. Bridging-Header-Datei kann beliebig benannt werden, solange es sich um eine .h-Header-Datei handelt
  3. Stellen Sie sicher, dass der Pfad unter Build-Einstellungen> Swift Compiler - Allgemein> Ziel C Bridging-Header korrekt auf die von Ihnen erstellte Bridging-Header-Datei verweist
  4. WICHTIG: Wenn Sie immer noch "nicht gefunden" werden, versuchen Sie zunächst, Ihre Bridging-Header-Datei zu leeren und alle Importe zu löschen, die Sie derzeit dort geschrieben haben. Stellen Sie sicher, dass die Bridging-Header-Datei zuerst gefunden wird, und fügen Sie dann dieser Datei objektive c-Importe hinzu. Aus irgendeinem Grund wird derselbe Fehler "nicht gefunden" zurückgeworfen, selbst wenn er gefunden wird, aber der Import, den Sie aus irgendeinem Grund versuchen, gefällt ihm nicht
  5. Sie sollten "MyBridgingHeaderFile.h" nicht in eine Ihrer Ziel-C-Dateien importieren. Dies führt auch zu einem Fehler "Datei nicht gefunden"
BennyTheNerd
quelle
1
Alle diese Punkte werden überprüft und haben immer noch das gleiche Problem :( Weitere Punkte sollten berücksichtigt werden?
Amjad Husseini
@AmjadHusseini Versuchen Sie, Ihre Projektdateien zu bereinigen, löschen Sie die abgeleiteten Daten Ihres Projekts und starten Sie xCode neu. das hat bei mir funktioniert
Mohammad Allam
0

Ich hatte ein ähnliches Problem und nur eine Lösung hat für mich funktioniert. Ich habe alles versucht, was vorgeschlagen wurde, und ich wusste, dass ich meinen Bridging-Header in Ordnung gesetzt habe, weil ich eine andere Bibliothek hatte, die funktionierte.

Wenn ich die Bibliothek (Drag & Drop) ohne Cocoapods in das Projekt kopierte, konnte ich erst danach Header ohne Fehler importieren.

Ich habe die Facebook / Shimmer-Bibliothek benutzt.

nja
quelle
0

Ich hatte ein ähnliches Problem mit Pods. Grundsätzlich versuchte Xcode, meine UI-Tests auszuführen, und beschwerte sich über fehlende Pods. Die Lösung hierfür war viel einfacher als die oben beschriebenen:

  1. gehe zur Projektdatei (Haupt kein Ziel)
  2. Klicken Sie auf die Registerkarte "Info" (ganz links)
  3. Festlegen der richtigen Pod-Konfiguration für das UI-Testziel (Abschnitt "Konfigurationen" direkt unter "Bereitstellungsziel")

Arbeiten!

Ich habe es in einem Thread gefunden: https://github.com/CocoaPods/CocoaPods/issues/2695

Klingt ein bisschen wie ein Fehler für Kakaofrüchte, aber ich kann Gründe sehen, warum es ein schwieriger Fall sein könnte.

Julian Król
quelle
0

In meinem Fall musste ich nur den Simulator verlassen ...

Michal Shatz
quelle
0

Projekt bereinigen, Build-Ordner bereinigen, Xcode neu starten. Ich entferne einfach den Pfad unter Projekt gehe zu> Build-Einstellungen> Suche nach dem Schlüsselwort. Swift Compiler - Allgemein -> Objective-C Bridging-Header hat bei mir funktioniert.

Madavaram Ramesh
quelle
0

August 2019

In meinem Fall wollte ich ein Swift-Protokoll in einer Objective-C-Headerdatei verwenden, die vom selben Ziel stammt, und dafür musste ich eine Vorwärtsdeklaration des Swift-Protokolls verwenden, um es in der Objective-C-Schnittstelle zu referenzieren. Dasselbe sollte für die Verwendung einer Swift-Klasse in einer Objective-C-Headerdatei gelten. Informationen zur Verwendung der Vorwärtsdeklaration finden Sie im folgenden Beispiel in den Dokumenten unter Einschließen von Swift-Klassen in Objective-C-Headern mit Vorwärtsdeklarationen :

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

@interface MyObjcClass : NSObject
- (MySwiftClass *)returnSwiftClassInstance;
- (id <MySwiftProtocol>)returnInstanceAdoptingSwiftProtocol;
// ...
@end
ronatory
quelle