Otrzymywanie komunikatu „nie znaleziono pliku” w nagłówku Bridging podczas importowania struktur Objective-C do projektu Swift

96

Mam projekt Swift, dla którego próbuję zaimportować platformy oparte na ObjC. Struktura znajduje się w katalogu pod ścieżką projektu i odwołuje się do niej projekt w Xcode. Jest również dodawany do „Połącz pliki binarne z bibliotekami” na stronie „Fazy kompilacji” projektu.

Jednak z jakiegoś powodu nie mogę uwzględnić struktury w pliku Bridging-Header. Otrzymuję następujący błąd:

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'

Rzeczy, które sprawdziłem:

  1. Opcja „Instaluj nagłówek zgodności Objective-C” jest ustawiona na „TAK”.
  2. Ścieżki wyszukiwania nagłówków obejmują ścieżkę do struktur.

Jestem pewien, że czegoś mi brakuje, więc jeśli ktoś ma jakieś wskazówki, byłoby świetnie.

Dia Kharrat
źródło
3
zapomniałem wstawić ścieżkę do biblioteki Header Search Paths, w tym przypadku pomogło pytanie: D
Aishwat Singh

Odpowiedzi:

78

Znalazłem rozwiązanie:

  • Ustawienie „Nagłówek pomostowy celu-C” (aka SWIFT_OBJC_BRIDGING_HEADER) musi być ustawione na poziomie celu, a NIE na poziomie projektu. Pamiętaj, aby usunąć wartość ustawienia na poziomie projektu.

(dla mnie wygląda to na błąd Xcode, ponieważ nie wiem, dlaczego to naprawia).

