Swift与Object-C混编创建Framework,并引用c
自己在创建Framework的过程中踩了很多坑,特别是我们有一部分关键代码是 C++ 写的而且还需要引用第三方 Object-C 库就更坑了,把跳坑的方法写在这里。
创建Framework
Xcode->File->New->Project->Cocoa Touch Framework
我这里命名 TestUIKit
创建Framework 创建FrameworkSwift创建 Framework 文件目录要求代码放进Sources文件夹,我们需要修改一下文件目录,将项目中的 TestUIKit实体文件夹改名成 Sources,前后对比图:
修改目录 修改目录与此同时我们还需要在项目右侧的TARGETS->Build Setting里面修改Info.plist路径地址Sources/Info.plist
创建 Object-C 类
创建一个CustomMath继承 NSObject 的类 执行一个 ➕ 方法
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代码中轻松的使用CustomMath类了
- 第二种方法,如果你的Objective-C文件和接口并不想暴露可以采用modulemap。新建一个module.modulemap文件,内容如下:
这里输入的路径是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类都在这里导入头文件
OCBridgingHeader在使用的地方 import OCBridgingHeader
Used最后还有一点,在合并真机和虚拟机库后,要将两者Modules文件夹中MaraTrackSDK.swiftmodule文件夹里所有的东西也合并,这样合并后的framework才真正的能在真机和虚拟机中使用!