128

Following instructions, I've created a bridging header and added to my project. Unfortunately, the following error occurred:

:0: error: could not import Objective-C header '---path--to---header/....h'

Screenshot 1

In build settings I added header search path string to the location of bridging header, but nothing helped.

Has anyone experienced this problem?

Christophe
  • 68,716
  • 7
  • 72
  • 138
Nikita Semenov
  • 2,111
  • 4
  • 18
  • 31
  • You could rather than add the header file yourself. Use the New File.. to add a new blank Objective-c .m file. This will make xcode offer you a header-bridge file where you can add your imports. You can then delete the .m file you just added – markhunte Jun 10 '14 at 18:45
  • Yep, i've tried this way certainly too, but nothing helped – Nikita Semenov Jun 10 '14 at 18:58
  • Is this on a fresh project or the same one you did by hand? – markhunte Jun 10 '14 at 19:10
  • It's on fresh project, i've aded Keychain support wrapper, that i once wrote on OBJC – Nikita Semenov Jun 10 '14 at 19:17
  • Sorry. Not sure what you mean by the added Keychain support wrapper. But I notice you are on iOS do you get the same thing with an OSX project which is what I have been using – markhunte Jun 10 '14 at 19:27
  • Didn't try OS X honestly, has anyone already successfully ported Obj-C code in swift via bridging header technique? – Nikita Semenov Jun 11 '14 at 09:03
  • I'm sure there must be or we world have heard more about it. I have partially done it in answering another question I used it to import a iTunes.h file for scripting bridge. But I have not fully tested it. – markhunte Jun 11 '14 at 16:43

19 Answers19

155

Be careful to add the file to the folder that your error is complaining! I've made the same mistake, if you create the file from Xcode, it will go to the folder: Project->Project->Header.h

And Xcode is looking for Project->Header.h

That means you need to put the file inside your project folder (ProjectName->ProjectNameFolder)!

UPDATED: I'm not sure if I got what you mean, but try this to solve your problem:

  1. Delete all your bridging files that you created until now.
  2. Select the main folder of project and hit new file->iOS->Header file.
  3. Write your imports in the header file created.
  4. Select the project inside Xcode->Build Settings, type in search field: bridging and put in the key SWIFT_OBJC_BRIDGING_HEADER the name of your header file or the path to it!

If you follow this steps, your header file will be created at the correct location!

starball
  • 20,030
  • 7
  • 43
  • 238
Renan Kosicki
  • 2,890
  • 2
  • 29
  • 32
  • Well, i just tried this method, the header is really visible, but, unfortunately, bridging Obj-C classes are still invisible ( after including them in bridging header ) – Nikita Semenov Jun 25 '14 at 10:09
  • 11
    At first the answer says "Need to put the file at the same level of xcodeproj", at the end, it says "ensure the file is ...not in the same level of xcodeproj". Why? – Boon Oct 06 '14 at 20:25
  • 4
    I meant that the file must be located inside de subfolder of project, not at the same level as xcodeproj. Example: In the folder of your project you have project, project.xcodeproj and projecttests. The file must be inside project folder :) – Renan Kosicki Oct 07 '14 at 12:01
  • 1
    guys for me I had to ./PATHTOBRIDGINGHEADER/BRIDGINGHEADER – kareem Apr 10 '15 at 00:48
  • 6
    I tried everything but nothnig works for me. This is very irritating. I am working with xcode 8 and swift 3. Can you help me – Hardik Shah Oct 15 '16 at 11:44
  • 2
    I'm confused you say "That means you need to put the file at the same level of xcodeproj!" but after you said "Ensure that the file is located inside the main folder of the project not in the same level of xcodeproj!" which one is it? – Lightsout Mar 23 '17 at 01:39
  • 1
    @bakalolo, you're correct, I've edited the answer. You should put it inside your project folder. The important thing is to keep the build settings (Objective-C Bridging Header section) with the same path as your bridge file! – Renan Kosicki Mar 24 '17 at 17:16
  • 1
    AWESOME! WORKS LIKE A CHARM! :D – Mohsin Khubaib Ahmed Oct 11 '17 at 09:31
  • the mangled English here makes it completely impossible to figure out what's going on. I wish an editor would clean this up. – johnrubythecat Dec 01 '17 at 08:56
  • doesn't mean a thing in xcode 9: SWIFT_OBJC_BRIDGING_HEADER – johnrubythecat Dec 05 '17 at 21:17
