Objective-C çerçevelerini Swift projesine aktarırken Bridging Header'da "dosya bulunamadı"


96

ObjC tabanlı çerçeveleri içe aktarmaya çalıştığım bir Swift projem var. Çerçeve, projenin yolu altındaki bir dizinde bulunur ve Xcode'daki proje tarafından referans alınır. Ayrıca, projenin 'Derleme Aşamaları' sayfasındaki "Kitaplıklarla İkili Bağlantıya Bağla" bölümüne eklenir.

Ancak, bazı nedenlerden dolayı, çerçeveyi Bridging-Header dosyasına ekleyemiyorum. Aşağıdaki hatayı alıyorum:

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'

Kontrol ettiğim şeyler:

  1. "Install Objective-C Compatibility Header" "YES" olarak ayarlanmıştır.
  2. Başlık Arama Yolları, çerçevelerin yolunu içerir.

Eminim bir şeyleri kaçırıyorum, bu yüzden herhangi bir ipucu varsa, bu harika olur.


4
kütüphane yolunu eklemeyi unuttum Header Search Paths, bu durumda soru yardımcı oldu: D
Aishwat Singh

Yanıtlar:


77

Bir çözüm buldum:

  • "Objective-C Bridging Header" ayarı (aka SWIFT_OBJC_BRIDGING_HEADER), Proje düzeyinde DEĞİL, Hedef düzeyinde ayarlanmalıdır. Proje düzeyinde ayar değerini sildiğinizden emin olun.

(bana bir Xcode hatası gibi görünüyor, çünkü neden düzeltdiğini bilmiyorum).


1
Bu gerçekten tuhaf, aynı hatayı aldım ve görünen o ki, Proje düzeyinde tanımlanmış başlığım vardı. Hedef seviyesinde zaten tanımlamış olsam da, üçüncü taraf Çerçevelerin eklenmesine izin vermek için bunu Proje seviyesinden çıkarmak zorunda kaldım. Meydan okurcasına bir Xcode hatası gibi görünüyor.
Jojodmo

2
@MarcoAl Almeida, test hedefiniz varsa, bundan "Objective-C Bridging Header" ayarını da kaldırmayı deneyin. Yardımı olmalı.
Davlat Mirmanov

3
Inanılmaz. Teşekkür ederim.
Darren

