Obtener "archivo no encontrado" en el encabezado de puente al importar marcos Objective-C en el proyecto Swift

96

Tengo un proyecto Swift para el que estoy intentando importar marcos basados ​​en ObjC. El marco se encuentra en un directorio debajo de la ruta del proyecto y el proyecto hace referencia a él en Xcode. También se agrega al "Enlace binario con bibliotecas" en la página "Fases de compilación" del proyecto.

Sin embargo, por alguna razón, parece que no puedo incluir el marco en el archivo Bridging-Header. Obtuve el siguiente error:

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'

Cosas que he comprobado:

  1. El "Encabezado de compatibilidad de instalación de Objective-C" se establece en "SÍ".
  2. Las rutas de búsqueda de encabezados incluyen la ruta a los marcos.

Estoy seguro de que me estoy perdiendo algo, así que si alguien tiene alguna pista, sería genial.

Dia Kharrat
fuente
3
Olvidé poner la ruta de la biblioteca Header Search Paths, en este caso la pregunta ayudó: D
Aishwat Singh

Respuestas:

78

Encontré una solución:

  • La configuración de "Encabezado de puente de Objective-C" (también conocida como SWIFT_OBJC_BRIDGING_HEADER) debe establecerse en el nivel de destino y NO en el nivel de proyecto. Asegúrese de eliminar el valor de configuración en el nivel del proyecto.

(para mí, parece un error de Xcode, ya que no sé por qué lo soluciona).

Dia Kharrat
fuente
1
Esto es realmente extraño, tuve el mismo error y resulta que tenía el encabezado definido en el nivel del Proyecto. Aunque ya lo tenía definido en el nivel de destino, tuve que eliminarlo del nivel de proyecto para permitir que se agreguen marcos de trabajo de terceros. Desafortunadamente, parece que es un error de Xcode.
Jojodmo
2
@MarcoAlmeida, si tiene un objetivo de pruebas, intente eliminar la configuración de "Encabezado de puente Objective-C" de ese también. Debería ayudar.
Davlat Mirmanov
3
Increíble. Gracias.
Darren
1
¡Hola! Tengo el mismo problema aquí :( Aunque no se resuelve con el método descrito anteriormente ...
Mike K
1
Esto funcionó para mí en Xcode 9.2. Todavía no se ha solucionado después de tantos años ...
Oliver Eichhorn
58

Tengo el mismo problema. Cambié todas mis importaciones de #import "HMSegmentedControl.h"a, #import <HMSegmentedControl/HMSegmentedControl.h>por ejemplo.

jamesthakid
fuente
7
Para trabajar con cocoapods esto es necesario. En el encabezado Bridging, nunca importe un pod como #import "abc.h" user #import <abc / abc.h> Aprobado.
NaXir
1
¡Eres el dios! Muchas gracias por esto.
Alper
En mi caso, convertí #import <ios-qr-encoder / UIImage + MDQRCode.h> a #import "UIImage + MDQRCode.h" y funcionó
Mashhadi
Tú eres el rey
Itai Spector
27

Tuve que agregar mi libdirectorio en las rutas de búsqueda del encabezado de usuario:

configuración de destino de prueba: ruta de búsqueda del encabezado del usuario

En mi caso, el libdirectorio contiene el .aarchivo -library y algunos archivos de encabezado. Estos se incluyen en el archivo de encabezado de puente. Sin embargo, el compilador rápido no los encontraría. Solo cuando agregué ${PROJECT_DIR}/liba la ruta de búsqueda de encabezado de usuario, construyó el objetivo de prueba.

(Estoy usando Xcode 6.2 en Mavericks 10.9.5)

Rainer Schwarze
fuente
1
Podría resolver este problema agregando Pods / * a las Rutas de búsqueda de encabezado del objetivo principal. Curiosamente, no tuve este problema antes de agregar marcos Swift como dependencias a mi objetivo. Xcode 7 beta 6.
bizz84
Esto fue exactamente lo que funcionó para mí. Tengo un marco incluido en mi proyecto que contiene la biblioteca (.a). Tuve que crear una ruta de búsqueda para los encabezados de la biblioteca en las Rutas de búsqueda de encabezados de usuario.
Chris Livdahl
También tuve que importar la carpeta Pods / library, ¡muchas gracias!
Thibaut Noah
17

Encontramos el mismo mensaje de error, con una causa completamente diferente.

Preparar:

  • Objetivo de la aplicación, todo el código Obj-C
  • Objetivo de prueba unitaria con un solo caso de prueba rápido y un encabezado puente que hace referencia al código de la aplicación

Cuando agregamos el segundo caso de prueba rápida, después de una limpieza (o en la máquina de un compañero de equipo), vimos este error al construir el objetivo de prueba de la unidad.

Se solucionó agregando una clase Obj-C ficticia al objetivo de la prueba unitaria.

Dan Jackson
fuente
5
Gracias. Esto funcionó absolutamente a pesar de no tener ningún sentido.
Pude eliminar la clase ficticia de Obj-C después. Supongo que un efecto secundario de esta solución es la creación de un encabezado de puente específico del objetivo de prueba, que a su vez (sospecho) hace que Xcode ignore el encabezado de puente de la aplicación host.
clozach
Anexo anterior: después de hacer una compilación limpia, comencé a tener un error de segmentación 11 durante la compilación. Después de algunas pruebas y errores, parece que el archivo .m ficticio debe estar presente, pero puede estar vacío. Locura.
clozach
Al agregar una clase objc ficticia a mi objetivo de prueba, ¡lo arreglé para mí!
neoneye
5

Si usa cocoapods, intente reinstalar las vainas ejecutando el siguiente comando.

pod install
Ankit Goel
fuente
Esto me ayudó ya que recientemente había creado una nueva configuración que no se estaba compilando (el mismo problema de archivo no encontrado), mientras que las otras configuraciones (depuración y liberación) sí lo estaban. pod installparece ser necesario para cualquier configuración nueva agregada ...
Mete
5

Esto de alguna manera funcionó para mí:

  • Proyecto limpio
  • Carpeta de construcción limpia
  • Reiniciar Xcode
Hlung
fuente
Venga con respuestas genéricas, no intente trucos.
Nico
Este truco en particular de golpear y probar requiere mucho menos esfuerzo, por lo que no debería doler intentarlo mientras piensa en otras soluciones. ;)
Hlung
1
Lamentablemente, este truco de probar y acertar en particular suele ser la respuesta correcta.
Robert Schmid
5

