Swift Framework: en-tête de parapluie «[…] .h» introuvable

114

Dans un framework personnalisé contenant à la fois du code Objective-C et Swift , le compilateur Swift génère l'erreur suivante:

[build_path]/unextended-module.modulemap:2:19: error: umbrella header 'bugtest.h' not found
  umbrella header "bugtest.h"
                  ^
<unknown>:0: error: could not build Objective-C module 'bugtest'
Tim Bodeit
la source

Réponses:

240

Cela se produit généralement après un changement de nom de projet ou quelque chose du genre. Le problème est que l'en-tête parapluie n'est plus répertorié comme un en- tête public . Vérifiez l'image ci-jointe pour voir comment résoudre ce problème.

Réparer

arturgrigor
la source
7
Juste une note aux futurs lecteurs que pour voir la section «En-têtes» de «Phases de construction», vous devez cliquer sur une cible de pod. La cible principale de l'application ne répertorie pas de section "En-têtes".
shmim
3
Cela l'a totalement réglé. Je vous remercie. Cela devrait être la réponse approuvée.
Gujamin
16
Pour moi, le niveau d'accès était public, mais il échoue également sur le parapluie introuvable. J'ai déplacé la section "En-têtes" des "Phases de construction" vers le haut et cela a commencé à fonctionner.
Aleksei Minaev
6
Mon en-tête parapluie était déjà public. Déplacer la section vers le haut n'a pas non plus aidé.
Rafael Bugajewski
1
J'avais un problème similaire lorsque Carthage a mis à jour l'un de mes frameworks importés. Je suppose que XCode a du mal à garder un œil sur les changements de chemin de framework référencés. Le redémarrage simple de XCode a résolu le problème pour moi.
Tony
48

Dans Xcode 7 Beta, avec Swift 2, cela se produira également si votre Framework Header n'est pas déclaré comme "Public"

Par exemple, j'avais un Cocoa Touch Framework avec une visibilité "Projet" pour le fichier d'en-tête, et l'erreur "Umbrella Header ... not found" pour tous les fichiers Swift de mon projet, une fois que j'avais l'en-tête "Public", le l'erreur est partie

Claude Houle
la source
1
Dans mon cas, lorsque j'ai rencontré ce problème, cette réponse m'a semblé être la réponse «plus correcte», et cela a fonctionné pour moi.
greymouser le
1
Je suis d'accord. C'est la bonne réponse. Vérifiez que le fichier <projet> .h a l'appartenance cible et le niveau d'accès (public) appropriés.
user965972
@ Shadow_x99 comment définir l'en-tête comme "Public", ma question est postée sur stackoverflow.com/questions/36084291
...
Il s'agit en fait d'une variante de la réponse de @ arturgrigor, sauf que Xcode effectue le changement lui-même. Le résultat final devrait être le même.
original_username
40

Cela peut se produire de 4 manières différentes, en ignorant les bogues des versions précédentes de Xcode

  • Vous n'avez pas d'en-tête parapluie nommé $ (TARGET_NAME) .h dans votre projet
  • Vous avez un en-tête parapluie, mais il n'est pas défini comme public. Voir la réponse d'arturgrigor
  • DEFINES_MODULE n'est pas réglé sur YES
  • CLANG_ENABLE_MODULES n'est pas réglé sur YES
Claus Jørgensen
la source
3
Une 5ème cause que je viens de trouver: parapluie_header.h lui-même ne doit être vérifié dans aucune cible (tout comme Info.plist)
nalexn
3
J'ai tout réglé correctement dans cette liste, mais cela échoue.
Erik Aigner
25

Cela se produit lorsque le Always Search User Pathsparamètre est activé pour la cible Framework.

Le paramétrer sur Norésoudra cette erreur.

IMHO c'est un bogue dans le compilateur Swift et j'ai déposé un radar avec Apple.
Voir rdar: // 21038443

Tim Bodeit
la source
1
Merci! C'est aussi celui qui m'a attiré.
Chris Hatton
Cela a fonctionné pour moi. Un symptôme supplémentaire est qu'il a échoué immédiatement après un nettoyage, mais a réussi si vous avez réessayé sans nettoyage.
Ben Leggiero
18

Pour moi, le niveau d'accès était public, mais il échoue également sur le parapluie introuvable. J'ai déplacé la section "En-têtes" des "Phases de construction" vers le haut et cela a commencé à fonctionner. Script vers podfile:

