Problema de importação do Swift Bridging Header

123

Seguindo as instruções, criei um cabeçalho de ponte e adicionei ao meu projeto. Infelizmente, ocorreu o seguinte erro:

: 0: erro: não foi possível importar o cabeçalho do Objective-C '--- caminho - para --- o cabeçalho / .... h'

Captura de tela 1

Nas configurações de compilação, adicionei a string do caminho de pesquisa do cabeçalho ao local do cabeçalho da ponte, mas nada ajudou.

Alguém já experimentou este problema?

Nikita Pronchik
fonte
Você pode, em vez de adicionar o arquivo de cabeçalho você mesmo. Use o Novo arquivo .. para adicionar um novo arquivo Objective-c .m em branco. Isso fará com que o xcode ofereça um arquivo de ponte de cabeçalho onde você pode adicionar suas importações. Você pode então excluir o arquivo .m você acabou de adicionar
markhunte
Sim, eu tentei dessa maneira com certeza também, mas nada ajudou #
Nikita Pronchik
É um projeto novo ou o mesmo que você fez à mão?
markhunte
É no projeto fresco, eu tenho aded invólucro de suporte chaveiro, que eu escrevi uma vez sobre ObjC
Nikita Pronchik
Desculpe. Não sei o que você quer dizer com o invólucro de suporte de chaveiro adicionado. Mas noto que você está no iOS que você obtêm a mesma coisa com um projeto OSX que é o que tenho vindo a utilizar
markhunte

Respostas:

153

Tenha cuidado para adicionar o arquivo à pasta que seu erro está reclamando! Cometi o mesmo erro: se você criar o arquivo a partir do Xcode, ele irá para a pasta: Projeto-> Projeto-> Cabeçalho.h

E o Xcode está procurando por Project-> Header.h

Isso significa que você precisa colocar o arquivo dentro da pasta do projeto (ProjectName-> ProjectNameFolder)!

Espero que ajude ;)

ATUALIZADO: Não sei se entendi o que você quer dizer, mas tente resolver o seu problema:
1. Exclua todos os seus arquivos de ponte que você criou até agora.
2. Selecione a pasta principal do projeto e clique em novo arquivo-> iOS-> arquivo de cabeçalho.
3. Escreva suas importações no arquivo de cabeçalho criado.
4. Selecione o projeto em Xcode-> Build Settings, digite no campo de pesquisa: ponte e coloque na chave SWIFT_OBJC_BRIDGING_HEADER o nome do seu arquivo de cabeçalho ou o caminho para ele!

Se você seguir estas etapas, seu arquivo de cabeçalho será criado no local correto!

: D Espero que ajude!

Renan Kosicki
fonte
Bem, eu apenas tentei este método, o cabeçalho é realmente visível, mas, infelizmente, ponte aulas Obj-C ainda são invisíveis (depois de incluí-los em ponte cabeçalho)
Nikita Pronchik
11
No início, a resposta diz "Precisa colocar o arquivo no mesmo nível do xcodeproj"; no final, ele diz "verifique se o arquivo está ... não no mesmo nível do xcodeproj". Por quê?
Boon
3
Eu quis dizer que o arquivo deve estar localizado dentro da subpasta do projeto, não no mesmo nível do xcodeproj. Exemplo: Na pasta do seu projeto, você tem project, project.xcodeproj e projecttests. O arquivo deve estar dentro da pasta do projeto :)
Renan Kosicki
5
Eu tentei de tudo, mas nada funciona para mim. Isso é muito irritante. Eu estou trabalhando com o Xcode 8 e rápida 3. Você pode me ajudar
Hardik Shah
1
Estou confuso que você diz "Isso significa que você precisa colocar o arquivo no mesmo nível do xcodeproj!" mas depois que você disse "Verifique se o arquivo está localizado na pasta principal do projeto e não no mesmo nível do xcodeproj!" qual é esse?
23417 bakalolo
68

No meu caso, isso foi realmente um erro como resultado de uma referência circular. Eu tinha uma classe importada no cabeçalho da ponte e o arquivo de cabeçalho dessa classe estava importando o cabeçalho rápido ( <MODULE_NAME>-Swift.h). Eu estava fazendo isso porque no arquivo de cabeçalho Obj-C eu precisava usar uma classe declarada no Swift, a solução era simplesmente usar o @classdeclarativo.

Então, basicamente, o erro dizia "Falha ao importar o cabeçalho da ponte", o erro acima dizia que o <MODULE_NAME>-Swift.harquivo não foi encontrado, acima disso houve um erro apontando para um arquivo de cabeçalho Obj-C específico (ou seja, um View Controller).

Ao inspecionar esse arquivo, notei que ele tinha o -Swift.h declarado dentro do cabeçalho. Mover essa importação para a implementação resolveu o problema. Então, eu precisava usar um objeto, vamos chamá-lo MyObjectdefinido no Swift, então simplesmente mudei o cabeçalho para dizer

