Swift与Object-C混编创建Framework,并引用cocopods(OC代码库)

自己在创建Framework的过程中踩了很多坑,特别是我们有一部分关键代码是 C++ 写的而且还需要引用第三方 Object-C 库就更坑了,把跳坑的方法写在这里。

创建Framework


Xcode->File->New->Project->Cocoa Touch Framework

我这里命名 TestUIKit

Swift与Object-C混编创建Framework,并引用cocopods(OC代码库)_第1张图片
创建Framework
Swift与Object-C混编创建Framework,并引用cocopods(OC代码库)_第2张图片
创建Framework

Swift创建 Framework 文件目录要求代码放进Sources文件夹,我们需要修改一下文件目录,将项目中的 TestUIKit实体文件夹改名成 Sources,前后对比图:

Swift与Object-C混编创建Framework,并引用cocopods(OC代码库)_第3张图片
修改目录
Swift与Object-C混编创建Framework,并引用cocopods(OC代码库)_第4张图片
修改目录

与此同时我们还需要在项目右侧的TARGETS->Build Setting里面修改Info.plist路径地址Sources/Info.plist

Swift与Object-C混编创建Framework,并引用cocopods(OC代码库)_第5张图片
Info.plist

创建 Object-C 类


创建一个CustomMath继承 NSObject 的类 执行一个 ➕ 方法

Swift与Object-C混编创建Framework,并引用cocopods(OC代码库)_第6张图片
CustomMath

如果我们在 Swift 项目中使用 Object-C 代码的话建立一个桥接文件 Bridging-header.h,在桥接文件中#import "CustomMath.h"就能在 Swift 中调用 OC 代码了,但是

Swift创建 Framework 是不允许使用桥接文件的(编译报错error: using bridging headers with framework targets is unsupported)
,怎么办?!

  • 第一种方法,按照文档中,为了让Swift文件访问Objective-C文件,我们应该在umbrella header,也就是TestUIKit.h中,暴露所需要的header。
Swift与Object-C混编创建Framework,并引用cocopods(OC代码库)_第7张图片
Public header
Swift与Object-C混编创建Framework,并引用cocopods(OC代码库)_第8张图片
umbrella header

然后你就可以在Swift代码中轻松的使用CustomMath类了

  • 第二种方法,如果你的Objective-C文件和接口并不想暴露可以采用modulemap。新建一个module.modulemap文件,内容如下:
modulemap
Swift与Object-C混编创建Framework,并引用cocopods(OC代码库)_第9张图片
import path

这里输入的路径是module.modulemap文件所在的路径。(这里面可以申明多个模块)

然后,删除TestUIKit.h(umbrella header)中#import 的OC header。

把OCSource.h的权限改回默认的project。

然后在需要使用的 Swift 类中导入头文件一样 import CustomMath 就能在 Swift 代码中愉快的使用 OC 代码了。使用module.modulemap方法原文移步

引入cocopods代码


我们用MBProgressHUD做例子,毕竟MBProgressHUD用法比较简单。
使用 cocopods 下载,然后打开workspace。

虽然上面说可以使用module.modulemap方法可以使用OC代码了,但是我测试了一下即使把MBProgressHUD.h的完整路径写进去 编译时依然无法将module MBProgressHUD编译成功,可能我的操作方式不对。

后来只能另辟蹊径了:创建一个OC类OCBridgingHeader将MBProgressHUD等其他需要的使用的OC类都在这里导入头文件

Swift与Object-C混编创建Framework,并引用cocopods(OC代码库)_第10张图片
OCBridgingHeader

在使用的地方 import OCBridgingHeader

Swift与Object-C混编创建Framework,并引用cocopods(OC代码库)_第11张图片
Used

最后还有一点,在合并真机和虚拟机库后,要将两者Modules文件夹中MaraTrackSDK.swiftmodule文件夹里所有的东西也合并,这样合并后的framework才真正的能在真机和虚拟机中使用!

Demo

你可能感兴趣的:(Swift与Object-C混编创建Framework,并引用cocopods(OC代码库))