Проблема с импортом Swift Bridging Header


123

Следуя инструкциям, я создал заголовок моста и добавил в свой проект. К сожалению, произошла следующая ошибка:

: 0: ошибка: не удалось импортировать заголовок Objective-C '--- путь - к --- заголовку / .... h'

Скриншот 1

В настройках сборки я добавил строку пути поиска заголовка к месту расположения заголовка моста, но ничего не помогло.

Кто-нибудь сталкивался с этой проблемой?


Вы могли бы лучше, чем добавлять файл заголовка самостоятельно. Используйте New File .., чтобы добавить новый пустой файл Objective-c .m. Это заставит xcode предложить вам файл заголовка-моста, в который вы можете добавить свой импорт. Затем вы можете удалить только что добавленный файл .m
markhunte

Ага, я, конечно, тоже пробовал, но ничего не помогло
Никита Прончик

Это новый проект или тот же, который вы делали вручную?
markhunte

Это новый проект, я добавил обертку поддержки Keychain, которую я однажды написал на OBJC
Никита Прончик

Сожалею. Не уверен, что вы имеете в виду под добавленной оболочкой поддержки Keychain. Но я заметил, что вы работаете на iOS, вы получаете то же самое с проектом OSX, который я использовал,
Маркхунте

Ответы:


153

Будьте осторожны, чтобы добавить файл в папку, в которой возникает ошибка! Я совершил ту же ошибку, если вы создадите файл из Xcode, он попадет в папку: Project-> Project-> Header.h

И Xcode ищет Project-> Header.h

Это означает, что вам нужно поместить файл в папку вашего проекта (ProjectName-> ProjectNameFolder)!

Надеюсь, это поможет ;)

ОБНОВЛЕНО: Я не уверен, что понял, что вы имеете в виду, но попробуйте следующее, чтобы решить вашу проблему:
1. Удалите все ваши файлы моста, которые вы создали до сих пор.
2. Выберите основную папку проекта и нажмите новый файл-> iOS-> Заголовочный файл.
3. Запишите свой импорт в созданный файл заголовка.
4. Выберите проект внутри Xcode-> Build Settings, введите в поле поиска: bridging и введите в ключ SWIFT_OBJC_BRIDGING_HEADER имя вашего файла заголовка или путь к нему!

Если вы выполните эти шаги, ваш заголовочный файл будет создан в правильном месте!

: D Надеюсь, что это поможет!


Ну, я только что попробовал этот метод, заголовок действительно виден, но, к сожалению, классы моста Obj-C все еще невидимы (после включения их в заголовок моста)
Никита Прончик

11
Сначала ответ гласит: «Нужно поместить файл на тот же уровень xcodeproj», в конце он говорит: «Убедитесь, что файл ... не на том же уровне xcodeproj». Зачем?
Boon

3
Я имел в виду, что файл должен находиться внутри подпапки проекта, а не на том же уровне, что и xcodeproj. Пример: в папке вашего проекта у вас есть project.xcodeproj и projecttests. Файл должен находиться в папке проекта :)
Ренан Косицки

5
Я все перепробовал, но у меня ничего не работает. Это очень раздражает. Я работаю с xcode 8 и swift 3. Вы можете мне помочь?
Хардик Шах

1
Я смущен тем, что вы говорите: «Это означает, что вам нужно разместить файл на том же уровне, что и xcodeproj!» но после того, как вы сказали: «Убедитесь, что файл находится внутри основной папки проекта не на том же уровне xcodeproj!» Который из них?
bakalolo

68

В моем случае это была ошибка из-за циклической ссылки. У меня был класс, импортированный в заголовке моста, и файл заголовка этого класса импортировал swift header ( <MODULE_NAME>-Swift.h). Я делал это потому, что в заголовочном файле Obj-C мне нужно было использовать класс, объявленный в Swift, решение заключалось в простом использовании @classдекларативного.

Таким образом, в основном ошибка говорила «Не удалось импортировать заголовок моста», ошибка выше говорила, что <MODULE_NAME>-Swift.hфайл не найден, выше это была ошибка, указывающая на конкретный файл заголовка Obj-C (а именно, контроллер представления).

Изучая этот файл, я заметил, что внутри заголовка был объявлен -Swift.h. Перемещение этого импорта в реализацию разрешило проблему. Итак, мне нужно было использовать объект, позвольте назвать его MyObjectопределенным в Swift, поэтому я просто изменил заголовок, чтобы сказать

