Получение сообщения «файл не найден» в заголовке моста при импорте фреймворков Objective-C в проект Swift

96

У меня есть проект Swift, для которого я пытаюсь импортировать фреймворки на основе ObjC. Фреймворк находится в каталоге по пути к проекту и на него ссылается проект в Xcode. Он также добавлен в раздел «Связать двоичный файл с библиотеками» на странице проекта «Фазы сборки».

Однако по какой-то причине я не могу включить фреймворк в файл Bridging-Header. Я получаю следующую ошибку:

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'

Что я проверил:

  1. «Заголовок совместимости Install Objective-C» установлен на «YES».
  2. Пути поиска заголовков включают путь к фреймворкам.

Я уверен, что что-то упустил, так что, если у кого-то есть какие-то подсказки, было бы здорово.

Диа Харрат
источник
3
Я забыл Header Search Paths
указать

Ответы:

78

Нашел решение:

  • Параметр «Objective-C Bridging Header» (он же SWIFT_OBJC_BRIDGING_HEADER) должен быть установлен на целевом уровне, а НЕ на уровне проекта. Обязательно удалите значение настройки на уровне проекта.

(мне это кажется ошибкой Xcode, так как я не знаю, почему он ее исправляет).

Диа Харрат
источник
1
Это действительно странно, у меня была такая же ошибка, и оказалось, что у меня был заголовок, определенный на уровне проекта. Несмотря на то, что я уже определил его на уровне Target, мне пришлось удалить его с уровня Project, чтобы можно было добавлять сторонние Framework. Вызывающе кажется, что это ошибка Xcode.
Jojodmo
2
@MarcoAlmeida, если у вас есть цель для тестов, попробуйте удалить и из нее параметр "Objective-C Bridging Header". Это должно помочь.
Давлат Мирманов
3
Невероятно. Спасибо.
Даррен
1
Привет всем! Есть такая же проблема здесь :( Хотя она не решается описанным выше методом ...
Майк К.
1
Это сработало для меня в Xcode 9.2. Все еще не исправлено после стольких лет ...
Оливер Эйххорн
58

У меня такая же проблема. Например, я изменил весь свой импорт с #import "HMSegmentedControl.h"на #import <HMSegmentedControl/HMSegmentedControl.h>.

Jamesthakid
источник
7
Для работы с коконодами это необходимо. В заголовке Bridging никогда не импортируйте модуль как #import "abc.h" пользователь #import <abc / abc.h> Не нравится.
NaXir
1
Ты бог! Большое спасибо за это.
Alper
В моем случае я преобразовал #import <ios-qr-encoder / UIImage + MDQRCode.h> в #import «UIImage + MDQRCode.h», и это сработало
Машхади
Ты король
Итаи Спектор
27

Мне пришлось добавить свой libкаталог в Пути поиска заголовков пользователей:

настройки тестовой цели - путь поиска заголовка пользователя

В моем случае libкаталог содержит .aфайл -library и несколько файлов заголовков. Они включены в файл заголовка моста. Однако быстрый компилятор их не нашел. Только когда я добавил ${PROJECT_DIR}/libв путь поиска заголовка пользователя, он создал тестовую цель.

(Я использую Xcode 6.2 на Mavericks 10.9.5)

Райнер Шварце
источник
1
Я мог бы решить эту проблему, добавив Pods / * в пути поиска заголовков основной цели. Интересно, что у меня не было этой проблемы до добавления фреймворков Swift в качестве зависимостей для моей цели. Xcode 7 beta 6.
bizz84
Именно это сработало для меня. У меня есть фреймворк, включенный в мой проект, который содержит библиотеку (.a). Мне пришлось создать путь поиска к заголовкам библиотеки в Пути поиска заголовков пользователя.
Chris Livdahl
Также пришлось импортировать папку Pods / library, большое спасибо!
thibaut noah
17

Мы столкнулись с тем же сообщением об ошибке, но с совершенно другой причиной.

Настроить:

  • Цель приложения, весь код Obj-C
  • Целевой объект Unit Test с одним быстрым тестом и заголовком моста, относящимся к коду приложения

Когда мы добавили второй быстрый тестовый пример после очистки (или на машине товарища по команде), мы увидели эту ошибку при построении цели модульного теста.

Это было исправлено путем добавления фиктивного класса Obj-C к цели модульного теста.

Дэн Джексон
источник
5
Спасибо. Это абсолютно сработало, хотя в этом нет никакого смысла.
Впоследствии я смог удалить фиктивный класс Obj-C. Я предполагаю, что побочным эффектом этого решения является создание заголовка моста, специфичного для тестовой цели, который, в свою очередь (я подозреваю), заставляет Xcode игнорировать заголовок моста хост-приложения.
clozach
Дополнение к вышесказанному: после выполнения чистой сборки я начал получать ошибку сегментации 11 во время компиляции. После некоторых проб и ошибок выяснилось, что фиктивный файл .m должен присутствовать, но он может быть пустым. Безумие.
Clozach
Добавление фиктивного класса objc к моей тестовой цели исправлено для меня!
neoneye
5

Если вы используете cocoapods, попробуйте переустановить модули, выполнив следующую команду.

pod install
Анкит Гоэль
источник
Это помогло мне, поскольку я недавно создал новую конфигурацию, которая не компилировалась (проблема с тем же файлом не найдена), в то время как другие конфигурации (отладка и выпуск) были. pod installкажется, требуется для добавления любых новых конфигураций ...
Mete
5

Это как-то помогло мне:

  • Чистый проект
  • Папка чистой сборки
  • Перезапустить Xcode
Hlung
источник
Приходите с общими ответами, а не хитростями.
Нико
Этот конкретный трюк требует гораздо меньше усилий, поэтому не повредит попробовать, пока вы думаете о других решениях. ;)
Hlung
1
К сожалению, именно этот хитрый трюк слишком часто оказывается правильным ответом.
Роберт Шмид
5