@class MyObject;
Daniel Galasko
fonte
1
Isso é bobagem, mas movê-lo para o arquivo de implementação também funcionou para mim. Infelizmente, eu precisava dele no cabeçalho porque minha classe implementa um delegado definido em um arquivo rápido. Mas como o obj-c não se importa se minha classe realmente implementa o delegado quando eu o passo, vou resolver isso. Mas o ideal é que haveria uma outra maneira
Oren
Você também pode precisar verificar as importações daquele que está trazendo para o cabeçalho da ponte. Se alguma dessas classes importadas tiver uma referência ao arquivo "-Swift.h", você precisará mover a declaração para o .m.
Kyle Carruthers
30

Encontre o caminho em:

Configurações de compilação / Swift Compiler Generation Geração de código / Objective-C Bridging Header

e exclua esse arquivo. Então você deve ficar bem.

variadics
fonte
2
Você ganha. Eu perdi muito tempo com isso. Simples e eficaz. O Xcode está fazendo algo complicado com esse caminho, como anexá-lo a $ (SRCROOT) nos bastidores. Eu acho que ter um espaço no meu caminho pode ser parte do problema, mas essa foi a bala de prata.
jday 10/05
1
como você apaga esse arquivo?
Jacky Wang
7
No Xcode 8 - em vez de "Code Generation", ele está no Swift Compiler - General.
Vivek Bansal
Obrigado, você me salvou ... Muito obrigado
Vijay Rathod 18/18
18

Provavelmente isso afetará apenas uma pequena porcentagem de pessoas, mas no meu caso, meu projeto estava usando CocoaPods e um desses pods tinha uma subespecificação com seus próprios CocoaPods. A solução foi usar importações de ângulo completo para fazer referência a qualquer arquivo nos sub-pods.

#import <HexColors/HexColor.h>

Ao invés de

#import "HexColor.h"
Kyle Clegg
fonte
2
Qual é a diferença?
Daniel Gomez Rico
Este foi o problema para mim. Eu recebi "Falha ao importar o cabeçalho de ponte" e os erros "Não foi possível encontrar o XYZ.h". Fazer essa alteração resolveu o problema para mim no Xcode 6.4 e no Swift 1.2.
Entalpi
1
@danielgomezrico Uma instrução aponta para o arquivo em um subdiretório. Os outros apontam para um arquivo que não existe.
Casey Murray
A solução para esse erro ao usar o CocoaPods foi simplesmente executar a instalação do pod novamente após a criação da nova configuração.
typewriter
16

Para eu excluir os dados derivados corrigidos, notei que mesmo se eu fizer o check-out de um commit antigo, o mesmo problema acontece.

Você pode acessar essa opção no formulário Janela-> Projetos.

M.Othman
fonte
9

Para mim, foi porque esqueci de adicioná-lo às configurações de compilação do alvo.

insira a descrição da imagem aqui

Roland Keesom
fonte
Isso pode ajudar se você o tiver adicionado apenas às configurações de compilação do projeto.
22416 zekel
9

"precisamos informar ao Xcode onde procurar os arquivos de cabeçalho que listamos em nosso cabeçalho de ponte . Encontre a seção Caminhos de pesquisa e altere a configuração no nível do projeto para Caminhos de pesquisa de cabeçalho do usuário , adicionando uma entrada recursiva para os 'Pods' diretório: Pods / ** " http://swiftalicio.us/2014/11/using-cocoapods-from-swift/

GS
fonte
6

Eu também experimentei esse problema e, infelizmente, é apenas um bug no SDK + Xcode. Conversei com um engenheiro da WWDC sobre este e alguns outros problemas que estava tendo com o CloudKit. Esses erros serão abordados na próxima semente do Xcode.

É a parte divertida do uso de software beta.

douglas bumby
fonte
1
Sim, é frustrante. Minha equipe e eu estávamos trabalhando tentando descobrir um problema de NSURL com o CloudKit e não conseguimos descobrir por que estávamos recebendo erros. Acontece que era um problema do lado do servidor da apple. não podíamos fazer nada. perdeu muito tempo. haha
douglas bumby
5
O problema pode realmente ser resolvido colocando o cabeçalho no local correto. O que funcionou para mim foi chamar o cabeçalho Project-Bridging-Header.h e colocá-lo na raiz da árvore de pastas do meu projeto (como um irmão do meu arquivo principal do projeto Xcode). Veja @ renan-kosicki resposta
jb
1
Corrigido em uma atualização do Xcode, isso foi causado por um problema nos primeiros betas.
precisa saber é o seguinte
3

para outros que têm problemas para adicionar classe rápida ao projeto objetivo-c. é isso que funciona para mim:

  1. crie NOVO arquivo rápido. isso fará com que o xcode indique se você deseja que o xcode crie todas as configurações para o projeto mix swift-objetivo-c, incluindo brigde-header.h para você. pressione sim.
  2. agora, adicione seus arquivos rápidos existentes que você deseja usar no seu projeto.
  3. no arquivo de implementação, você usará a classe swift e adicione: #import "YOURPROJECTNAME-swift.h". este arquivo xcode cria para você. se o seu projeto xcode for myProject, "myProject-swift.h"

