手把手教你创建Framework
上一篇文章《手把手教你创建静态库》教你如何创建静态库,这一片将“手把手”教你创建Framework,相对于静态库,Framework封装性更好。
第一步:用XCode创建一个Framework项目


第二步:实现Framework代码
Framework项目创建完成后在组织结构中会出现一个跟项目名称同名的.h文件和一个info.plist文件,我们可以新建一个Cocoa Touch Class文件来实现我们的代码,这里实现的代码较为简单,主要是为了说明过程。



后来发现,自动创建的同名.h文件并没有什么卵用,就果断删掉了。不过这里需要多一步操作,就是设置暴露出来的.h文件名来方便项目的引用。

第三步:编译Framework
《手把手教你创建静态》中已经提到了模拟器和真机、Debug和Release下编译版本的区别,在这里就不再过多赘述,直接编译并合并代码。

这里要注意的是,我们需要合并的内容是.framework文件中的与Framework项目同名的文件,不然是无法正常合并的。而且,合并后的文件需要替换原有的文件,才能将.framework文件导入到自己的项目中去。

第四步:使用Framework
Framework的使用方法和静态库的使用方法类似。先直接把.framework文件拖到项目里,然后就可以正常使用了。

这里有一个坑,如果不在Embedded Binaries选项中添加这个.framework,编译可以正常通过,但是运行会直接崩溃,日志如下图所示。

大致原因就是我们的.framework是一个动态库,如果不告诉系统我们嵌入了这个库,系统是无法识别,也就找不到这个库了,因此,添加进去吧。

我们在回头看Framework项目中的配置项,发现默认的编译模式就是Dynamic Library,如果我们需要编译为静态库,就需要手动更改为Static Library。

修改完成后编译并合并.framework文件,再导入我们的项目中,神奇的发现我们不再需要再Embedded Binaries选项添加啦。至于静态库和动态库的区别,请参考《库》这篇文章。
最后简单的总结一下,静态库和.framework的创建,这两篇文章都介绍的比较简单,更加复杂的方法期待各位去慢慢实现了。