需求
- 有一个工程
test.project,接入了自写的SDKSDK.framework,SDK.framework里同时有引用另外自写的other.framework,每次都要一一添加,于是想把other.framework融合进SDK.framework,以后只需要添加一次就好了。
思路
思路1
-
SDK.framework和other.framework,进行多工程联调。把other.framework当作SDK.framework的子静态库,拿到重新封装后的SDK.framework给工程test.project用。如图-1:- 结果:
- 直接运行
test.project,报错。 - 把
other.framework也导入test.project中,运行成功。如图-2: -
test.project的products文件夹,右键show in finder,发现SDK.framwork和other.framework并没有融合。如图-3:
- 直接运行
- 结论:这只是在
SDK.framework中引用other.framework联调的常规操作,并没有融合,需要在工程test.project中导入other.framework才能正确运行,与需求不符。
图-1
图-2
图-3
- 结果:
思路2
- 把
other.framework变成other.a,把other.a融合进SDK.framework中,再把重新封装后的SDK.framework给工程test.project用。如图-4:- 结果:
- 工程
test.project只导入SDK.framework,运行成功! -
test.project的products文件夹下,用命令class-dump导出test.app的.h,发现静态库other.a头文件也在里面,SDK.framework的确融合了other.a。如图-5:
- 工程
- 结论: 静态库
other.a完全融合进SDK.framework。符合需求。
图-4
- 结果:
如何把 . framework变成 . a
情况1
-
other.framework直接修改成other.a。步骤:-
framework只是个文件夹,打开other.framework,找到同名的/无后缀的文件other,直接改名->other.a,选择添加该扩展名到文件末尾,拖到SDK.framework中引用。 - 打开
other.framework,找到Headers文件夹,拖到SDK.framework中引用。 - 融合,编译后的
SDK.framework拖到test.project中引用 - 运行
test.project,完成。
-
情况2
-
other.framework和SDK.framework都是自己写的。会出现以下几种情况比较麻烦:- 每次修改
other.framework后,要手动按照情况1,把other.framework->other.a,进行融合,太麻烦。 - 把
other.framework和SDK.framework进行联调,是可以实时得到最新的other.framework,随时联调。但是这种方式,test.project需要同时拖入other.framework和SDK.framework,这样又不是本文的需求。
- 每次修改
- 思路:
-
.framwork和.a都是静态库,本质上是一回事。 - 上面
情况1,说明添加一下后缀就能实现.framework->.a。反过来去掉后缀,就变成了framework中的二进制文件。
-
- 猜测:
- 那么我们建立一个静态库工程应该可以同时得到
.framework和.a两种不同后缀的静态库。(如图-5):
图-5
- 那么我们建立一个静态库工程应该可以同时得到
- 实践:
- 按照建立一个
framework静态库的方法,建立一个叫other.framework的工程,工程自动生成一个target--->other。 - 在工程上,新添加一个
target叫libtest。如图-6/图-7: - 运行静态库工程,成功,得到静态库
liblibtest.a。如图-8: -
show in finder,发现不仅有other.framework,而且libtest.a和头文件还是齐全的。 - 按照常规导入
.a静态库方法,把libtest.a静态库导入SDK.framework,联调成功! -
情况2完成。
图-6
图-7
图-8
- 按照建立一个
细节修改
- 按照常规静态库工程方法,target
libtest->Build Phases->Headers/Copy Fiels,选择暴露libtest的.h文件 - 按照常规静态库工程方法,target
libtest->Build Phases->Compile Sources,选择libtest参与编译的.m文件 - 设置target
libtest,最高支持的iOS版本:targetlibtest->Build Settings->Deployment->iOS Deployment Target->iOS10.xxx - 设置target
libtest,最高支持的iOS版本:targetlibtest->Build Settings->Deployment->iOS Deployment Target->iOS10.xxx - 设置target
libtest头文件输出路径:targetlibtest->Build Settings->Packaging->Public Headers Folder Path->$(CONTENTS_FOLDER_PATH)/Headers - 设置target
libtest的名字:targetlibtest->Build Settings->Packaging->Product Name->随便取名 - 取消target
libtest自动在名字前加上lib:targetlibtest->Build Settings->Executable Prefix->删掉lib - 新建一个target
libtest,配置好.h/.m后,运行报错,发现主头文件other.h中的#import<other/aaa.h>/#import<other/bbb.h>都找不到,解决办法:- 设置一个宏定义,当前是编译
other.framework时,主头文件other.h加载:#import <other/aaa.h> #import <other/bbb.h> - 设置一个宏定义,当前是编译
libtest.a时,主头文件other.h加载:#import <aaa.h> #import <bbb.h> - 设置target
libtest:targetlibtest->Build Settings->Apple Clang-Preprocessing->Preprocessor Macros->Debug和Release->FWMK=0 - 设置target
other:targetother->Build Settings->Apple Clang-Preprocessing->Preprocessor Macros->Debug和Release->FWMK=1 - 主头文件
other.h的代码修改为:#if FMWK #import <other/aaa.h> #import <other/bbb.h> #else #import <aaa.h> #import <bbb.h> #endif - 利用
lipo对不同arm的.a合并。
- 设置一个宏定义,当前是编译