Dia Kharrat
źródło
1
To naprawdę dziwne, miałem ten sam błąd i okazuje się, że miałem zdefiniowany nagłówek na poziomie projektu. Mimo że zdefiniowałem go już na poziomie docelowym, musiałem usunąć go z poziomu projektu, aby umożliwić dodawanie struktur innych firm. Wygląda na to, że jest to błąd Xcode.
Jojodmo,
2
@MarcoAlmeida, jeśli masz cel testów, spróbuj usunąć z niego ustawienie „Nagłówek mostkowania celu-C”. Powinno pomóc.
Davlat Mirmanov
3
Nie do wiary. Dziękuję Ci.
Darren
1
No hej! Mam tutaj ten sam problem :( Chociaż nie można go rozwiązać opisaną powyżej metodą ...
Mike K
1
To działało dla mnie w Xcode 9.2. Wciąż nie naprawiono po tylu latach ...
Oliver Eichhorn
58

Mam ten sam problem. Zmieniłem wszystkie moje importu od #import "HMSegmentedControl.h"do #import <HMSegmentedControl/HMSegmentedControl.h>na przykład.

jamesthakid
źródło
7
Jest to konieczne do pracy z cocoapods. W nagłówku Bridging nigdy nie importuj poda jako użytkownika #import "abc.h" #import <abc / abc.h> Kciuki w górę.
NaXir
1
Jesteś bogiem! Wielkie dzięki za to.
Alper
W moim przypadku przekonwertowałem #import <ios-qr-encoder / UIImage + MDQRCode.h> na #import „UIImage + MDQRCode.h” i zadziałało
Mashhadi
Jesteś królem
Itai Spector
27

Musiałem dodać mój libkatalog w ścieżkach wyszukiwania nagłówków użytkownika:

testowe ustawienia celu - ścieżka wyszukiwania nagłówka użytkownika

W moim przypadku libkatalog zawiera .a-library i kilka plików nagłówkowych. Są one zawarte w pliku nagłówkowym mostkowania. Jednak szybki kompilator ich nie znalazł. Dopiero gdy dodałem ${PROJECT_DIR}/libdo ścieżki wyszukiwania nagłówka użytkownika, zbudowałem cel testowy.

(Używam Xcode 6.2 na Mavericks 10.9.5)

Rainer Schwarze
źródło
1
Mogłem rozwiązać ten problem, dodając Pods / * do ścieżek wyszukiwania nagłówków głównego celu. Co ciekawe, nie miałem tego problemu przed dodaniem frameworków Swift jako zależności do mojego celu. Xcode 7 beta 6.
bizz84
To było dokładnie to, co zadziałało dla mnie. Mam framework zawarty w moim projekcie, który zawiera bibliotekę (.a). Musiałem utworzyć ścieżkę wyszukiwania do nagłówków biblioteki w ścieżkach wyszukiwania nagłówków użytkownika.
Chris Livdahl
Musiałem również zaimportować folder Pods / library, bardzo dziękuję!
thibaut noah
17

Napotkaliśmy ten sam komunikat o błędzie, z zupełnie inną przyczyną.

Ustawiać:

  • Cel aplikacji, cały kod Obj-C
  • Obiekt docelowy testów jednostkowych z pojedynczym szybkim przypadkiem testowym i nagłówkiem mostkującym odwołującym się do kodu aplikacji

Kiedy dodaliśmy drugi szybki przypadek testowy, po wyczyszczeniu (lub na maszynie kolegi z zespołu), zobaczyliśmy ten błąd podczas tworzenia celu testu jednostkowego.

Naprawiono to, dodając fikcyjną klasę Obj-C do celu testu jednostkowego.

Dan Jackson
źródło
5
Dziękuję Ci. To absolutnie zadziałało, mimo że nie miało absolutnie żadnego sensu.
Udało mi się później usunąć atrapę klasy Obj-C. Domyślam się, że efektem ubocznym tego rozwiązania jest utworzenie nagłówka mostkującego specyficznego dla celu testowego, co z kolei (jak podejrzewam) powoduje, że Xcode ignoruje nagłówek mostkujący aplikacji hosta.
clozach
Dodatek do powyżej: po wykonaniu czystej kompilacji zacząłem otrzymywać błąd segmentacji 11 podczas kompilacji. Po kilku próbach i błędach okazuje się, że fikcyjny plik .m musi być obecny, ale może być pusty. Szaleństwo.
clozach
Dodanie fikcyjnej klasy objc do mojego celu testowego, naprawiłem to za mnie!
neoneye
5

Jeśli używasz cocoapods, spróbuj ponownie zainstalować strąki, uruchamiając następujące polecenie.

pod install
Ankit Goel
źródło
Pomogło mi to, ponieważ niedawno utworzyłem nową konfigurację, która nie była kompilowana (ten sam plik nie został znaleziony), podczas gdy inne konfiguracje (debugowanie i wydanie) były. pod installwydaje się, że jest to wymagane dla każdej dodanej nowej konfiguracji ...
Mete
5

To jakoś załatwiło sprawę:

  • Czysty projekt
  • Wyczyść folder kompilacji
  • Uruchom ponownie Xcode
Hlung
źródło
Przyjdź z ogólnymi odpowiedziami, a nie trikami.
Nico,
Ta szczególna sztuczka typu „hit & try” wymaga znacznie mniejszego wysiłku, więc próba znalezienia innych rozwiązań nie powinna zaszkodzić. ;)
Hlung
1
Niestety, ta sztuczka typu „hit & try” jest zbyt często poprawną odpowiedzią.
Robert Schmid
5

Ten błąd pojawił się podczas instalowania z Cocoapods biblioteki CocoaImageHashing. Problem polegał na tym, że ścieżki wyszukiwania były błędne. Na poziomie docelowym, w Ustawieniach kompilacji -> Ścieżki wyszukiwania -> Ścieżki wyszukiwania nagłówków, ścieżki odpowiadały nieistniejącym folderom, na przykład „$ {PODS_ROOT} / Headers / Public / CocoaImageHashing”, gdy struktura folderów Headers / Public / nie istniała. Dodałem ścieżkę $ {PODS_ROOT} / CocoaImageHashing i błąd zniknął.

Nicoara Talpes
źródło
4

Cóż, to trochę dziwne, ale wydaje mi się, że musisz dodać zasób do fazy „Kopiuj zasoby pakietu” celu testowego, aby załadować wszystkie nagłówki z głównego celu aplikacji. W moim przypadku dodałem main.storyboardi załatwiłem błąd.

wprowadź opis obrazu tutaj

Yas T.
źródło
4

