本文主要说明.framework的创建与使用
iOS 中静态库简单介绍
1、iOS 中静态库的形式可以分为.a 和.framework,动态库形式分为.dylib和.framework;
2、静态库和动态库都包含framework是因为,系统的framework是动态的,我们自己建立的.framework是静态的;
3、.a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件;
.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用;
.a + .h + sourceFile = .framework
所以一般建议用 .framework
4、 使用静态库可以方便共享代码,便于合理使用;实现iOS程序的模块化,可以把固定的业务模块化成静态库;和别人分享你的代码库,但不想让别人看到你代码的实现。
开始创建 .framework
1、首先创建一个项目用于制作 .framework,点击图中加号按钮

2、选择framework(这个默认是动态库,我们需要在后边配置改成静态)

3、配置库库属性
Target: -> Build Settings -> Architectures -> Build Active Architecture Only 全改成NO;

这个属性是兼容全部设备,这个属性设置为yes,是为了debug的时候编译速度更快,它只编译当前的architecture版本,所以会报错编译不到文件,出错("_OBJC_CLASS_$_xxxxxx", referenced from:)而设置为no时,会编译所有的版本,这样就解决编译出错的问题了。
设置这个兼容属性的原因是:如果生成静态库的时候是选择的ipad retain生成的,那么这个库导出的时候只能在ipad retain的设备上运行,在别的设备上就会报错,感兴趣的可以试试哦!所以一定要设置设备兼容。
Target:在 Deployment 下,将 Targeted Device Family 改成 1/2 ,根据自己的需要改。1代表iPhone,2代表iPad,1/2代表兼容iPhone和ipad,将 iOS Deployment Target ,改成 iOS 7.0,也就是说这个静态库支持7.0以上版本。

Target:在 Linking 下,将 Mac-O Type 改为 Static Library(静态库)

4、给静态库添加文件 (.h .m 文件等)
我创建了一个MyViewController的类(带xib文件,后期使用)
首先介绍一下属性:

1:暂时没用过,希望大神补充下。
2:程序文件放的地方:(*.m 、*.mm等),需要压缩保护的代码,只要放在这里的文件,都将被静态库压缩。使用静态库的一方是无法看到源代码的。
3:库文件放的地方,比如把其他的静态库、动态库压缩到这里。
4:对外接口。主要就是这里,展开后,会看到第一行(Public),不用介绍了吧,看英文应该就能猜到,何况这个单词是程序中常用的单词,公用吗!,只要是放到这里的文件,都将会暴露给使用方,建议把所有的*.h文件放到这里。
5:资源文件放的地方,图片、音视频、xib、Images.xcassets、甚至是Main.storyboard(故事板);只要放到这里,都将被压缩,使用方是无法编译或者看到源代的。
介绍完之后那我们把我建好的类拖入到对应的当中去

这里面其中 MyFramework.h是创建库的时候自动生成的,MyViewController.h是我自己创建的,我们可以把自己创建的MyViewController类import到自动生成的MyFramework.h文件,这样的话如果在别的项目用到的,我们只需要导入MyFramework.h就可以了。
MyViewController类写了一个简单的输出方法,当然如果要外部调用,不管是静态方法还是动态方法都需要在.h文件声明哦,最好加上一些注释,这样用的人直接看.h文件就知道什么用处了。

5、运行,生成.framework
我们先来看下我们创建的framework,依然还是红色,是因为现在还找不到这个库

别急,让我们command+B,当然一定要选中当前的库哦,不要选项目名字

看,黑了吧,说明已经有了,选中它,鼠标右键,Show in Finder

看到了没,首先这个是模拟器才能用的一个库,是因为我们是选中的模拟器command+B的。
再解释一下为什么command+B
framework(App图标样式)是App 工程文件,选中这个运行(command+R 或command+B)意思是让工程导出或者测试运行可发布的应用程序(就是上线文件)。对应功能就不一一介绍了。
MyFramework(Bundle图标样式)是静态库。选中这个运行(只能运行command+B,不能运行command+R)意思是导出静态库,也就是自己的封装代码,用于共享给其他人。如果选中iOS Device运行(command+R),将会导出真机版本的静态库,如果选中iOS Simulator以下其他任何版本运行(command+R),将会导出模拟器的静态库版本。至于为什么这样,是因为真机的iOS和Mac系统中的虚拟iOS目录结构是不一样的,如果导错了,编译器会报错,“找不到指定文件”;当然这俩库也可以合并为一个,既能真机用也能模拟器用,那就需要在终端用命令合并一下,不知道的百度一下就好了,这里不在赘述。
framework导入新的项目进行测试
直接导入库的.h文件,然后调用NSLog静态方法。

看,成功了吧,有点小小的欢喜哈,咱们接着来~~
引入xib文件到framework
1、创建一个叫 Resource.bundle的静态库资源文件

2、配置属性
Target:并选择 Build Settings -> Architectures -> Base SDK 改为Latest iOS(iOS 9.3)
Target:在 Deployment 下,Target:将 iOS Deployment Target,改为 iOS 7.0
3、完善MyViewController类,加载xib文件

4、然后把xib文件拖入Bundle Resources

5、选中Resources,command+B

编译成功之后,因为MyFramework 也增加了新的内容,所以要从新command+B,这样把.MyFramework 和 Resource.bundle 同时导出放到之前的测试项目里面。让我们看下效果:

这样就把我之前的xib文件显示出来了,大家可以看下Resource.bundle 里面的东西
加入图片到静态资源文件
1、首先我要先改动一下xib文件,让他加载一个imageview,怎么改变就不必上图了,大家看效果就行啦
加入图片之后,也需要把图片像拖xib那样拖入到 Bundle Resources

拖入成功之后,选中Resource 进行command+B,然后同样导出到之前的测试 项目,替换原来的即可。(因为现在只是改变的xib的东西,然后xib又包含在资源文件里面,所以只需要对Resource Resource)让我们看下效果:

看,现在是不是多了一个图片~~
如果你不想让用你framework的人看到你的图片怎么办?好,那让我们把图片加入到工程里面的图片管理器,直接把图片管理器拖入到 Bundle Resources。


现在准备就绪,只需要 command+B 一下 Resource,然后导出替换测试项目里面的Resource.bundle,运行看下效果:

现在大家可以看到之前放到资源管理里面的图片已经看不到啦,只是多了一个不明的文件:Assets.car。这个就是Images.xcassets管理,里边所有的图片都被封装了,也就是说被Images.xcassets管理的图片竟然也被加密保护了起来,别人也不会看到你的照片了!
至此,静态库创建以及一些代码思路已经全部搞定,库以及资源文件根据你的需求可以加上任意东西,大家有没有想要试一试的冲动啊!!!
如有不足,欢迎大家指出,共同进步。
网友评论