e é isso. agora crie a classe swift no seu código como se fosse objetivo-c.

user1105951
fonte
3

Importei alguns arquivos dos arquivos de cabeçalho bridgin dos cocoapods, não de maneira adequada.

Em vez de importar

#import <SomeCocoaPod/SomeCocoaPod.h>

eu escrevi

#import "SomeCocoaPod.h"

E este foi o meu erro ENORME

Nikolay Shubenkov
fonte
2

Adicione um arquivo Objective-C temporário ao seu projeto. Você pode dar o nome que quiser.

Selecione Sim para configurar um cabeçalho de ponte Objective-C.

Exclua o arquivo Objective-C temporário que você acabou de criar.

No arquivo projectName-Bridging-Header.h recém-criado, adicione esta linha:

'#import <GoogleMaps / GoogleMaps.h>'

Edite o arquivo AppDelegate.swift:

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

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

    return true
}

Siga o link para obter uma amostra completa

Atul Kaushik
fonte
2

Para mim, não foi selecionar 'Copiar itens, se necessário' no caminho de destino ao adicionar a estrutura. Basta adicionar novamente a estrutura com esta opção selecionada.

Daisy R.
fonte
1

Após alguns dias iniciais de luta, finalmente consegui integrar com êxito a inscrição do Facebook no meu aplicativo iOS. Aqui estão as etapas (suponho que você já tenha instalado o Facebook SDK v4.1 ou superior em suas máquinas):

  1. Adicione as estruturas do Facebook - FBSDKCoreKit, FBSDKLoginKit no seu projeto.
  2. Não faça alterações nas configurações de compilação, pois o FB SDK v4.1 e posterior não precisa mais de arquivos de cabeçalho de ponte.
  3. Importe o FBSDKCorekit, FBSDKLoginKit nos arquivos ViewController.swift, AppDelegate.swift
  4. Adicione informações na lista como mencionado aqui

  5. Crie seu aplicativo. E ai! sem erros de tempo de compilação.

HITESH AGARWAL
fonte
2
Essa resposta seria melhor se você incluísse detalhes da página vinculada. Se a página vinculada muda ou o link deixa de trabalho, as pessoas lendo esta resposta não vai saber o que fazer quando se deparam com a etapa 4.
TNT
1

Eu tenho o mesmo problema por motivos diferentes. Aqui está o meu caso: eu construo um projeto que precisa ser incluído no menu de slides. Estou usando a SWRevealViewController lib para abordar essa questão.

Quando importo os arquivos da biblioteca, adiciono a subpasta (SWRevealViewController) em Supporting Files para arquivos .h && .m, ele aciona dois erros, não é possível importar a ponte e o SWRevealViewController.h não foi encontrado.

Como eu conserto

quando movo os arquivos diretamente para os arquivos de suporte (exclua a subpasta), o SWRevealViewController.m é adicionado automaticamente ao Build Fhases -> Compile Sources e o problema desaparece

insira a descrição da imagem aqui

Mina Fawzy
fonte
1

Tive esse tipo de erro ao adicionar uma extensão Today ao meu aplicativo. O destino de construção da extensão foi gerado com o mesmo nome do cabeçalho de ponte que o destino de construção do meu aplicativo. Isso levou ao erro, porque a extensão não vê os arquivos listados no cabeçalho da ponte do meu aplicativo.

A única coisa que você precisa é excluir ou alterar o nome do cabeçalho da ponte para a extensão e tudo ficará bem.

Espero que isso ajude.

Georgi Boyadzhiev
fonte
0

Na verdade, criei um arquivo OSX Source Objective C vazio no projeto (onde estão todos os meus arquivos swift).

Adicionei as importações e excluí o arquivo .m .

zevij
fonte
0

Entre as outras correções, ocorreu o erro ao tentar fazer Produto-> Arquivar. Acontece que eu tinha isso:

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

Depois de colocá-lo na última linha, funcionou.

nevster
fonte
0

Teve um problema semelhante que não pôde ser resolvido por nenhuma solução acima. Meu projeto usa CocoaPods. Percebi que, juntamente com os erros, recebi um aviso com a seguinte mensagem:

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'

insira a descrição da imagem aqui

Portanto, a solução foi bastante simples. Para o projeto Pods, altere o sinalizador Build Active Architecture Only para No e o erro original desapareceu.

mike.tihonchik
fonte
0

Defina Precompile Bridging Header como Não corrija o problema para mim.

abelhoang
fonte
Por que os votos negativos? É uma solução legítima para algumas pessoas. Comparei a criação iterativa com isso dentro e fora de um projeto grande e não vejo diferença alguma (a Apple registrou até 30% de aceleração), mas a quantidade de tempo que perco ao limpar arquivos de construção e construir do zero é substancial
Alexandre G