Zdarzyło mi się to po dodaniu / zmianie nazwy obecnych konfiguracji i ma to sens.

Każda konfiguracja korzysta z zestawu konfiguracji generowanego przez cocoapods, więc te rzeczy muszą się zgadzać.

Więc jeśli dodasz konfiguracje / zmienisz ich nazwy, będą one musiały używać odpowiednich zestawów konfiguracyjnych i do tego pod installwystarczy bieganie .

rgkobashi
źródło
3

Jeśli komuś pomoże.

W moim przypadku dodane pliki obj-c mają folder odniesienia (niebieskie foldery w xcode) i nagłówek nie mógł ich znaleźć. Po prostu dodałem pliki, a nie folder, z wyszukiwarki do xcode i rozwiązałem.

DaSilva
źródło
2

Miałem ten sam problem. Dla mnie powodem było to, że używałem tego samego nagłówka mostkującego zarówno dla mojej aplikacji, jak i rozszerzenia Today. Moje rozszerzenie Today nie zawiera analizy, ale ponieważ zostało zdefiniowane w nagłówku mostkującym, próbowało go znaleźć. Utworzyłem nowy nagłówek mostkujący dla mojego rozszerzenia Today i błąd zniknął.

rybak
źródło
Nie wygląda to na ten sam problem, który mam. Nie mam rozszerzenia na dziś. W moim przypadku używam nagłówka mostkowania dla aplikacji, a struktura analizy jest uwzględniona w zależnościach aplikacji. Błąd występuje również w przypadku innych platform, a nie tylko Parse.
Dia Kharrat
2

Mój framework działał wcześniej i nagle przestał działać, a żadna z tych odpowiedzi nie działała dla mnie. Usunąłem strukturę w Fazy kompilacji> Połącz plik binarny z bibliotekami i ponownie go dodałem. Znowu zaczął pracować.

James
źródło
2

Miałem problem i naprawiłem go po spędzeniu 2 godzin na szukaniu. Moje środowisko jak poniżej:

cocoapod 0,39,0

swift 2.x

XCode 7.3.1

Kroki:

  1. ścieżka projektu: nazwa_projektu / nazwa_projektu / your_bridging_header.h
  2. W sekcji Swift w ustawieniach kompilacji, nagłówek mostkowania celu-C powinien wyglądać następująco: nazwa_projektu / your_bridging_header.h
  3. W your_bridging_header.h zmień wszystkie deklaracje z .h na #import
  4. W klasie, która jest używana twoja_3rd_party . Zadeklaruj import your_3rd_party
Binh Le
źródło
Twoja odpowiedź jest poprawna, po prostu dodaj odpowiedź @jamesthakid w trzecim punkcie, aby była bardziej zrozumiała. Pracował dla mnie dzięki.
NaXir
5
Co dokładnie masz na myśli, mówiąc „zmień wszystkie deklaracje z .h na #import”?
Chris Gunawardena
1

Właśnie zduplikowałem istniejący schemat i dodałem kolejną konfigurację do projektu. Musiałem dodać konfigurację o tej samej nazwie do projektu frameworka, aby można było również budować w tym samym DerivedData/($AppName)/Build/Products/($CONFIGURATION_NAME)folderze. W przeciwnym razie plik .framework nie zostanie utworzony i dlatego nie można go zaimportować.

iMaddin
źródło
1

Napotkałem ten sam problem dzisiaj, kiedy próbowałem użyć kapsuły napisanej w Objective-C w moim projekcie Swift, żadne z powyższych rozwiązań nie wydawało się działać.

W podfile, który use_frameworks!napisałem. Skomentowanie tej linii i pod installponowne uruchomienie rozwiązało ten problem i błąd zniknął.

Rikh
źródło
1

(Zaktualizowano 27 maja 2017 r.)

Xcode 8. Swift Project - importowanie celu C.