Эта ошибка появилась при установке с Cocoapods библиотеки CocoaImageHashing. Проблема заключалась в том, что пути поиска были неправильными. Таким образом, на целевом уровне в настройках сборки -> Пути поиска -> Пути поиска заголовков, пути соответствовали несуществующим папкам, например "$ {PODS_ROOT} / Headers / Public / CocoaImageHashing", когда структура папок Headers / Public / не существует. Я добавил путь $ {PODS_ROOT} / CocoaImageHashing и ошибка исчезла.

Никоара Тальпес
источник
4

Что ж, это немного странно, но я думаю, вам нужно добавить ресурс на фазу «Копировать ресурсы пакета» вашей тестовой цели, чтобы он загружал все заголовки из вашего основного целевого приложения. В моем случае я добавил, main.storyboardи он позаботился об ошибке.

введите описание изображения здесь

Яс Т.
источник
4

Это случилось со мной после добавления / переименования текущих конфигураций, и это имеет смысл.

Каждая конфигурация использует набор конфигураций, созданный cocoapods, поэтому эти вещи должны совпадать.

Поэтому, если вы добавляете / переименовываете конфигурации, они должны будут использовать правильные наборы конфигурации, и для этого запуск pod installбудет делать это.

ргкобаши
источник
3

Если кому-то поможет.

В моем случае мои файлы obj-c были добавлены в справочную папку (синие папки в xcode), и заголовок не смог их найти. Просто добавил файлы, а не папку из искателя в xcode и решил.

DaSilva
источник
2

У меня такая же проблема. Для меня причина заключалась в том, что я использовал один и тот же заголовок-мост как для моего приложения, так и для моего сегодняшнего расширения. My Today Extension не включает синтаксический анализ, но поскольку он был определен в заголовке моста, он пытался его найти. Я создал новый мостовой заголовок для своего расширения Today Extension, и ошибка исчезла.

рыболов
источник
Не похоже на ту же проблему, что и у меня. У меня нет расширения "Сегодня". В моем случае я использую заголовок моста для приложения, а структура Parse включена в зависимости приложения. Ошибка также возникает для других фреймворков, а не только для Parse.
Диа Харрат
2

Моя структура работала раньше и внезапно перестала работать, и ни один из этих ответов не работал у меня. Я удалил фреймворк в Build Phases> Link Binary With Libraries и снова добавил его. Снова заработал.

Джеймс
источник
2

У меня была проблема, и я решил ее, потратив 2 часа на поиск. Моя среда, как показано ниже:

коконожа 0,39,0

быстрый 2.x

XCode 7.3.1

Шаги:

  1. путь к проекту: имя_проекта / имя_проекта / your_bridging_header.h
  2. В разделе Swift в настройках сборки заголовок моста Objective-C должен быть: имя_проекта / your_bridging_header.h
  3. В your_bridging_header.h измените все объявления с .h на #import
  4. В классе, который используется your_3rd_party . Declare импорт your_3rd_party
Бинь Ле
источник
Ваш ответ правильный, просто добавьте ответ @jamesthakid в третьем пункте, чтобы было более понятно. У меня сработало спасибо.
NaXir
5
Что именно вы имеете в виду, говоря «изменить все объявления с .h на #import»?
Крис Гунавардена
1