68

In my case this was actually an error as a result of a circular reference. I had a class imported in the bridging header, and that class' header file was importing the swift header (<MODULE_NAME>-Swift.h). I was doing this because in the Obj-C header file I needed to use a class that was declared in Swift, the solution was to simply use the @class declarative.

So basically the error said "Failed to import bridging header", the error above it said <MODULE_NAME>-Swift.h file not found, above that was an error pointing at a specific Obj-C Header file (namely a View Controller).

Inspecting this file I noticed that it had the -Swift.h declared inside the header. Moving this import to the implementation resolved the issue. So I needed to use an object, lets call it MyObject defined in Swift, so I simply changed the header to say

@class MyObject;
shim
  • 9,289
  • 12
  • 69
  • 108
Daniel Galasko
  • 23,617
  • 8
  • 77
  • 97
  • 1
    This is silly but moving it to implementation file worked for me too. Unfortunately I needed it in the header because my class implements a delegate defined in a swift file. But since obj-c doesn't care if my class actually implements the delegate when I pass it in, I'll settle with this. But ideally there'd be another way – Oren Jun 27 '15 at 02:27
  • You may also have to check the imports of the one you're bringing into the bridging header. If any of those imported classes have a reference to the "-Swift.h" file you'll have to move the declaration to the .m. – Kyle Carruthers Jun 15 '17 at 10:44
30

Find the path at:

Build Settings/Swift Compiler-Code Generation/Objective-C Bridging Header

and delete that file. Then you should be ok.

Matt Fenwick
  • 48,199
  • 22
  • 128
  • 192
variadics
  • 370
  • 2
  • 5
18

This will probably only affect a small percentage of people, but in my case my project was using CocoaPods and one of those pods had a sub spec with its own CocoaPods. The solution was to use full angle imports to reference any files in the sub-pods.

#import <HexColors/HexColor.h>

Rather than

#import "HexColor.h"
Kyle Clegg
  • 38,547
  • 26
  • 130
  • 141
16

For me deleting the derived data fixed it , I noticed even if I check out from an old commit, the same issue happens.

You can reach that option form Window-> Projects .

M.Othman
  • 5,132
  • 3
  • 35
  • 39
10

"we need to tell Xcode where to look for the header files we’re listing in our bridging header. Find the Search Paths section, and change the project-level setting for User Header Search Paths, adding a recursive entry for the ‘Pods’ directory: Pods/** " http://swiftalicio.us/2014/11/using-cocoapods-from-swift/

Onnmir
  • 1,030
  • 14
  • 17
9

For me it was because I forgot to add it to the Target's Build Settings.

enter image description here

Roland Keesom
  • 8,180
  • 5
  • 45
  • 52
6

I've also experienced this problem and sadly it is just a bug in the SDK + Xcode. I talked to an engineer at WWDC, about this and a few other problems I was having with CloudKit. These bugs will be addressed in the next seed of Xcode.

It's the fun part about using beta software.

douglas bumby
  • 324
  • 1
  • 4
  • 13
  • 1
    Yeah, it's frustrating. My team and I was working trying to figure out an NSURL problem with CloudKit and we couldn't figure out why we were getting errors, turns out it was a server side problem by apple. we couldn't even do anything. wasted so much time. haha. – douglas bumby Jun 10 '14 at 17:15
  • 5
    The issue can actually be resolved by placing the header in the correct location. What worked for me is calling the header Project-Bridging-Header.h and placing it in the root of my project folder tree (as a sibling of my main Xcode project file). See @renan-kosicki answer – j b Jun 23 '14 at 21:55
  • 1
    Fixed in an Xcode update, this was caused because of an issue with the early betas. – douglas bumby Jan 27 '15 at 01:52
3

for others who have troubles to add swift class into objective-c project. this is what work for me :

  1. create NEW swift file. this will make xcode to prompt if you want xcode to create all settings for mix swift-objective-c project including brigde-header.h for you. press yes.
  2. now, add your existing swift files you want to use in your project.
  3. in the implementation file you are going to use the swift class add : #import "YOURPROJECTNAME-swift.h" . this file xcode create for you. if your xcode project is myProject then "myProject-swift.h"