Rzeczy, które warto wiedzieć:

  1. Plik nagłówkowy Bridging MUSI być zapisany w folderze projektu. (tj. nie jest zapisywany na tym samym poziomie, na którym zapisywany jest plik .xcodeproj, ale zamiast tego o jeden poziom niżej w folderach, w których zapisywane są wszystkie szybkie i obiektywne pliki c). Nadal może znaleźć plik na najwyższym poziomie, ale nie będzie poprawnie łączył i nie będzie mógł importować plików celu C do pliku nagłówkowego mostkowania
  2. Plik nagłówkowy mostkowania można nazwać dowolnie, o ile jest to plik nagłówkowy .h
  3. Upewnij się, że ścieżka w Ustawieniach kompilacji> Swift Compiler - General> Objective C Bridging Header prawidłowo wskazuje na utworzony przez Ciebie plik nagłówka mostkowania
  4. WAŻNE: jeśli nadal otrzymujesz komunikat „nie znaleziono”, spróbuj najpierw opróżnić plik nagłówka mostkowania i usunąć wszystkie importy, które aktualnie tam zapisałeś. Upewnij się, że plik nagłówkowy mostkowania można znaleźć jako pierwszy, a następnie zacznij dodawać import z celu c do tego pliku. Z jakiegoś powodu usunie ten sam błąd „nie znaleziono”, nawet jeśli zostanie znaleziony, ale z jakiegoś powodu nie podoba mu się import
  5. Nie należy #importować „MyBridgingHeaderFile.h” w żadnym z docelowych plików C. Spowoduje to również błąd „Nie znaleziono pliku”
BennyTheNerd
źródło
1
Wszystkie te punkty są sprawdzone i nadal mają ten sam problem :( Czy należy wziąć pod uwagę dalsze punkty?
Amjad Husseini
@AmjadHusseini spróbuj wyczyścić pliki projektu, a następnie wyczyść dane pochodne projektu, a następnie uruchom ponownie xCode. to zadziałało ze mną
Mohammad Allam
0

Miałem podobny problem i tylko jedno rozwiązanie się udało. Wypróbowałem wszystko, co zasugerowałem i wiedziałem, że ustawiłem mój nagłówek mostkujący w porządku, ponieważ działała inna biblioteka.

Kiedy skopiowałem bibliotekę (przeciągnij i upuść) do projektu, bez Cocoapods, dopiero potem mogłem importować nagłówki bez błędów.

Korzystałem z biblioteki facebook / Shimmer.

nja
źródło
0

Miałem podobny problem z strąkami. Zasadniczo próbując uruchomić testy interfejsu użytkownika, Xcode narzekał na brakujące pody. Rozwiązanie tego problemu było znacznie prostsze niż jakiekolwiek opisane powyżej:

  1. przejdź do pliku projektu (główny, a nie docelowy)
  2. kliknij kartę „Informacje” (najbardziej po lewej)
  3. ustawić odpowiednią konfigurację pod dla celu testów interfejsu użytkownika (sekcja „Konfiguracje” w sekcji „Cel wdrożenia”)

Pracujący!

Znalazłem to w wątku: https://github.com/CocoaPods/CocoaPods/issues/2695

Brzmi trochę jak błąd w strąkach kakao, ale widzę powody, dla których może to być trudny przypadek.

Julian Król
źródło
0

W moim przypadku po prostu musiałem wyjść z symulatora ...

Michał Shatz
źródło
0

Czysty projekt, czysty folder kompilacji, uruchom ponownie Xcode. po prostu usuwam ścieżkę w projekcie goto> Build Settings> Search the keyword. Swift Compiler - General -> Objective-C Bridging header dla mnie zadziałał.

Madavaram Ramesh
źródło
0

Sierpień 2019

W moim przypadku chciałem użyć protokołu Swift w pliku nagłówkowym Objective-C, który pochodzi z tego samego celu i do tego potrzebowałem użyć deklaracji przesyłania dalej protokołu Swift, aby odwołać się do niego w interfejsie Objective-C. To samo powinno dotyczyć używania klasy Swift w pliku nagłówkowym Objective-C. Aby użyć deklaracji do przodu, zobacz następujący przykład z dokumentacji w Uwzględnij klasy Swift w nagłówkach celu-C przy użyciu deklaracji do przodu :

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

@interface MyObjcClass : NSObject
- (MySwiftClass *)returnSwiftClassInstance;
- (id <MySwiftProtocol>)returnInstanceAdoptingSwiftProtocol;
// ...
@end
dumny
źródło