Obtendo “arquivo não encontrado” em Bridging Header ao importar frameworks Objective-C para o projeto Swift


96

Eu tenho um projeto Swift para o qual estou tentando importar estruturas baseadas em ObjC. O framework está localizado em um diretório sob o caminho do projeto e é referenciado pelo projeto no Xcode. Ele também é adicionado ao "Link Binary with Libraries" na página 'Build Phases' do projeto.

No entanto, por algum motivo, não consigo incluir a estrutura no arquivo Bridging-Header. Estou tendo o erro a seguir:

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'

Coisas que verifiquei:

  1. O "Install Objective-C Compatibility Header" está definido como "YES".
  2. Os Caminhos de pesquisa de cabeçalho incluem o caminho para as estruturas.

Tenho certeza de que estou perdendo alguma coisa, então se alguém tiver alguma pista, isso seria ótimo.


3
esqueci de Header Search Paths
inserir o

Respostas:


78

Encontrou uma solução:

  • A configuração "Objective-C Bridging Header" (também conhecida como SWIFT_OBJC_BRIDGING_HEADER) deve ser definida no nível de destino, e NÃO no nível de projeto. Certifique-se de excluir o valor de configuração no nível do projeto.

(para mim, parece um bug do Xcode, já que não sei por que ele corrige).


1
Isso é muito estranho, eu tive o mesmo erro e descobri que tinha o cabeçalho definido no nível do projeto. Embora eu já o tivesse definido no nível Alvo, tive que removê-lo do nível Projeto para permitir que Frameworks de terceiros fossem adicionados. Desafiadoramente parece que é um bug do Xcode.
Jojodmo

2
@MarcoAlmeida, se você tiver um alvo de testes, tente remover a configuração "Objective-C Bridging Header" dele também. Deve ajudar.
Davlat Mirmanov

3
Inacreditável. Obrigado.
Darren

1
Olá! Tenho o mesmo problema aqui :( Embora não seja resolvido com o método descrito acima ...
Mike K

1
Isso funcionou para mim no Xcode 9.2. Ainda não corrigido depois de tantos anos ...
Oliver Eichhorn

58

Eu tenho o mesmo problema. Mudei todas as minhas importações de #import "HMSegmentedControl.h"para, #import <HMSegmentedControl/HMSegmentedControl.h>por exemplo.


7
Para trabalhar com cocoapods, isso é necessário. No cabeçalho Bridging, nunca importe um pod como #import "abc.h" user #import <abc / abc.h> Gostei.
NaXir de

1
Você é o deus! Muito obrigado por isso.
Alper

No meu caso, converti #import <ios-qr-encoder / UIImage + MDQRCode.h> para #import "UIImage + MDQRCode.h" e funcionou
Mashhadi

Você é o rei
Itai Spector

27

Tive que adicionar meu libdiretório em Caminhos de pesquisa do cabeçalho do usuário:

configurações de destino de teste - caminho de pesquisa do cabeçalho do usuário

No meu caso, o libdiretório contém o .aarquivo -library e alguns arquivos de cabeçalho. Eles estão incluídos no arquivo de cabeçalho de ponte. No entanto, o compilador rápido não os encontraria. Somente quando adicionei ${PROJECT_DIR}/libao Caminho de pesquisa do cabeçalho do usuário, ele construiu o destino de teste.

(Estou usando o Xcode 6.2 no Mavericks 10.9.5)


1
Eu poderia resolver esse problema adicionando Pods / * aos Caminhos de pesquisa de cabeçalho do destino principal. Curiosamente, não tive esse problema antes de adicionar frameworks Swift como dependências ao meu destino. Xcode 7 beta 6.
bizz84

Isso foi exatamente o que funcionou para mim. Eu tenho um framework incluído no meu projeto que contém a biblioteca (.a). Tive que criar um caminho de pesquisa para os cabeçalhos da biblioteca nos Caminhos de pesquisa de cabeçalho do usuário.
Chris Livdahl

Também tive que importar pasta Pods / biblioteca, muito obrigado!
thibaut noah

17

Encontramos a mesma mensagem de erro, com uma causa completamente diferente.

Configuração:

  • Destino do aplicativo, todo código Obj-C
  • Alvo de teste de unidade com um único caso de teste rápido e um cabeçalho de ponte referindo-se ao código do aplicativo

Quando adicionamos o segundo caso de teste do Swift, depois de uma limpeza (ou na máquina de um colega de equipe), vimos esse erro ao construir o alvo do teste de unidade.

Foi corrigido com a adição de uma classe Obj-C fictícia ao destino do teste de unidade.


5
Obrigado. Isso funcionou perfeitamente, apesar de não fazer absolutamente nenhum sentido.

Eu fui capaz de excluir a classe Obj-C fictícia depois. Meu palpite é que um efeito colateral desta solução é a criação de um cabeçalho de ponte específico do alvo de teste, que por sua vez (eu suspeito) faz com que o Xcode ignore o cabeçalho de ponte do aplicativo host.
clozach

Adendo ao acima: depois de fazer uma compilação limpa, comecei a receber uma falha de segmentação 11 durante a compilação. Após algumas tentativas e erros, parece que o arquivo fictício .m deve estar presente, mas pode estar vazio. Loucura.
clozach de

Adicionando uma classe objc fictícia ao meu alvo de teste, consertou para mim!
neoneye

5

Se estiver usando cocoapods, tente reinstalar os pods executando o seguinte comando.

pod install

Isso me ajudou, pois recentemente criei uma nova configuração que não estava compilando (o mesmo arquivo não foi encontrado problema), enquanto as outras configurações (depurar e liberar) estavam. pod installparece ser necessário para quaisquer novas configurações adicionadas ...
Mete

5

Isso de alguma forma funcionou para mim:

  • Projeto limpo
  • Limpar pasta de construção
  • Reinicie o Xcode

Venha com respostas genéricas, não tente bater e tentar trics.
Nico

Este truque específico de bater e tentar requer muito menos esforço, então não deve doer tentar enquanto você pensa em outras soluções. ;)
Hlung