Я только что продублировал существующую схему и добавил в проект другую конфигурацию. Мне пришлось добавить конфигурацию с тем же именем в проект фреймворка, чтобы он также располагался в той же DerivedData/($AppName)/Build/Products/($CONFIGURATION_NAME)папке. В противном случае файл .framework не будет создан и, следовательно, не может быть импортирован.

iMaddin
источник
1

Сегодня я столкнулся с той же проблемой, когда пытался использовать модуль, написанный на Objective-C, в моем проекте Swift, ни одно из вышеперечисленных решений, похоже, не сработало.

В подфиле я use_frameworks!написал. Комментируя эту строку, а затем pod installснова запустив ее, я решил эту проблему, и ошибка исчезла.

Рих
источник
1

(Обновлено 27 мая 2017 г.)

Xcode 8. Swift Project - импорт Objective C.

Что нужно знать:

  1. Файл заголовка моста ДОЛЖЕН быть сохранен в папке проекта. (т.е. не сохраняется на том же уровне, что и .xcodeproj, а вместо этого на один уровень ниже в папки, где сохраняются все ваши быстрые и объективные файлы c). Он все еще может найти файл на верхнем уровне, но он не будет правильно связывать и не сможет импортировать файлы Objective C в файл заголовка моста.
  2. Заголовочный файл моста может называться как угодно, если это заголовочный файл .h
  3. Убедитесь, что путь в разделе «Параметры сборки»> «Компилятор Swift - Общие»> «Заголовок моста для цели C» правильно указывает на созданный вами файл заголовка моста.
  4. ВАЖНО: если вы по-прежнему получаете сообщение «не найден», попробуйте сначала очистить файл заголовка моста и стереть все импортированные данные, которые вы в данный момент там написали. Убедитесь, что сначала можно найти файл заголовка моста, а затем начните добавлять в этот файл импорт объекта c. По какой-то причине он вернет ту же ошибку «не найден», даже если она будет обнаружена, но ему не нравится импорт, который вы пытаетесь по какой-то причине
  5. Вы не должны # импортировать "MyBridgingHeaderFile.h" ни в один из ваших целевых файлов C. Это также вызовет ошибку «файл не найден».
BennyTheNerd
источник
1
Все эти пункты проверены, и по-прежнему возникают те же проблемы :( Какие-либо дополнительные моменты следует принять во внимание?
Амджад Хусейни
@AmjadHusseini попробуйте очистить файлы вашего проекта, затем очистите производные данные вашего проекта, а затем перезапустите xCode. это сработало со мной
Мохаммад Аллам
0

У меня была аналогичная проблема, и для меня сработало только одно решение. Я пробовал все, что предлагалось, и знал, что правильно настроил заголовок моста, потому что у меня работала какая-то другая библиотека.

Когда я копировал библиотеку (перетаскивая) в проект, без Cocoapods, только после этого я мог импортировать заголовки без ошибок.

Я использовал библиотеку facebook / Shimmer.

ня
источник
0

У меня была аналогичная проблема со стручками. В основном, пытаясь запустить мои тесты пользовательского интерфейса, Xcode жаловался на отсутствие модулей. Решение было намного проще, чем любое из описанных выше:

  1. перейти в файл проекта (основной, а не целевой)
  2. щелкните вкладку «Информация» (крайняя слева)
  3. установить правильную конфигурацию модуля для целевого объекта тестов пользовательского интерфейса (раздел «Конфигурации» прямо под «Целевым объектом развертывания»)

Работает!

Нашел в ветке: https://github.com/CocoaPods/CocoaPods/issues/2695

Звучит немного как ошибка для стручков какао, но я вижу причины, по которым это может быть непростой случай.

Юлиан Крол
источник
0

В моем случае мне просто пришлось выйти из симулятора ...

Михал Шац
источник
0

Очистить проект, очистить папку сборки, перезапустить Xcode. Я просто удаляю путь в проекте goto> Настройки сборки> Поиск по ключевому слову. Swift Compiler - General -> Objective-C Bridging header работал у меня.

Мадаварам Рамеш
источник
0

Август 2019 г.

В моем случае я хотел использовать протокол Swift в файле заголовка Objective-C, который исходит от той же цели, и для этого мне нужно было использовать предварительное объявление протокола Swift, чтобы ссылаться на него в интерфейсе Objective-C. То же самое должно быть справедливо для использования класса Swift в файле заголовка Objective-C. Чтобы использовать предварительное объявление, см. Следующий пример из документации в разделе « Включить классы Swift в заголовки Objective-C с использованием прямых объявлений» :

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

@interface MyObjcClass : NSObject
- (MySwiftClass *)returnSwiftClassInstance;
- (id <MySwiftProtocol>)returnInstanceAdoptingSwiftProtocol;
// ...
@end
снисходительный
источник