IOS打包封装Framework

如果我们希望与别人共享某些函数,却又不愿意暴露实现的细节,怎么办呢?

这时候可以将我们的代码封装成framework,对外提供接口而不暴露实现;

不仅如此,将代码整合成framework还有很多其他的好处,这里就不一一列举。

 

下面就来看看如何打包成 framework 吧。

1、 创建工程


通过OS X > Framework&Library > Bundle 创建工程:

151819_doJd_2519676.png           171418_LYtb_2519676.png

 

2、添加 Headers

 


在 Build Phases 中添加 Headers:

151820_4qcV_2519676.png

Headers 展开后是这样的:

151820_Zbwv_2519676.png

 

3、添加项目代码


将需要封装打包的文件加入项目中,这里最好用 copy 的方式加入:

151820_q84F_2519676.png         

 151820_pe6f_2519676.png

 

4、合并头文件


为了方便别人使用 framework,最好创建一个头文件,并且在头文件下包含你所有想要公开的类,如此,当别人使用你的 framework 时只需要导入这一个头文件就可以了。

151821_b2T1_2519676.png

 

5、公开类


当代码加入了项目后,所有的 .h 文件都会自动出现在 Headers  的 Project 下面,然后,我们将需要公开的类拖到 Public 下面。

151821_qu2a_2519676.png          

这里需要注意:Private 仍然是公开的而不是私有的,不要被它的名字误导了,私有类保留在 Project 下就好。

151821_OGLm_2519676.png

 

6、更改一些设置:


6.1  info.plist > Bundle OS Type code = FMWK

151822_HP7Z_2519676.png

6.2  Build Settings > Base SDK = Latest iOS,选择最新的

6.3  Build Settings > Linking :

  • Dead Code Stripping            = NO;

  • Link With Standard Libraries = NO;

  • Mach-O Type                       = Static Library.

对于Mach-O Type可能有两种情况:(1)选择 Static Library 打出来的是静态库;(2)选择 Relocatable Object File 打出来是动态库。

这里建议使用静态库,动态库在提交 AppStore 审核的时候貌似会被拒;但是网上看了一些资料说动态库也是可以的,不过会有一些机审的规则需要注意下,比如不要把x86/i386的包和arm架构的包lipo在一起,就单纯使用真机包。(关于这个没有测试过,也不知道是不是真的,如果有朋友测试过的希望告知下,谢谢!)

154421_5tOw_2519676.png

6.4  Build Settings > Packaging > Wrapper Extension = framework.

151823_8s5E_2519676.png

 

7、修改输出路径


7.1  为了方便找到运行后生成的framework,我们提前在项目目录下创建一个目录 build,用来存放运行后生成的文件;

151823_zXr5_2519676.png

7.2  然后,需要修改下输出路径:

Build Settings > Per-configuration Build Products Path = $(SRCROOT)/build/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

151823_yfG5_2519676.png

 

8、编译


8.1  选择 Generic iOS Device, 编译;

151823_yZ8L_2519676.png

8.2  选择模拟器,编译。

151824_mjJz_2519676.png

8.3  编译成功后,会在 build 下产生2个文件夹,一个是 device 编译生成的,一个是 simulator 编译生成的,他们里面存放着对应的 framework。

151824_7qsP_2519676.png

 

9、合并


此时,已经有了适用于设备和模拟器的2个framework,接下来,需要将他们合并,使其同时适用于设备与模拟器。

9.1  这里合并的并不是2个framework,而是各自的二进制文件,如下图中的 JJFramework;

151824_QdzC_2519676.png

9.2  那么如何合并呢?首先,打开终端,cd 到 build 文件夹;然后输入命令:

lipo -create 设备二进制文件 模拟器二进制文件 -output 合成文件的名字 ;

注意:(1)注意空格。(2)合成后的文件名字需要和合成前的名字一样,否则使用framework时会报错。

如上图,合并2个 JJFramework 输入如下命令:

lipo -create Debug-iphoneos/JJFramework.framework/JJFramework Debug-iphonesimulator/JJFramework.framework/JJFramework -output JJFramework。

build 文件夹下的 JJFramework 就是合成后的二进制文件了。

151824_4BRe_2519676.png

9.3  将设备或模拟器运行生成的framework移出来,用合成的二进制文件替换原本二进制文件

151825_Zfdd_2519676.png          151825_kuWa_2519676.png

 

10、删除 info.plist 


到这里就基本上大功告成了。
另外,如果framework中没有用到过 info.plist,可以将其删除以免发生冲突。(我就遇到过一次这坑爹的情况)
151825_qBOD_2519676.png

 

OK, framework打包完成。

 

其实封装 framework 有很多种方法,以上只是其中一种;而且应该还有更简单的方法,有时间的话,后续会补上。

 

转载于:https://my.oschina.net/Jerod/blog/655271