post_install do |installer|
installer.pods_project.targets.each do |target|
    phase_name = 'Headers'
    target.build_phases.each do |phase|
        if (phase.display_name.include? phase_name)
            target.build_phases.unshift(phase).uniq! unless target.build_phases.first == phase
        end
    end
end

Je n'ai aucune idée de pourquoi cela se produit. J'ai essayé des projets factices - cela ne se produit pas. Uniquement sur les gros avec plusieurs dépendances. Quelque chose avec la compilation AVANT de copier les en-têtes parapluie.

Aleksei Minaev
la source
4
Déplacer les "En-têtes" au-dessus de "Compiler les sources" a fonctionné pour moi. xCode 8.2.1.
Rob Paterson
Déplacer la phase des en-têtes vers le haut a également fonctionné pour moi.
Søren Mortensen
PodfileFichier non valide : erreur de syntaxe, fin de saisie inattendue, attente de keyword_end.
Volodymyr Kulyk
13

Vous devez certainement définir votre framework sur public:

entrez la description de l'image ici

Bartłomiej Semańczyk
la source
1
Fonctionne parfaitement. Merci beaucoup!
kkiermasz
Quel est le contexte de cette capture d'écran? Sur quoi cliquez-vous pour y arriver?
pkamb
7

Pour moi, le réglage "Utiliser les cartes d'en-tête" sur "NON" a résolu le problème

xySVerma
la source
… Et dans mon cas, le régler sur OUI a résolu le problème. Malheureusement, il ne semble pas y avoir de documentation sur ce paramètre, mais oui est la valeur par défaut et je ne sais pas pourquoi il a été défini sur non pour l'une de mes cibles.
robotspacer
7

Une autre solution: après avoir renommé un dossier, l'ancien emplacement peut toujours être répertorié dans le fichier de projet pour le fichier .h, même si vous avez mis à jour l'emplacement via la barre latérale de Xcode. Cet ancien emplacement provoque l'erreur d'en-tête parapluie.