@class MyObject;

1
Это глупо, но у меня тоже сработало перемещение его в файл реализации. К сожалению, мне это нужно в заголовке, потому что мой класс реализует делегат, определенный в быстром файле. Но поскольку obj-c не волнует, действительно ли мой класс реализует делегат, когда я его передаю, я соглашусь с этим. Но в идеале был бы другой способ
Орен

Возможно, вам также придется проверить импорт того, который вы вводите в заголовок моста. Если какой-либо из этих импортированных классов имеет ссылку на файл «-Swift.h», вам придется переместить объявление в .m.
Kyle Carruthers

30

Найдите путь по адресу:

Параметры сборки / Компилятор Swift - Генерация кода / Заголовок моста Objective-C

и удалите этот файл. Тогда все будет в порядке.


2
Ты победил. Я потратил на это столько времени. Просто и эффективно. Xcode делает что-то странное с этим путем, например, за кулисами добавляет его в $ (SRCROOT). Я думаю, что наличие свободного места на моем пути могло быть частью проблемы, но это была серебряная пуля.
jday

1
как удалить этот файл?
Джеки Ван

7
В Xcode 8 - вместо «Генерация кода» это в Swift Compiler - Общие.
Vivek Bansal

Спасибо, что спасли меня ... Большое спасибо
Виджай Ратод

18

Это, вероятно, повлияет только на небольшой процент людей, но в моем случае мой проект использовал CocoaPods, и один из этих модулей имел вспомогательную спецификацию с собственными CocoaPods. Решением было использовать импорт под полным углом для ссылки на любые файлы в под-модулях.

#import <HexColors/HexColor.h>

Скорее, чем

#import "HexColor.h"

2
Какая разница?
Даниэль Гомес Рико

Это было проблемой для меня. Я получил ошибки «Не удалось импортировать заголовок моста» и «Не удалось найти XYZ.h». Внесение этого изменения решило эту проблему для меня в Xcode 6.4 и Swift 1.2.
Entalpi

1
@danielgomezrico Один оператор указывает на файл в подкаталоге. Другой указывает на несуществующий файл.
Кейси Мюррей,

Решением этой ошибки для меня при использовании CocoaPods было просто повторное выполнение pod install после создания новой конфигурации.
пишущая машинка

16

Для меня удаление производных данных исправило это, я заметил, что даже если я выхожу из старого коммита, возникает та же проблема.

Вы можете получить доступ к этой опции из Window-> Projects.


9

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

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


Это может помочь, если вы только добавили его в настройки сборки проекта.
zekel

9

«нам нужно указать Xcode, где искать файлы заголовков, которые мы перечисляем в нашем связующем заголовке . Найдите раздел« Пути поиска »и измените настройку уровня проекта для путей поиска заголовков пользователей , добавив рекурсивную запись для« Pods » каталог: Pods / ** " http://swiftalicio.us/2014/11/using-cocoapods-from-swift/


6

Я тоже столкнулся с этой проблемой, и, к сожалению, это просто ошибка в SDK + Xcode. Я поговорил с инженером из WWDC об этой и нескольких других проблемах, которые у меня были с CloudKit. Эти ошибки будут устранены в следующем семени Xcode.

Это самое интересное в использовании бета-версии программного обеспечения.


1
Да, это расстраивает. Моя команда и я работали, пытаясь выяснить проблему NSURL с CloudKit, и мы не могли понять, почему мы получаем ошибки, оказалось, что это проблема на стороне сервера от Apple. мы даже ничего не могли сделать. потратил столько времени зря. ха - ха.
douglas bumby

5
Проблема действительно может быть решена путем размещения заголовка в правильном месте. Что сработало для меня, так это вызов заголовка Project-Bridging-Header.h и его размещение в корне дерева папок моего проекта (как родственник моего основного файла проекта Xcode). См. Ответ @ renan-kosicki
jb

1
Исправлено в обновлении Xcode, это было вызвано проблемой с ранними бета-версиями.
Дуглас Бамби

3

для тех, у кого есть проблемы с добавлением быстрого класса в проект objective-c. это то, что работает для меня:

  1. создать НОВЫЙ быстрый файл. это заставит xcode запросить, хотите ли вы, чтобы xcode создавал все настройки для проекта mix swift-objective-c, включая brigde-header.h для вас. нажмите да.
  2. теперь добавьте существующие файлы swift, которые вы хотите использовать в своем проекте.
  3. в файле реализации вы собираетесь использовать быстрый класс add: #import "YOURPROJECTNAME-swift.h". этот файл xcode создаст для вас. если ваш проект xcode - myProject, тогда "myProject-swift.h"