1
Selam! Burada da aynı sorunu yaşayın :( Yukarıda açıklanan yöntemle çözülmemiş olsa da ...
Mike K

1
Bu benim için Xcode 9.2'de çalıştı. O kadar yıldan sonra hala sabit değil ...
Oliver Eichhorn

58

Bende de aynı sorun var. Ben tüm benim ithalatı değiştirdi #import "HMSegmentedControl.h"için #import <HMSegmentedControl/HMSegmentedControl.h>örneğin.


7
Cocoapod'larla çalışmak için bu gereklidir. Köprüleme üstbilgisinde asla bir kapsülü #import "abc.h" kullanıcı #import <abc / abc.h> Beğenme olarak içe aktarmayın.
NaXir

1
Sen tanrısın! Bunun için çok teşekkürler.
Alper

Benim durumumda #import <ios-qr-encoder / UIImage + MDQRCode.h> öğesini #import "UIImage + MDQRCode.h" olarak dönüştürdüm ve işe yaradı
Mashhadi

Sen kralsın
Itai Spector

27

libDizinimi Kullanıcı Başlığı Arama Yollarına eklemem gerekiyordu :

test hedefi ayarları - kullanıcı başlığı arama yolu

Benim durumumda, libdizin .a-library dosyasını ve bazı başlık dosyalarını içerir. Bunlar, köprüleme başlık dosyasına dahil edilir. Ancak, hızlı derleyici onları bulamaz. Yalnızca ${PROJECT_DIR}/libKullanıcı Başlığı Arama Yoluna eklediğimde test hedefini oluşturdu.

(Mavericks 10.9.5'te Xcode 6.2 kullanıyorum)


1
Ana hedefin Başlık Arama Yollarına Bölmeler / * ekleyerek bu sorunu çözebilirim. İlginç bir şekilde, Swift çerçevelerini bağımlılık olarak hedefime eklemeden önce bu sorunu yaşamadım. Xcode 7 beta 6.
bizz84

Bu tam olarak benim için çalıştı. Projemde kitaplık (.a) içeren bir çerçevem ​​var. Kullanıcı Başlığı Arama Yollarında kitaplık için başlıklara bir arama yolu oluşturmam gerekiyordu.
Chris Livdahl

Ayrıca Bölmeleri / kitaplık klasörünü de içe aktarmak zorunda kaldı, çok teşekkür ederim!
thibaut noah

17

Aynı hata mesajıyla tamamen farklı bir nedenle karşılaştık.

Kurmak:

  • Uygulama hedefi, tüm Obj-C kodu
  • Tek bir hızlı test senaryosu ve uygulama koduna atıfta bulunan bir köprüleme başlığına sahip Birim Test hedefi

İkinci hızlı test durumunu eklediğimizde, bir temizlikten sonra (veya bir takım arkadaşının makinesinde), birim test hedefini oluştururken bu hatayı gördük.

Birim test hedefine sahte bir Obj-C sınıfı eklenerek düzeltildi.


5
Teşekkür ederim. Bu kesinlikle hiçbir anlam ifade etmese de kesinlikle işe yaradı.

Daha sonra kukla Obj-C sınıfını sildim. Tahminimce, bu çözümün bir yan etkisi, test hedefine özgü bir köprüleme başlığının oluşturulmasıdır ve bu da (şüpheliyim) Xcode'un ana bilgisayar uygulamasının köprüleme başlığını yoksaymasına neden olur.
clozach

Yukarıdakilere ek: Temiz bir yapı yaptıktan sonra, derleme sırasında 11 segmentasyon hatası almaya başladım. Biraz deneme yanılmadan sonra, sahte .m dosyasının bulunması gerektiği anlaşılıyor, ancak boş olabilir . Delilik.
clozach

Test hedefime sahte bir objc sınıfı eklemek, benim için düzeltildi!
neoneye

5

Cocoapod kullanıyorsanız, aşağıdaki komutu çalıştırarak bölmeleri yeniden yüklemeyi deneyin.

pod install

Bu, son zamanlarda derlenmeyen yeni bir Yapılandırma oluşturduğumdan (aynı dosya sorunu bulunamadı), diğer yapılandırmalar (Hata Ayıklama ve Yayınlama) ise bana yardımcı oldu. pod installeklenen herhangi bir yeni konfigürasyon için gerekli görünüyor ...
Mete

5

Bu bir şekilde benim için hile yaptı:

  • Temiz proje
  • Derleme klasörünü temizle
  • Xcode'u yeniden başlatın

Vurup denemeyin değil genel cevaplarla gelin.
Nico

Bu özel vur ve dene hilesi çok daha az çaba gerektirir, bu yüzden başka çözümler düşünürken denemekten zarar gelmemelidir. ;)
Hlung

1
Ne yazık ki, bu özel hit ve dene hilesi çoğu zaman doğru cevaptır.
Robert Schmid

5

Bu hata, CocoaImageHashing kitaplığını Cocoapods ile yüklerken ortaya çıktı. Sorun, arama yollarının yanlış olmasıydı. Dolayısıyla, Hedef düzeyinde, Derleme Ayarları -> Arama Yolları -> Üstbilgi Arama Yolları'nda yollar, var olmayan klasörlere karşılık geliyordu, örneğin "$ {PODS_ROOT} / Başlıklar / Genel / CocoaImageHashing", Klasör yapısı Başlıklar / Genel / Var olmadı. $ {PODS_ROOT} / CocoaImageHashing yolunu ekledim ve hata ortadan kalktı.


4

Biraz garip ama sanırım ana uygulama hedefinizden tüm başlıkları yüklemesini sağlamak için test hedefinizin "Paket Kaynaklarını Kopyala" aşamasına bir kaynak eklemeniz gerekiyor. Benim durumumda ekledim main.storyboardve hatayı hallettim.

görüntü açıklamasını buraya girin


4

Bu, mevcut konfigürasyonları ekledikten / yeniden adlandırdıktan sonra başıma geldi ve mantıklı.

Her konfigürasyon, cocoapod'lar tarafından oluşturulan Konfigürasyon Setini kullanır, bu nedenle bunların eşleşmesi gerekir.

Bu nedenle, konfigürasyonları eklerseniz / yeniden adlandırırsanız, bunların doğru konfigürasyon setlerini kullanması gerekecektir ve bunun için çalıştırılacaktır pod install.


3

Eğer birine yardım ederse.

Benim durumumda obj-c dosyalarımın bir referans klasörü (xcode'daki mavi klasörler) var ve başlık onları bulamadı. Sadece bulucudan xcode'a klasörü değil dosyaları ekledim ve çözdüm.


2

Ben de aynı sorunu yaşadım. Benim için sebep, hem Uygulamam hem de Bugün Uzantım için aynı köprüleme başlığını kullanmamdı. My Today Uzantı, Parse içermiyor, ancak köprü başlığında tanımlandığı için onu aramaya çalışıyordu. Bugün Uzantım için yeni bir köprüleme başlığı oluşturdum ve hata kayboldu.


Sahip olduğum sorun gibi gelmiyor. Bugün uzantım yok. Benim durumumda, uygulama için bir köprüleme başlığı kullanıyorum ve Parse çerçevesi uygulama bağımlılıklarına dahil edildi. Hata, yalnızca Parse için değil, diğer çerçeveler için de oluşur.
Dia Kharrat

2

Çerçevem ​​daha önce çalışıyordu ve aniden çalışmayı bıraktı ve bu yanıtların hiçbiri benim için işe yaramadı. Build Phases> Link Binary With Libraries'deki çerçeveyi kaldırdım ve yeniden ekledim. Tekrar çalışmaya başladım.


2

Bulmak için 2 saat harcadıktan sonra bir sorun yaşadım ve düzelttim. Ortamım aşağıdaki gibi:

cocoapod 0.39.0

hızlı 2.x

XCode 7.3.1

Adımlar:

  1. proje yolu: proje_adı / proje_adı / köprüleme_başlığınız.h
  2. Build Setting'deki Swift bölümünde, Objective-C Bridging Header şöyle olmalıdır: project_name / your_bridging_header.h
  3. Gelen your_bridging_header.h , tüm bildirimleri değiştirmek .h için #import
  4. Sizin_3rd_party'nizin kullanıldığı sınıfta . Declare ithalat your_3rd_party

Cevabınız doğru, daha net hale getirmek için üçüncü noktaya @jamesthakid cevabını ekleyin. Benim için çalıştı teşekkürler.
NaXir

5
"Tüm bildirimleri .h'den # ithalat'a değiştir" ile tam olarak ne demek istiyorsunuz?
Chris Gunawardena

1

Mevcut bir şemayı kopyaladım ve projeye başka bir konfigürasyon ekledim. Aynı DerivedData/($AppName)/Build/Products/($CONFIGURATION_NAME)klasörde inşa edebilmesi için çerçevenin projesine aynı isimde bir konfigürasyon eklemem gerekiyordu . Aksi takdirde .framework dosyası oluşturulmaz ve bu nedenle içe aktarılamaz.


1

Bugün Swift projemde Objective-C'de yazılmış bir bölmeyi kullanmaya çalışırken aynı sorunla karşılaştım, yukarıdaki çözümlerin hiçbiri işe yaramadı.

Yazdığım pod dosyasında use_frameworks!. Bu satırı yorumlamak ve sonra pod installtekrar çalıştırmak bu sorunu benim için çözdü ve hata ortadan kalktı.


1

(27 Mayıs 2017 itibarıyla güncellendi)

Xcode 8. Swift Projesi - Hedefi içe aktarma C.

Bilinecek şeyler:

  1. Köprüleme başlık dosyası proje klasörüne KAYDEDİLMELİDİR. (yani .xcodeproj ile aynı seviyede kaydedilmez, bunun yerine tüm hızlı ve hedef c dosyalarınızın kaydedildiği klasörlere bir seviye daha aşağıda kaydedilir). Dosyayı yine de en üst düzeyde bulabilir, ancak Objective C dosyalarını doğru şekilde bağlamaz ve köprüleme başlık dosyasına aktaramaz.
  2. Köprüleme başlık dosyası, bir .h başlık dosyası olduğu sürece herhangi bir şekilde adlandırılabilir
  3. Build Settings> Swift Compiler - General> Objective C Bridging Header'daki yolun, yaptığınız köprü başlık dosyasını doğru şekilde size işaret ettiğinden emin olun.
  4. ÖNEMLİ: Hala "bulunamadı" mesajı alıyorsanız, önce köprü başlık dosyanızı boşaltmayı deneyin ve o anda orada yazdığınız tüm içe aktarmaları silmeyi deneyin. Önce köprüleme başlık dosyasının bulunabileceğinden emin olun, ardından bu dosyaya hedef c içe aktarımları eklemeye başlayın. Bazı nedenlerden dolayı, bulunsa bile aynı "bulunamadı" hatasını geri alacaktır, ancak herhangi bir nedenle denediğiniz ithalatı beğenmez
  5. Hedef C dosyalarınızın hiçbirinde "MyBridgingHeaderFile.h" dosyasını # içe aktarmamalısınız. Bu aynı zamanda "dosya bulunamadı" hatasına da neden olur

1
Tüm bu noktalar kontrol edildi ve hala aynı sorun var :( Başka noktalar dikkate alınmalı mı?
Amjad Husseini

@AmjadHusseini proje dosyalarınızı temizlemeyi deneyin, ardından projenizin türetilmiş verilerini temizleyin ve ardından xCode'u yeniden başlatın. benimle çalıştı
Mohammad Allam

0

Benzer bir problemim vardı ve benim için sadece bir çözüm işe yaradı. Önerilen her şeyi denedim ve köprüleme başlığımı iyi ayarladığımı biliyordum çünkü başka bir lib çalışmam vardı.

Cocoapods olmadan kütüphaneyi projeye kopyaladığımda (sürükle ve bırak), ancak bundan sonra başlıkları hatasız olarak içe aktarabilirdim.

Facebook / Shimmer kitaplığını kullandım.


0

Kapsüller ile benzer bir sorun yaşadım. Temel olarak UI testlerimi çalıştırmaya çalışan Xcode, eksik bölmelerden şikayet etti. Bunun çözümü, yukarıda açıklananlardan çok daha basitti:

  1. proje dosyasına git (ana hedef değil)
  2. "Bilgi" sekmesine tıklayın (en solda)
  3. UI testleri hedefi için uygun kapsül yapılandırmasını ayarlayın ("Dağıtım Hedefi" altında "Yapılandırmalar" bölümü)

Çalışma!

Bir başlıkta buldum: https://github.com/CocoaPods/CocoaPods/issues/2695

Kakao kapsülleri için biraz böcek gibi geliyor ama bunun zor olmasının nedenlerini anlayabiliyorum.



0

Temiz proje, Derleme klasörünü temizleyin, Xcode'u yeniden başlatın. ben sadece proje git> Yapı Ayarları> Anahtar kelimeyi ara kısmından yolu kaldırıyorum. Swift Compiler - Genel -> Objective-C Bridging başlığı benim için çalıştı.


0

Ağustos 2019

Benim durumumda, aynı hedeften gelen bir Objective-C başlık dosyasında bir Swift protokolü kullanmak istedim ve bunun için, Objective-C arayüzünde referans vermek için Swift protokolünün ileri bildirimini kullanmam gerekiyordu . Aynı şey, bir Objective-C başlık dosyasında Swift sınıfı kullanmak için de geçerli olmalıdır. İleri beyanı aşağıdaki örneğe bakın kullanmak için docs at İleri Beyannameleri'ni kullanarak Objective-C Başlıklardaki Swift Sınıfları Dahil :

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

@interface MyObjcClass : NSObject
- (MySwiftClass *)returnSwiftClassInstance;
- (id <MySwiftProtocol>)returnInstanceAdoptingSwiftProtocol;
// ...
@end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.