Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Old libraries, new CocoaPods

Because CocoaPods 0.36 are availbable to anyone and they are now coming with Swift and Frameworks support I have one question that is bothering me today...

I create Podfile in my project directory, fill it with:

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'

pod 'AFNetworking'
pod 'SwiftyJSON'

And run pod install as usual... You know this story. But when I open my .xcworkspace and go to any ViewController and import SwiftyJSON it just works but when I try to do the same thing with AFNetworking I get No such module 'AFNetworking'. Of course, I can create a Bridging-Header and import it with the Objective-C way but when I read this blog post I can see:

To use this subspec in Swift, without a generated umbrella header, you would need to create a bridging header and use an import like #import <AFNetworking/AFNetworking+UIKit.h. With the generated umbrella header, you just need to import AFNetworking, if you have the subspec included in your Podfile.

Correct me if I'm wrong but I suppose that manual Bridging-Header is no longer needed if we add libraries with CocoaPods, right? So, why this isn't working?

like image 879
cojoj Avatar asked Dec 08 '22 05:12

cojoj


1 Answers

As I thought... This example which I provided in OP is incorrect... Well, basically it's correct because it's working like it should. Let me show you a counter example.

I have a Swift project but I want to use only Objective-C pods (AFNetworking, SSPullToRefresh etc.). Now we have some troubles because when you provide those Objective-C pods in Podfile they'll be added to Pods target as a static libraries. You probably now that CocoaPods are now switching to Frameworks (If you want to know the difference please read this question). Back to topic... There are two possible solutions to this conflict sitation:

  1. You manually create YourProject-Bridging-Header.h and #import those libraries... This is the old way used even before Swift integration.
  2. You include this magic use_frameworks! method call inside your Podfile. By doing this you force CocoaPods to create frameworks instead of static libraries.

Now, let me explain why you'd prefer the second solution... As OP states, CocoaPods now automatically create Umbrella Headers (learn about them). It's the convenient way for you to skip manual creation of bridging header.

I've found a solution here so without this post I would probably still be struggling with this problem. Cheers to the author!

like image 189
cojoj Avatar answered Dec 11 '22 09:12

cojoj