Obtention du «fichier introuvable» dans l’en-tête de pont lors de l’importation de cadres Objective-C dans un projet Swift

96

J'ai un projet Swift pour lequel j'essaye d'importer des frameworks basés sur ObjC. Le framework est situé dans un répertoire sous le chemin du projet et est référencé par le projet dans Xcode. Il est également ajouté au "Lien binaire avec les bibliothèques" dans la page "Phases de construction" du projet.

Cependant, pour une raison quelconque, je n'arrive pas à inclure le framework dans le fichier Bridging-Header. J'obtiens l'erreur suivante:

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'

Choses que j'ai vérifiées:

  1. "Installer l'en-tête de compatibilité Objective-C" est défini sur "OUI".
  2. Les chemins de recherche d'en-tête incluent le chemin d'accès aux frameworks.

Je suis sûr qu'il me manque quelque chose, donc si quelqu'un a des indices, ce serait génial.

Dia Kharrat
la source
3
J'ai oublié de mettre le chemin de la bibliothèque Header Search Paths, dans ce cas, la question a aidé: D
Aishwat Singh

Réponses:

78

Trouvé une solution:

  • Le paramètre «En-tête de pontage Objective-C» (aka SWIFT_OBJC_BRIDGING_HEADER) doit être défini au niveau cible et NON au niveau du projet. Assurez-vous de supprimer la valeur du paramètre au niveau du projet.

(pour moi, cela ressemble à un bogue Xcode, car je ne sais pas pourquoi il le corrige).

Dia Kharrat
la source
1
C'est vraiment bizarre, j'ai eu la même erreur et il s'avère que j'avais l'en-tête défini au niveau du projet. Même si je l'avais déjà défini au niveau cible, j'ai dû le supprimer du niveau projet afin de permettre l'ajout de cadres tiers. Il semble que ce soit un bogue Xcode.
Jojodmo
2
@MarcoAlmeida, si vous avez une cible de tests, essayez de supprimer également le paramètre "Objective-C Bridging Header". Cela devrait aider.
Davlat Mirmanov
3
Incroyable. Je vous remercie.
Darren
1
Héy! J'ai le même problème ici: (Bien qu'il ne soit pas résolu avec la méthode décrite ci-dessus ...
Mike K
1
Cela a fonctionné pour moi dans Xcode 9.2. Toujours pas réglé après tant d'années ...
Oliver Eichhorn
58

J'ai le même problème. J'ai changé toutes mes importations de #import "HMSegmentedControl.h"à #import <HMSegmentedControl/HMSegmentedControl.h>par exemple.

jamesthakid
la source
7
Pour travailler avec des cocoapodes, c'est nécessaire. Dans l'en-tête Bridging, n'importez jamais un pod en tant qu'utilisateur #import "abc.h" #import <abc / abc.h> Thumbs up.
NaXir
1
Tu es le dieu! Merci beaucoup pour cela.
Alper le
Dans mon cas, j'ai converti #import <ios-qr-encoder / UIImage + MDQRCode.h> en #import "UIImage + MDQRCode.h" et cela a fonctionné
Mashhadi
Vous êtes le roi
Itai Spector
27

J'ai dû ajouter mon librépertoire dans les chemins de recherche des en-têtes d'utilisateurs:

Paramètres de la cible de test - chemin de recherche de l'en-tête de l'utilisateur

Dans mon cas, le librépertoire contient le .afichier -library et quelques fichiers d'en-tête. Ceux-ci sont inclus dans le fichier d'en-tête de pontage. Cependant, le compilateur rapide ne les trouverait pas. Ce n'est que lorsque j'ai ajouté ${PROJECT_DIR}/libau chemin de recherche d'en-tête de l'utilisateur qu'il a créé la cible de test.