Este error apareció al instalar con Cocoapods la biblioteca CocoaImageHashing. El problema era que las rutas de búsqueda estaban equivocadas. Entonces, en el nivel de destino, en Configuración de compilación -> Rutas de búsqueda -> Rutas de búsqueda de encabezado, las rutas correspondían a carpetas no existentes, por ejemplo, "$ {PODS_ROOT} / Headers / Public / CocoaImageHashing", cuando la estructura de carpetas Headers / Public / no existió. Agregué la ruta $ {PODS_ROOT} / CocoaImageHashing y el error desapareció.

Nicoara Talpes
fuente
4

Bueno, es un poco extraño, pero supongo que debe agregar un recurso a la fase "Copiar recursos de paquete" de su objetivo de prueba para que cargue todos los encabezados de su objetivo principal de la aplicación. En mi caso, agregué main.storyboardy se ocupó del error.

ingrese la descripción de la imagen aquí

Yas T.
fuente
4

Esto me sucedió después de agregar / cambiar el nombre de las configuraciones actuales y tiene sentido.

Cada configuración hace uso del conjunto de configuraciones generado por cocoapods, por lo que estas cosas deben coincidir.

Entonces, si agrega / cambia el nombre de las configuraciones, estas deberán usar los conjuntos de configuración correctos, y para eso, la ejecución pod installlo hará.

rgkobashi
fuente
3

Si ayuda a alguien.

En mi caso, mis archivos obj-c que se agregaron tienen una carpeta de referencia (las carpetas azules en xcode) y el encabezado no pudo encontrarlos. Acabo de agregar los archivos, no la carpeta, desde el buscador a xcode y resuelto.

Da Silva
fuente
2

Yo tuve el mismo problema. Para mí, la razón fue que estaba usando el mismo encabezado puente para mi aplicación y mi extensión Today. My Today Extension no incluye Parse, pero debido a que se definió en el encabezado de puente, estaba tratando de buscarlo. Creé un nuevo encabezado puente para mi extensión Today y el error desapareció.

pescador
fuente
No suena como el mismo problema que tengo. No tengo una extensión de hoy. En mi caso, estoy usando un encabezado puente para la aplicación y el marco Parse está incluido en las dependencias de la aplicación. El error también se produce en otros marcos, no solo en Parse.
Dia Kharrat
2

Mi marco estaba funcionando antes y de repente dejó de funcionar, y ninguna de estas respuestas funcionaba para mí. Eliminé el marco en Build Phases> Link Binary With Libraries y lo volví a agregar. Empezó a trabajar de nuevo.

James
fuente
2

Tuve un problema y lo solucioné después de pasar 2 horas para encontrarlo. Mi entorno de la siguiente manera:

cocoapod 0.39.0

rápido 2.x

XCode 7.3.1

Pasos:

  1. ruta del proyecto: nombre_proyecto / nombre_proyecto / your_bridging_header.h
  2. En la sección Swift en Build Setting, Objective-C Bridging Header debería ser: project_name / your_bridging_header.h
  3. En your_bridging_header.h , cambie todas las declaraciones de .h a #import
  4. En la clase que se está utilizando your_3rd_party . Declare importar su_3rd_party