и это все. теперь создайте в своем коде быстрый класс, как будто это было objective-c.


3

Я неправильно импортировал некоторые файлы из заголовочных файлов bridgin из cocoapods.

Вместо импорта

#import <SomeCocoaPod/SomeCocoaPod.h>

я написал

#import "SomeCocoaPod.h"

И это была моя ОГРОМНАЯ ошибка


2

Добавьте в проект временный файл Objective-C. Вы можете дать ему любое имя.

Выберите Да, чтобы настроить заголовок моста Objective-C.

Удалите только что созданный временный файл Objective-C.

В только что созданном файле projectName-Bridging-Header.h добавьте следующую строку:

'#import <GoogleMaps / GoogleMaps.h>'

Отредактируйте файл AppDelegate.swift:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    GMSServices.provideAPIKey("AIza....") //iOS API key

    return true
}

Перейдите по ссылке, чтобы увидеть полный образец


2

Для меня это не было выбором «Копировать элементы при необходимости» в пути назначения при добавлении фреймворка. Просто повторно добавьте каркас с выбранной опцией.


1

После первых нескольких дней борьбы мне, наконец, удалось успешно интегрировать регистрацию в Facebook в мое приложение для iOS. Вот шаги (я предполагаю, что вы уже установили Facebook SDK v4.1 или выше на свои машины):

  1. Добавьте фреймворки Facebook - FBSDKCoreKit, FBSDKLoginKit под свой проект.
  2. Не вносите никаких изменений в настройки сборки, поскольку FB SDK v4.1 и выше больше не требует файлов заголовков моста.
  3. Импортируйте FBSDKCorekit, FBSDKLoginKit в файлы ViewController.swift, AppDelegate.swift
  4. Добавьте информацию в pList, как указано здесь

  5. Создайте свое приложение. И воу! нет ошибок времени компиляции.


2
Этот ответ будет лучше, если вы включите данные со связанной страницы. Если связанная страница изменится или ссылка перестанет работать, люди, читающие этот ответ, не будут знать, что им делать, когда они натолкнутся на шаг 4.
TNT

1

У меня такая же проблема по разным причинам, вот мой случай, когда я создаю проект, в который нужно включить слайд-меню, я использую SWRevealViewController lib, чтобы приблизиться к этому

когда я импортирую файлы библиотеки, я добавляю подпапку (SWRevealViewController) в раздел «Вспомогательные файлы» для файлов .h && .m, возникает две ошибки, не удается импортировать мост и SWRevealViewController.h не найден.

Как я это исправлю

когда я перемещаю файлы в вспомогательные файлы напрямую (удаляю подпапку), SWRevealViewController.m автоматически добавляется в Build Phases -> Compile Sources, и проблема исчезает

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


1

У меня возникла такая ошибка, когда я добавлял расширение Today Extension в свое приложение. Целевая задача сборки для расширения была создана с тем же именем заголовка моста, что и цель сборки моего приложения. Это приводило к ошибке, потому что расширение не видит файлы, перечисленные в заголовке моста моего приложения.

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

Надеюсь, это поможет.


0

Я фактически создал пустой файл OSX Source Objective C в рамках проекта (где находятся все мои быстрые файлы).

Я добавил импорт, а затем удалил файл .m .


0

Среди других исправлений у меня возникла ошибка, когда я попытался сделать Продукт-> Архив. Оказывается, у меня было это:

Objective-C Bridging Header
  Debug (had the value)
  Release (had the value)
    Any architecture | Any SDK (this was blank - problem here!)

После установки в последней строке все заработало.


0

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

Uncategorized: Target 'Pods' of project 'Pods' was rejected as an implicit dependency for 'Pods.framework' because its architectures 'arm64' didn't contain all required architectures 'armv7 arm64'

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

Так что решение было довольно простым. Для проекта Pods измените флаг Build Active Architecture Only на No, и исходная ошибка исчезнет.


0

Установите для заголовка Precompile Bridging Header значение No fix the problem for me.


Почему отрицательные голоса? Для некоторых это законное решение. Я тестировал выполнение итеративных сборок с этим включением и отключением на большом проекте и не вижу никакой разницы (Apple видела ускорение до 30%), но время, которое я теряю при очистке файлов сборки и сборке с нуля, является значительным
Alexandre G
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.