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.

Dia Kharrat
fonte
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).

Dia Kharrat
fonte
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.

Jamesthakid
fonte
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)

Rainer Schwarze
fonte
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.

Dan Jackson
fonte
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
Ankit Goel
fonte
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
Hlung
fonte
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.

Nicoara Talpes
fonte
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

Yas T.
fonte
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.

rgkobashi
fonte
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.

DaSilva
fonte
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.

pescador
fonte
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.

James
fonte
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
Binh Le
fonte
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.

iMaddin
fonte
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.

Rikh
fonte
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"
BennyTheNerd
fonte
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.

nja
fonte
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.

Julian Król
fonte
0

No meu caso só tive que sair do simulador ...

Michal Shatz
fonte
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.

Madavaram Ramesh
fonte
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
ronatório
fonte