Binh Le
fuente
Su respuesta es correcta, solo agregue la respuesta @jamesthakid en el tercer punto para que quede más claro. Funcionó para mí gracias.
NaXir
5
¿Qué quiere decir exactamente con "cambiar todas las declaraciones de .h a #import"?
Chris Gunawardena
1

Acababa de duplicar un esquema existente y agregar otra configuración al proyecto. Tuve que agregar una configuración con el mismo nombre al proyecto del marco para que también se compilara en la misma DerivedData/($AppName)/Build/Products/($CONFIGURATION_NAME)carpeta. De lo contrario, el archivo .framework no se crea y, por lo tanto, no se puede importar.

iMaddin
fuente
1

Hoy me encontré con el mismo problema cuando intentaba usar un pod escrito en Objective-C en mi proyecto Swift, ninguna de las soluciones anteriores parecía funcionar.

En el archivo pod que había use_frameworks!escrito. Al comentar esta línea y luego ejecutarla pod installnuevamente, este problema se resolvió y el error desapareció.

Rikh
fuente
1

(Actualizado al 27 de mayo de 2017)

Xcode 8. Swift Project: importación de Objective C.

Cosas que saber:

  1. El archivo de encabezado de puente DEBE guardarse dentro de la carpeta del proyecto. (es decir, no se guarda en el mismo nivel en el que se guarda .xcodeproj, sino un nivel más abajo en las carpetas donde se guardan todos los archivos c rápidos y objetivos). Todavía puede encontrar el archivo en el nivel superior, pero no se vinculará correctamente y no podrá importar archivos de Objective C en el archivo de encabezado de puente
  2. El archivo de encabezado de puente puede tener cualquier nombre, siempre que sea un archivo de encabezado .h
  3. Asegúrese de que la ruta en Configuración de compilación> Compilador Swift - General> Encabezado puente de Objective C apunte correctamente al archivo de encabezado puente que creó
  4. IMPORTANTE: si todavía aparece "no encontrado", primero intente vaciar su archivo de encabezado de puente y borre cualquier importación que haya escrito allí. Asegúrese de que el archivo de encabezado de puente se pueda encontrar primero, luego comience a agregar importaciones de objetivo c a ese archivo. Por alguna razón, devolverá el mismo error "no encontrado" incluso si se encuentra, pero no le gusta la importación que está intentando por alguna razón
  5. No debe #importar "MyBridgingHeaderFile.h" en ninguno de sus archivos C objetivos. Esto también provocará un error de "archivo no encontrado"
BennyTheNerd
fuente
1
Todos estos puntos están verificados y aún tienen el mismo problema :( ¿Algún punto adicional debe tenerse en cuenta?
Amjad Husseini
@AmjadHusseini intenta limpiar los archivos de tu proyecto, luego borra los datos derivados de tu proyecto y luego reinicia xCode. que funcionó conmigo
Mohammad Allam
0

Tuve un problema similar y solo una solución funcionó para mí. Probé todo lo sugerido y supe que configuré bien mi encabezado de puente, porque tenía otra biblioteca funcionando.

Cuando copié la biblioteca (arrastrar y soltar) en el proyecto, sin Cocoapods, solo después de eso pude importar encabezados sin errores.

Usé la biblioteca de Facebook / Shimmer.

nja
fuente
0

Tuve un problema similar con las vainas. Básicamente, al intentar ejecutar mis pruebas de IU, Xcode se quejó de que faltaban pods. La solución a esto fue mucho más simple que cualquiera de las descritas anteriormente:

  1. ir al archivo del proyecto (principal no es un objetivo)
  2. haga clic en la pestaña "Información" (más a la izquierda)
  3. establecer la configuración de pod adecuada para el objetivo de las pruebas de IU (sección "Configuraciones" justo debajo de "Objetivo de implementación")

¡Trabajando!

Lo encontré en un hilo: https://github.com/CocoaPods/CocoaPods/issues/2695

Suena un poco como un error para las mazorcas de cacao, pero puedo ver las razones por las que podría ser un caso complicado.

Julian Król
fuente
0

En mi caso solo tuve que salir del simulador ...

Michal Shatz
fuente
0

Limpiar proyecto, Limpiar carpeta de compilación, Reiniciar Xcode. Simplemente elimino la ruta en el proyecto goto> Configuración de compilación> Buscar la palabra clave. Swift Compiler - General -> El encabezado Objective-C Bridging funcionó para mí.

Madavaram Ramesh
fuente
0

Agosto de 2019

En mi caso, quería usar un protocolo Swift en un archivo de encabezado de Objective-C que proviene del mismo objetivo y para esto necesitaba usar una declaración directa del protocolo Swift para hacer referencia a él en la interfaz de Objective-C. Lo mismo debería ser válido para usar una clase Swift en un archivo de encabezado Objective-C. Para usar la declaración hacia adelante, vea el siguiente ejemplo de los documentos en Incluir clases Swift en los encabezados de Objective-C usando declaraciones hacia adelante :

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

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