1
Infelizmente, esse truque específico de bater e tentar é muitas vezes a resposta correta.
Robert Schmid de

5

Este erro apareceu ao instalar com Cocoapods a biblioteca CocoaImageHashing. O problema era que os caminhos de busca estavam errados. Portanto, no nível de destino, em Build Settings -> Search Paths -> Header Search Paths, os caminhos correspondiam a pastas não existentes, por exemplo "$ {PODS_ROOT} / Headers / Public / CocoaImageHashing", quando a estrutura de pastas Headers / Public / não existe. Eu adicionei o caminho $ {PODS_ROOT} / CocoaImageHashing e o erro desapareceu.


4

Bem, é um pouco estranho, mas acho que você tem que adicionar um recurso à fase "Copiar recursos do pacote" de seu destino de teste para fazê-lo carregar todos os cabeçalhos de seu destino de aplicativo principal. No meu caso, acrescentei main.storyboarde resolveu o erro.

insira a descrição da imagem aqui


4

Isso aconteceu comigo depois de adicionar / renomear as configurações atuais e faz sentido.

Cada configuração usa um conjunto de configurações gerado por cocoapods, portanto, essas coisas precisam corresponder.

Portanto, se você adicionar / renomear configurações, elas precisarão usar os conjuntos de configurações corretos e, para isso, a execução pod installfará isso.


3

Se ajuda alguém.

No meu caso, meus arquivos obj-c foram adicionados tem uma pasta de referência (as pastas azuis em xcode) e o cabeçalho não conseguiu localizá-los. Apenas adicionei os arquivos, não a pasta, do localizador ao xcode e resolvido.


2

Eu tive o mesmo problema. Para mim, o motivo era que eu estava usando o mesmo cabeçalho de ponte para meu aplicativo e minha extensão de hoje. Minha extensão Today não inclui o Parse, mas como foi definida no cabeçalho de ponte, estava tentando procurá-la. Eu criei um novo cabeçalho de ponte para minha extensão Today e o erro desapareceu.


Não parece o mesmo problema que eu. Não tenho uma extensão Hoje. No meu caso, estou usando um cabeçalho de ponte para o aplicativo e a estrutura do Parse está incluída nas dependências do aplicativo. O erro também ocorre em outras estruturas, não apenas no Parse.
Dia Kharrat

2

Minha estrutura estava funcionando antes e de repente parou de funcionar, e nenhuma dessas respostas estava funcionando para mim. Removi a estrutura em Build Phases> Link Binary With Libraries e a adicionei novamente. Começou a trabalhar novamente.


2

Tive um problema e resolvi-o depois de passar 2 horas para encontrá-lo. Meu ambiente conforme abaixo:

cocoapod 0.39.0

Swift 2.x

XCode 7.3.1

Passos:

  1. caminho do projeto: project_name / project_name / your_bridging_header.h
  2. Na seção Swift em Build Setting, Objective-C Bridging Header deve ser: project_name / your_bridging_header.h
  3. Em your_bridging_header.h , altere todas as declarações de .h para #import
  4. Na classe que está sendo usada your_3rd_party . Declare import your_3rd_party

Sua resposta está correta, basta adicionar a resposta @jamesthakid no terceiro ponto para torná-la mais clara. Funcionou para mim, obrigado.
NaXir de

5
O que exatamente você quer dizer com "alterar todas as declarações de .h para #import"?
Chris Gunawardena,

1