Solution simple: supprimez la référence au fichier .h et ajoutez à nouveau. (et n'oubliez pas de le rendre à nouveau public!)

Danra
la source
5

J'ai trouvé qu'avec le nouveau système Swift Build et Parallelize Build activés le schéma, j'obtiendrais des erreurs comme dans cette question. La solution consistait à créer un lien vers des frameworks qui avaient été importés dans les fichiers source swift. (Je pense qu'avant, l'application se construirait parce qu'il venait juste de se produire que les cadres étaient liés à quelque chose de construit précédemment dans la file d'attente de construction en série).

J'ai écrit un script pour parcourir toutes les importations dans toutes les cibles d'un espace de travail et m'assurer que leurs cadres ont été liés à cette cible.

https://github.com/Jon889/SwiftImportChecker

Jonathan.
la source
4

Il y a déjà d'excellentes réponses ici. @ Shadow_x99 a été très utile. Cependant, si je pouvais être autorisé à compléter avec ma propre expérience.

Un en-tête parapluie est identifié automatiquement dans le processus de construction. Ce n'est pas un spécifié dans les paramètres de construction de la cible ou hérité des paramètres du projet.

Donc, pour éviter cette erreur qui - à partir de XCode 7 - est comme suit;

warning: no umbrella header found for target 'MyTarget', module map will not be generated

deux mesures importantes doivent être prises.

Tout d'abord, l'en-tête parapluie doit avoir le même nom que la cible . Donc, si votre cible est un framework nommé MyTarget, il doit y avoir un en-tête nommé MyTarget.h.

Deuxièmement, dans les phases de construction pour MyTarget- comme mentionné dans cette réponse - ce fichier d'en-tête doit être répertorié dans la section publique comme détaillé ci-dessus.

Max MacLeod
la source
1

J'ai eu le même problème et aucune des réponses suggérées n'a aidé dans mon cas, donc je laisse ceci ici au cas où quelqu'un aurait le même problème.

J'avais ajouté un "Run script" dans "Build phases" mais j'ai fini par le supprimer et c'est là que j'ai commencé à avoir l'erreur.

Ma solution a fini par devoir nettoyer le projet, reconstruire mon framework, puis mon projet d'application construit correctement.

Ana Figueira
la source
1

D'après mon expérience, vous devez choisir sur les cibles le cadre qui vous donne l'erreur, pas la cible du projet.
Ensuite, compilez et après la compilation, il sera disponible sur la cible du projet.

Eironeia
la source
0

Si vous utilisez Xcode 7.1 et CocoaPods 0.39, il semble y avoir un changement rapide du compilateur qui affecte certains CocoaPods (Nimble, Quick, etc.) Essayez certaines des solutions spécifiées dans ce fil: https://github.com/ CocoaPods / CocoaPods / issues / 4420 cependant, si aucun d'eux ne fonctionne, essayez d'utiliser Xcode 7.0.1 ou 7.2 beta. Vous pouvez obtenir les deux ici: https://developer.apple.com/downloads/ .

Edit: Dans mon cas, pour résoudre le problème, j'ai également dû rétrograder CocoaPods à 0.38.2.

Modification ultérieure: il ne semble pas être lié à Xcode 7.1. Le simple fait de rétrograder CocoaPods à 0.38.2 devrait aider:

sudo gem uninstall cocoapods -v 0.39
sudo gem install cocoapods -v 0.38.2
Marius
la source
Merci @Marius Ursache. Suivre vos instructions a résolu le problème pour moi.
Vick Swift du
0

Votre fichier d'en-tête doit se trouver dans la section [Build Phases / Headers / Public].

Si votre fichier d'en-tête est déjà dans la section [Build Phases / Headers / Public], plusieurs fois la mise en jachère a résolu mon problème:

  1. nettoyer le projet
  2. déplacer le fichier d'en-tête vers la section "privé" ou "projet"
  3. déplacer le fichier d'en-tête vers la section "public"
  4. tout reconstruire à nouveau
Andrei A.
la source
Wow, c'est le seul qui a fonctionné sur ces dizaines de réponses et il semble que ce serait le moins probable, merci!
Paolo
0

J'ai résolu ce problème en renommant mon module.modulemap en moduleXYZ.modulemap et en modifiant le nom du fichier modulemap dans les paramètres du projet

retterdesapok
la source
0

Dans mon cas, je viens de construire le cadre spécifique avec son schéma. Et puis reconstruisez l'ensemble du projet et cela a résolu le problème

Hudi Ilfeld
la source
0

assurez-vous que les "chemins d'importation" dans les paramètres de construction incluent le fichier que vous essayez d'inclure

Petit gardien
la source
-1

Supprimez ces fichiers du répertoire du projet. .xcworkspace pods/etpodfile.lock

mettez à jour le pod et générez le projet.

Subhash
la source
-1

Je l'ai corrigé en définissant le mode de compilation des paramètres de construction du framework problématique sur Incrémental.

Ghislain Leblanc
la source
-1

Dans mon cas, le problème a été causé par le script de suppression des en-têtes dans les phases de construction

function removeHeaders() {  
    find $BUILD_ROOT/...  -name '*.h' -exec rm -f {} \;  
}  
removeHeaders

La suppression de ce script a résolu le problème.

phnmnn
la source
-2

Aucune des 9 réponses ne m'a aidé, j'ai donc essayé de créer un nouveau projet que je pourrais envoyer à Apple pour signaler un bogue. J'ai été surpris de ne pas pouvoir reproduire le problème. J'ai vérifié les paramètres de construction et ils étaient équivalents. Apparemment, c'est une sorte de bug.

Si rien d'autre ne vous aide , essayez de créer un nouveau projet et importez au moins quelques classes Objective C & Swift de votre projet actuel, comparez les paramètres de construction liés à votre framework aux valeurs par défaut du nouveau projet, et finalement déplacez tous les fichiers vers le nouveau projet.

Rafael Bugajewski
la source
-2

J'y travaille depuis une journée entière, mais ça vaut le coup. J'ai essayé toutes les méthodes ici, mais je ne l'ai pas résolu. J'ai créé un nouveau projet, une expérience, et j'ai découvert que le chemin de recherche de l'en-tête de l'utilisateur était réglé $ {SRCROOT} récursif , et je l'ai changé en $ {SRCROOT} non récursif , changé le chemin de l'en-tête de pontage (par exemple #import "SVProgressHUD.h" -> #import "Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h"), le l'erreur est partie.

ShengBo.Cai
la source