web-dev-qa-db-fra.com

Obtenir "fichier non trouvé" dans Bridging Header lors de l'importation de frameworks Objective-C dans un projet Swift

J'ai un projet Swift pour lequel j'essaie d'importer des frameworks basés sur ObjC. La structure est située dans un répertoire sous le chemin du projet et est référencée par le projet dans Xcode. Il est également ajouté au "Lien binaire avec les bibliothèques" dans la page "Construire les phases" du projet.

Cependant, pour une raison quelconque, je ne peux pas sembler inclure le cadre dans le fichier Bridging-Header. Je reçois 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 que je manque quelque chose, donc si quelqu'un a des indices, ce serait génial.

79
Dia Kharrat

Trouvé une solution:

  • Le paramètre "En-tête de pontage Objective-C" (aussi appelé Swift_OBJC_BRIDGING_HEADER) doit être défini au niveau cible et PAS au niveau projet. Assurez-vous de supprimer la valeur du paramètre au niveau du projet.

(pour moi, cela ressemble à un bug de Xcode, puisque je ne sais pas pourquoi il le corrige).

68
Dia Kharrat

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

54
jamesthakid

Je devais ajouter mon répertoire lib dans les chemins de recherche de l'en-tête de l'utilisateur:

test target settings - user header search path

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

(J'utilise Xcode 6.2 sur Mavericks 10.9.5)

23
Rainer Schwarze

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

Installer:

  • Cible de l'application, tout le code Obj-C
  • Cible de test unitaire avec un seul cas de test Swift 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 Swift, après un nettoyage (ou sur la machine d'un coéquipier), nous avons constaté cette erreur lors de la construction de la cible de test unitaire.

Ce problème a été résolu en ajoutant une classe factice Obj-C à la cible de test unitaire.

18
Dan Jackson

Cela a en quelque sorte fait le tour pour moi:

  • Projet propre
  • Dossier de construction propre
  • Redémarrer Xcode
5
Hlung

C’est un peu étrange, mais je suppose que vous devez ajouter une ressource à la phase "Copier les ressources du bundle" de votre cible de test pour lui permettre de charger tous les en-têtes de votre cible principale. Dans mon cas, j’ai ajouté main.storyboard et il s’est occupé de l’erreur.

enter image description here

4
Yas T.

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

4
Nicoara Talpes

Si aide quelqu'un. 

Dans mon cas, mes fichiers obj-c ont été ajoutés à un dossier de référence (les dossiers bleus dans xcode) et l’en-tête ne les a pas trouvés . Je viens d’ajouter les fichiers, pas le dossier, du Finder au xcode et à les résoudre.

3
DaSilva

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. Mon extension aujourd’hui n’inclut pas Parse, mais comme elle était définie dans l’en-tête de pontage, elle tentait de la rechercher. J'ai créé un nouvel en-tête de pontage pour mon extension Today et l'erreur a disparu.

2
fisher

J'ai eu un problème et résolu après 2 heures passées à chercher. Mon environnement comme ci-dessous:

cocoapod 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 dans Build Setting, l’entête de pontage Objective-C doit être: nom_projet/your_bridging_header.h
  3. Dans your_bridging_header.h , remplacez toutes les déclarations de .h par #import
  4. Dans la classe qui est utilisée your_3rd_party . Déclarez importez votre_3rd_party
2
Ryan Le

Mon cadre fonctionnait auparavant et a soudainement cessé de fonctionner, et aucune de ces réponses ne fonctionnait pour moi. J'ai supprimé le cadre de construction dans Phases de construction> Lier le binaire avec des bibliothèques et l'a ajouté de nouveau. J'ai recommencé à travailler.

1
James

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

pod install
1
Ankit Goel

Je venais de dupliquer un schéma existant et d'ajouter une autre configuration au projet. J'ai dû ajouter une configuration portant le même nom au projet de la structure pour que celui-ci puisse également créer le même dossier DerivedData/($AppName)/Build/Products/($CONFIGURATION_NAME). Sinon, le fichier .framework n'est pas créé et ne peut donc pas être importé.

1
iMaddin

(Mise à jour du 27 mai 2017)

Xcode 8. Swift Project - importation d'Objectif C.  

Choses à savoir:

  1. Le fichier d'en-tête de pontage DOIT être enregistré dans le dossier du projet. (c.-à-d. pas enregistré au même niveau que .xcodeproj, mais à un niveau plus bas dans les dossiers où tous vos fichiers Swift et Objective C 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 de fichiers Objective C dans le fichier d’en-tête de pontage.
  2. Le fichier d'en-tête de pontage peut porter n'importe quel nom, à condition qu'il s'agisse 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 pontage Objective C pointe correctement vers le fichier d'en-tête de pontage que vous avez créé.
  4. IMPORTANT: si vous obtenez toujours "introuvable", essayez d’abord de vider votre fichier d’entête de pontage et d’effacer toutes les importations que vous avez écrites à cet endroit. Assurez-vous que le fichier d'en-tête de pontage peut être trouvé en premier, puis ajoutez des importations Objective C à ce fichier. Pour une raison quelconque, il renverra la même erreur "introuvable" même s'il est trouvé mais il n'aime pas l'importation que vous essayez pour une raison quelconque
  5. Vous ne devez pas #importer "MyBridgingHeaderFile.h" dans aucun de vos fichiers Objective C. Cela provoquera également une erreur "fichier non trouvé"
1
BennyTheNerd

J'ai rencontré le même problème aujourd'hui lorsque j'essayais d'utiliser un module écrit en Objective-C dans mon projet Swift. Aucune des solutions ci-dessus ne semblait fonctionner. 

J'ai écrit use_frameworks! dans le fichier podfile. Commenter cette ligne puis exécuter pod installagain a résolu ce problème pour moi et l’erreur a disparu. 

1
Rikh

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

Chaque configuration utilise le jeu de configurations généré par les cocoapods, de sorte que ces éléments doivent correspondre.

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

0
rgkobashi

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

0
Madavaram Ramesh

Août 2019

Dans mon cas, je souhaitais utiliser un protocole Swift dans un fichier d’en-tête Objective-C provenant de la même cible. Pour ce faire, j’avais besoin d’une déclaration forward du protocole Swift pour le référencer dans l'interface Objective-C. Il en va de même pour l'utilisation d'une classe Swift dans un fichier d'en-tête Objective-C. Pour utiliser la déclaration forward, voir l'exemple suivant tiré de docs à Inclure Swift Classes dans les en-têtes Objective-C à l'aide des déclarations forward :

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

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

Dans mon cas, je devais quitter le simulateur ...

0
Michal Shatz

J'ai eu le même problème et une seule solution a fonctionné pour moi. J'ai essayé tout ce qui était suggéré, et je savais que je réglais bien 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 j'ai pu importer des en-têtes sans erreurs.

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

0
nja

J'ai eu un problème similaire avec les gousses. Essentiellement, en essayant d'exécuter mes tests d'interface utilisateur, Xcode s'est plaint des pods manquants. La solution à cela était bien plus simple que toutes les solutions décrites ci-dessus:

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

Travail!

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

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

0
Julian Król