Eu tinha acabado de duplicar um esquema existente e adicionado outra configuração ao projeto. Tive que adicionar uma configuração com o mesmo nome ao projeto do framework para que ele também construísse na mesma DerivedData/($AppName)/Build/Products/($CONFIGURATION_NAME)pasta. Caso contrário, o arquivo .framework não será criado e, portanto, não poderá ser importado.


1

Eu tive o mesmo problema hoje ao tentar usar um pod escrito em Objective-C no meu projeto Swift, nenhuma das soluções acima parecia funcionar.

No podfile que use_frameworks!escrevi. Comentar essa linha e depois executar pod installnovamente resolveu esse problema para mim e o erro foi embora.


1

(Atualizado em 27 de maio de 2017)

Xcode 8. Projeto Swift - importando Objetivo C.

Coisas para saber:

  1. O arquivo de cabeçalho de ponte DEVE ser salvo na pasta do projeto. (ou seja, não salvo no mesmo nível que .xcodeproj é salvo, mas em vez disso, um nível mais abaixo nas pastas onde todos os seus arquivos swift e objetivos c são salvos). Ele ainda pode encontrar o arquivo no nível superior, mas não vinculará corretamente e não será capaz de importar arquivos Objective C para o arquivo de cabeçalho de ponte
  2. O arquivo de cabeçalho de ponte pode ter qualquer nome, desde que seja um arquivo de cabeçalho .h
  3. Certifique-se de que o caminho em Build Settings> Swift Compiler - Geral> Objective C Bridging Header está apontando corretamente para o arquivo de cabeçalho de ponte que você criou
  4. IMPORTANTE: se você ainda está recebendo "não encontrado", tente primeiro esvaziar seu arquivo de cabeçalho de ponte e apagar quaisquer importações que você tenha escrito lá. Certifique-se de que o arquivo de cabeçalho de bridging possa ser encontrado primeiro e, em seguida, comece a adicionar importações objetivas c a esse arquivo. Por algum motivo, ele retornará o mesmo erro "não encontrado" mesmo se for encontrado, mas não gosta da importação de sua tentativa por algum motivo
  5. Você não deve #importar "MyBridgingHeaderFile.h" em nenhum de seus arquivos C objetivos. Isso também causará um erro de "arquivo não encontrado"

1
Todos esses pontos foram verificados e ainda apresentam o mesmo problema :( Quaisquer outros pontos devem ser levados em consideração?
Amjad Husseini

@AmjadHusseini tente limpar seus arquivos de projeto, em seguida, limpe os dados derivados de seu projeto e reinicie o xCode. que funcionou comigo
Mohammad Allam

0

Eu tive um problema semelhante e apenas uma solução funcionou para mim. Tentei tudo o que foi sugerido e sabia que defini meu cabeçalho de ponte corretamente, porque tinha outra biblioteca funcionando.

Quando copiei a biblioteca (arraste e solte) para o projeto, sem Cocoapods, só depois pude importar cabeçalhos sem erros.

Eu usei a biblioteca do Facebook / Shimmer.


0

Tive um problema semelhante com os pods. Basicamente tentando executar meus testes de IU, o Xcode reclamou da falta de pods. A solução para isso era muito mais simples do que qualquer outra descrita acima:

  1. vá para o arquivo de projeto (principal, não um destino)
  2. clique na guia "Informações" (mais à esquerda)
  3. definir a configuração de pod adequada para o destino dos testes de IU (seção "Configurações" logo abaixo de "Destino de implantação")

Trabalhando!

Eu encontrei em um tópico: https://github.com/CocoaPods/CocoaPods/issues/2695

Parece um bug para os frutos do cacau, mas posso ver os motivos pelos quais pode ser um caso complicado.



0

Limpe o projeto, Limpe a pasta de construção, Reinicie o Xcode. Acabei de remover o caminho no projeto, vá para> Configurações de compilação> Pesquisar a palavra-chave. Compilador Swift - Geral -> Cabeçalho de ponte Objective-C funcionou para mim.


0

Agosto de 2019

No meu caso, eu queria usar um protocolo Swift em um arquivo de cabeçalho Objective-C que vem do mesmo destino e, para isso, precisei usar uma declaração de encaminhamento do protocolo Swift para referenciá-lo na interface Objective-C. O mesmo deve ser válido para usar uma classe Swift em um arquivo de cabeçalho Objective-C. Para usar a declaração de encaminhamento, consulte o exemplo a seguir nos documentos em Incluir classes Swift em cabeçalhos Objective-C usando declarações de encaminhamento :

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

@interface MyObjcClass : NSObject
- (MySwiftClass *)returnSwiftClassInstance;
- (id <MySwiftProtocol>)returnInstanceAdoptingSwiftProtocol;
// ...
@end
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.