(J'utilise Xcode 6.2 sur Mavericks 10.9.5)

Rainer Schwarze
la source
1
Je pourrais résoudre ce problème en ajoutant Pods / * aux chemins de recherche d'en-tête de la cible principale. Fait intéressant, je n'avais pas ce problème avant d'ajouter des frameworks Swift en tant que dépendances à ma cible. Xcode 7 beta 6.
bizz84
C'est exactement ce qui a fonctionné pour moi. J'ai un framework inclus dans mon projet qui contient une bibliothèque (.a). J'ai dû créer un chemin de recherche vers les en-têtes de la bibliothèque dans les chemins de recherche des en-têtes d'utilisateurs.
Chris Livdahl
J'ai également dû importer le dossier Pods / library, merci beaucoup!
thibaut noah
17

Nous avons rencontré le même message d'erreur, avec une cause complètement différente.

Installer:

  • Cible d'application, tout le code Obj-C
  • Cible de test unitaire avec un seul cas de test rapide et un en-tête de pontage faisant référence au code de l'application

Lorsque nous avons ajouté le deuxième cas de test rapide, après un nettoyage (ou sur la machine d'un coéquipier), nous avons vu cette erreur lors de la construction de la cible de test unitaire.

Il a été corrigé en ajoutant une classe Obj-C factice à la cible de test unitaire.

Dan Jackson
la source
5
Je vous remercie. Cela a absolument fonctionné même si cela n'avait absolument aucun sens.
J'ai pu supprimer la classe factice Obj-C par la suite. Je suppose qu'un effet secondaire de cette solution est la création d'un en-tête de pontage spécifique à la cible de test, qui à son tour (je soupçonne) fait que Xcode ignore l'en-tête de pontage de l'application hôte.
clozach
Addendum à ci-dessus: après avoir fait une compilation propre, j'ai commencé à avoir une erreur de segmentation 11 lors de la compilation. Après quelques essais et erreurs, il semble que le fichier factice .m doit être présent, mais il peut être vide. La démence.
clozach
L'ajout d'une classe objc factice à ma cible de test, l'a corrigé pour moi!
neoneye
5

Si vous utilisez des cocoapodes, essayez de réinstaller les pods en exécutant la commande suivante.

pod install
Ankit Goel
la source
Cela m'a aidé puisque j'avais récemment créé une nouvelle configuration qui ne se compilait pas (le même problème de fichier non trouvé), alors que les autres configurations (Debug et Release) l'étaient. pod installsemble être nécessaire pour toute nouvelle configuration ajoutée ...
Mete
5

Cela a en quelque sorte fait l'affaire pour moi:

  • Projet propre
  • Nettoyer le dossier de construction
  • Redémarrez Xcode
Hlung
la source
Venez avec des réponses génériques, ne frappez pas et essayez des astuces.
Nico
Cette astuce hit & try nécessite très moins d'efforts, donc cela ne devrait pas faire de mal d'essayer pendant que vous pensez à d'autres solutions. ;)
Hlung
1
Malheureusement, cette astuce hit & try est trop souvent la bonne réponse.
Robert Schmid
5

Cette erreur est apparue lors de l'installation avec Cocoapods de la bibliothèque CocoaImageHashing. Le problème était que les chemins de recherche étaient erronés. Ainsi au niveau cible, dans Paramètres de construction -> Chemins de recherche -> Chemins de recherche d'en-tête, les chemins correspondaient à des dossiers non existants, par exemple "$ {PODS_ROOT} / Headers / Public / CocoaImageHashing", lorsque la structure de dossier Headers / Public / n'existait pas. J'ai ajouté le chemin $ {PODS_ROOT} / CocoaImageHashing et l'erreur a disparu.

Nicoara Talpes
la source
4

Eh bien, c'est un peu étrange, mais je suppose que vous devez ajouter une ressource à votre phase "Copier les ressources du bundle" de votre cible de test pour lui faire charger tous les en-têtes de votre cible d'application principale. Dans mon cas, j'ai ajouté main.storyboardet il s'est occupé de l'erreur.

entrez la description de l'image ici

Yas T.
la source
4

Cela m'est arrivé après avoir ajouté / renommé les configurations actuelles et cela a du sens.

Chaque configuration utilise un ensemble de configurations généré par les cocoapodes, donc ces éléments doivent correspondre.

Donc, si vous ajoutez / renommez des configurations, celles-ci devront utiliser les bons ensembles de configuration, et pour cela, pod install fera.

rgkobashi
la source
3

Si aide quelqu'un.

Dans mon cas, mes fichiers obj-c ont été ajoutés a un dossier de référence (les dossiers bleus dans xcode) et l'en-tête ne peut pas les trouver. Juste ajouté les fichiers, pas le dossier, du Finder à xcode et résolu.

DaSilva
la source
2

J'ai eu le même problème. Pour moi, la raison était que j'utilisais le même en-tête de pontage pour mon application et mon extension Today. My Today Extension n'inclut pas Parse, mais comme il a été défini dans l'en-tête de pontage, il essayait de le rechercher. J'ai créé un nouvel en-tête de pontage pour mon extension Aujourd'hui et l'erreur a disparu.

pêcheur
la source
Cela ne ressemble pas au même problème que moi. Je n'ai pas d'extension Today. Dans mon cas, j'utilise un en-tête de pontage pour l'application, et le cadre d'analyse est inclus dans les dépendances de l'application. L'erreur se produit également pour d'autres frameworks, pas seulement pour Parse.
Dia Kharrat
2

Mon cadre fonctionnait avant et a soudainement cessé de fonctionner, et aucune de ces réponses ne fonctionnait pour moi. J'ai supprimé le framework dans Build Phases> Link Binary With Libraries, et je l'ai ré-ajouté. J'ai recommencé à travailler.

James
la source
2

J'ai eu un problème et je l'ai résolu après avoir passé 2 heures à le trouver. Mon environnement comme ci-dessous:

cocoapode 0.39.0

swift 2.x

XCode 7.3.1

Pas:

  1. chemin du projet: nom_projet / nom_projet / your_bridging_header.h
  2. Dans la section Swift de Build Setting, Objective-C Bridging Header doit être: project_name / your_bridging_header.h
  3. Dans your_bridging_header.h , changez toutes les déclarations de .h en #import
  4. Dans la classe qui est utilisée your_3rd_party . Déclarez importer votre_3rd_party
Binh Le
la source
Votre réponse est correcte, ajoutez simplement la réponse @jamesthakid au troisième point pour la rendre plus claire. A travaillé pour moi merci.
NaXir
5
Qu'entendez-vous exactement par «changer toutes les déclarations de .h en #import»?
Chris Gunawardena
1

Je venais de dupliquer un schéma existant et d'ajouter une autre configuration au projet. J'ai dû ajouter une configuration avec le même nom au projet du framework afin qu'il soit également intégré dans le même DerivedData/($AppName)/Build/Products/($CONFIGURATION_NAME)dossier. Sinon, le fichier .framework n'est pas créé et ne peut donc pas être importé.

iMaddin
la source
1

J'ai rencontré le même problème aujourd'hui en essayant d'utiliser un pod écrit en Objective-C dans mon projet Swift, aucune des solutions ci-dessus ne semblait fonctionner.

Dans le podfile que j'avais use_frameworks!écrit. Le commentaire de cette ligne, puis la réexécution ont pod installrésolu ce problème pour moi et l'erreur a disparu.

Rikh
la source
1

(Mis à jour le 27 mai 2017)

Xcode 8. Swift Project - importation de l'objectif C.

Choses à savoir:

  1. Le fichier d'en-tête de pont DOIT être enregistré dans le dossier du projet. (c'est-à-dire pas enregistré au même niveau que .xcodeproj est enregistré, mais à la place un niveau plus bas dans les dossiers où tous vos fichiers c rapides et objectifs sont enregistrés). Il peut toujours trouver le fichier au niveau supérieur, mais il ne sera pas correctement lié et ne pourra pas importer des fichiers Objective C dans le fichier d'en-tête de pontage
  2. Le fichier d'en-tête de pont peut être nommé n'importe quoi, du moment qu'il s'agit d'un fichier d'en-tête .h
  3. Assurez-vous que le chemin dans Paramètres de construction> Compilateur Swift - Général> En-tête de pont Objective C pointe correctement vers le fichier d'en-tête de pont que vous avez créé.
  4. IMPORTANT: si vous obtenez toujours "introuvable", essayez d'abord de vider votre fichier d'en-tête de pontage et d'effacer toutes les importations que vous y avez actuellement écrites. Assurez-vous que le fichier d'en-tête de pontage peut être trouvé en premier, puis commencez à ajouter des importations objectif c à ce fichier. Pour une raison quelconque, il renverra la même erreur "non trouvé" même s'il est trouvé mais il n'aime pas l'importation que vous essayez pour une raison quelconque
  5. Vous ne devez #importer "MyBridgingHeaderFile.h" dans aucun de vos fichiers C objectif. Cela provoquera également une erreur "fichier non trouvé"
BennyTheNerd
la source
1
Tous ces points sont vérifiés et ont toujours le même problème: (D'autres points doivent-ils être pris en considération?
Amjad Husseini
@AmjadHusseini essaie de nettoyer les fichiers de votre projet puis effacez les données dérivées de votre projet puis redémarrez xCode. qui a fonctionné avec moi
Mohammad Allam
0

J'ai eu un problème similaire et une seule solution a fonctionné pour moi. J'ai essayé tout ce qui était suggéré, et je savais que j'avais bien réglé mon en-tête de pontage, car j'avais une autre bibliothèque qui fonctionnait.

Lorsque j'ai copié la bibliothèque (glisser-déposer) dans le projet, sans Cocoapods, ce n'est qu'après cela que je pouvais importer des en-têtes sans erreurs.

J'ai utilisé la bibliothèque facebook / Shimmer.

nja
la source
0

J'ai eu un problème similaire avec les pods. Essayant essentiellement d'exécuter mes tests d'interface utilisateur, Xcode s'est plaint de pods manquants. La solution à cela était beaucoup plus simple que toutes celles décrites ci-dessus:

  1. aller au fichier de projet (principal pas une cible)
  2. cliquez sur l'onglet "Info" (le plus à gauche)
  3. définir la configuration appropriée du pod pour la cible des tests d'interface utilisateur (section "Configurations" juste sous "Cible de déploiement")

Travail!

Je l'ai trouvé dans un fil: https://github.com/CocoaPods/CocoaPods/issues/2695

Cela ressemble un peu à un bug pour les cabosses de cacao, mais je peux voir les raisons pour lesquelles cela pourrait être un cas délicat.

Julian Król
la source
0

Dans mon cas, j'ai juste dû quitter le simulateur ...

Michal Shatz
la source
0

Nettoyer le projet, nettoyer le dossier de construction, redémarrer Xcode. Je viens de supprimer le chemin au projet goto> Paramètres de construction> Rechercher le mot-clé. Swift Compiler - Général -> L'en-tête de pont Objective-C a fonctionné pour moi.

Madavaram Ramesh
la source
0

Août 2019

Dans mon cas, je voulais utiliser un protocole Swift dans un fichier d'en-tête Objective-C qui provient de la même cible et pour cela j'avais besoin d'utiliser une déclaration avant du protocole Swift pour le référencer dans l'interface Objective-C. La même chose devrait être valable pour l'utilisation d'une classe Swift dans un fichier d'en-tête Objective-C. Pour utiliser la déclaration directe, consultez l'exemple suivant de la documentation sur Inclure les classes Swift dans les en-têtes Objective-C à l'aide des déclarations directes :

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

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