and that's it. now create the swift class in your code like it was objective-c.

user1105951
  • 2,259
  • 2
  • 34
  • 55
3

I imported in some files from bridgin header files from cocoapods not in a proper way.

Instead of importing

#import <SomeCocoaPod/SomeCocoaPod.h>

I wrote

#import "SomeCocoaPod.h"

And this was my HUGE mistake

Nikolay Shubenkov
  • 3,133
  • 1
  • 29
  • 31
2

Add a temporary Objective-C file to your project. You may give it any name you like.

Select Yes to configure an Objective-C bridging header.

Delete the temporary Objective-C file you just created.

In the projectName-Bridging-Header.h file just created, add this line:

'#import < GoogleMaps/GoogleMaps.h >'

Edit the AppDelegate.swift file:

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

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

    return true
}

Follow the link for full sample

Atul Kaushik
  • 5,181
  • 3
  • 29
  • 36
2

For me it was not selecting 'Copy items if needed' in destination path while adding the framework. Simply re-add the framework with this option selected.

Daisy R.
  • 633
  • 1
  • 7
  • 19
1

After initial few days of struggle, I finally managed to successfully integrate Facebook signup to my iOS app. Here are the steps(I am assuming you have already installed Facebook SDK v4.1 or above in your machines):

  1. Add the Facebook frameworks - FBSDKCoreKit,FBSDKLoginKit under your project.
  2. Make no changes in the Build settings as FB SDK v4.1 and above doesn't need anymore bridging header files.
  3. Import the FBSDKCorekit, FBSDKLoginKit in ViewController.swift, AppDelegate.swift files
  4. Add informations in the pList as mentioned here

  5. Build your app. And wohoo! no compile time errors.

  • 2
    This answer would be better if you included details from the linked page. If the linked page changes or the link ceases to work, people reading this answer will not know what to do when they come across step 4. – TNT Nov 20 '15 at 16:11
1

I have the same issue for different reason , here is my case I build project that needs slide menu to be included , I am using SWRevealViewController lib to approach that

when I import the library files I add sub-folder(SWRevealViewController) under Supporting Files for .h && .m files , it fire two errors , cant import bridge and SWRevealViewController.h is not found .

How I fix it

when I move files to Supporting Files directly (delete sub-folder) , SWRevealViewController.m automatically added to Build Phases --> Compile Sources and issue is gone

enter image description here

Mina Fawzy
  • 20,852
  • 17
  • 133
  • 156
1

Had similar issue that could not be solved by any solution above. My project uses CocoaPods. I noticed that along with errors I got a warning with the following message:

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'

enter image description here

So solution was quite simple. For Pods project, change Build Active Architecture Only flag to No and original error went away.

mike.tihonchik
  • 6,855
  • 3
  • 32
  • 47
1

I experienced that kind of error, when I was adding a Today Extension to my app. The build target for the extension was generated with the same name of bridging header as my app's build target. This was leading to the error, because the extension does not see the files listed in the bridging header of my app.

The only thing You need to to is delete or change the name of the bridging header for the extension and all will be fine.

Hope that this will help.

Georgi Boyadzhiev
  • 1,351
  • 1
  • 13
  • 18
0

I actually created an empty OSX Source Objective C file under the project (where all my swift files are).

I added the imports and then deleted the .m file.

zevij
  • 2,416
  • 1
  • 23
  • 32
0

Amongst the other fixes, I had the error come up when I tried to do Product->Archive. Turns out I had this :

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

After setting it in that last line, it worked.

nevster
  • 6,271
  • 7
  • 35
  • 42
0

Set Precompile Bridging Header to No fix the problem for me.

abelhoang
  • 271
  • 4
  • 14
  • 1
    Why the downvotes? It's a legit solution for some people. I've benchmarked doing iterative builds with this on and off on a large project and see no difference at all (Apple has seen up to 30% speedups), but the amount of time I lose clearing build files and building from scratch is substantial – Alexandre G Feb 28 '18 at 01:08