制作OC与Swift混编的动态framework

2017-12-06

制作OC与Swift混编的动态framework

在iOS开发过程中,会遇到如下场景:

  1. 编写私有库。
  2. 私有库对内开放,对外需要打包成framework或static library。

注:制作Swift库需是动态framework,本篇介绍都针对framework来展开讨论。

在Cocoapods还未出现之前,开发都是使用Xcode来手动创建库工程,这种方式较原始且复杂,工程接入源码和framework来调试的步骤太多,不易管理和维护。
Cocoapods的出现帮助了开发者管理和创建依赖库,它简单易用,只需要简单的命令和配置就能导入第三方库,或是创建一个带有Demo且带有单元测试的库工程,这样便利的依赖库管理工具极大地提升了开发者的开发效率。

本文将介绍使用Cocoapods来制作OC与Swift的动态framework。
(Cocoapods有一个cocoapods-packager工具,需额外地安装,但实际使用中发现它不是这么的简单易用。)

以WtCore库工程来举例,打开WtCore.xcworkspace,工程目录结构如下:

command+B编译好后,可以右键Show in Finder找到WtCore.framework,目录结构如下:

  • Debug-iphoneos是真机的动态framework
  • Debug-iphonesimulator是模拟器的动态framework

将这2个framework合并成一个framework,同时对模拟器和真机进行支持。
拷贝这2个framework至tmp目录中,结构如下:

打开终端,进入到tmp路径下,执行以下命令来合并生成执行文件:

1
$ lipo -create ./Debug-iphoneos/WtCore.framework/WtCore ./Debug-iphonesimulator/WtCore.framework/WtCore -output WtCore

执行完后会在tmp目录中生成合并后的WtCore执行文件,可以使用如下命令查看可执行文件支持的架构:

1
$ lipo -info WtCore.framework/WtCore

合并完可执行文件后,继续执行以下命令:

1
2
3
$ cp -a Debug-iphoneos/WtCore.framework ./
$ mv -f WtCore WtCore.framework/WtCore
$ cp -a Debug-iphonesimulator/WtCore.framework/Modules/WtCore.swiftmodule/* WtCore.framework/Modules/WtCore.swiftmodule

此时tmp下的WtCore.framework就是我们要的OC与Swift混编动态framework,该framework依赖的第三方库并未打包到库中,第三方使用时需要额外导入,可以README.md中说明,或是使用Cocoapods来配置该framework的第三方依赖关系。

这种制作OC与Swift混合动态framework同样适用于制作独立OC或独立Swift的库工程。
最后附上Demo