iOS Lib库/Bundle包/SDK的生成(一)
2018-04-22 本文已影响184人
爬树的蚂蚁
前言
开发中常常会使用到用到别人的lib库文件、Bundle文件以及SDK,感觉挺好用的,最主要是提高开发效率。三种文件都属静态库,另外其实是有动态库的,不过苹果禁用,审核通不过,先说说动态库与静态库的区别
静态库:
- 模块化,分工合作。
- 编译一次,但是只要有少量改动就会大量的重复编译。
- 可重用(但不是共享使用)。
动态库:
- 可以将最终可执行文件的体积缩小。
- 多个应用程序共享内存中的同一份库文件,节省资源。
- 可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的。
静态库又分为:framework 与static Library(.a )。
区别:
- 内容呈现方式不同:
(1)framework为一站式分享文案,也可以说是一个文件夹,其中包含代码签名,头文件,二进制执行文件,静态资源文件(xib,图片)等。
(2)static Library 就是.a文件,为二进制执行文件。分享给别人的时候,头文件,静态资源文件(xib,图片)需要另外提供,其中xib和图片的提供方式为Bundle。后面会有说明 - 头文件搜索路径的区别:staticLibrary需要设置头文件搜索路径,framework不需要。
- 当存在对外部代码依赖的时候:
(1)statciLibrary:使用时只需引用头文件,调用公开的方法,不需要关心库的实现,相当于分离部署。这也就能想通为什么当项目中的类与lib库中的类同名时,会发生代码冲突。
(2)framework:如果需要引用外部库,就必须将此外部库的实现放入framework内编译才可以,相对独立。所以就算项目中包含库中的同一个类,也不会发生冲突。
如果不考虑代码冲突,可以建立staticLibrary,因为这个可以减小包的大小。
下面我们就来创建自己的静态库文件
一、lib库文件
创建
打开xcode,选择创建Static Library项目
拖入文件
将需要放入lib的文件拖进去
计划这个lib库,只开放一个API出去,外面调用就可以了。
配置对外开放可见的文件
在Compile Sources下的文件对外不可见,而Copy Files下的文件对外可见
定制lib库支持的操作系统
Latest iOS(iOS 11.2)即当前编译环境所用的系统版本
配置工程为release模式
分别在真机和模拟器下编译工程,生成.a文件
编译完成后会生成两个".a"文件。通过目录:“用户/xiangzuhua/资源库/Developer/Xcode/DerivedData”进到xcode软件的DerivedData目录。
然后按照图片的指示就可以找到".a"文件
合并
打开终端
- 输入指令 lipo -create
- 然后将两个.a文件拖进去到终端,两个路径中间用空格隔开,
-
输入-output命令 然后输入合成文件的存储路径
看图
终端路径2x.png
- 敲回车
这样的话,在你的桌面(你选择的保存路径)就会生成一个.a文件
为什么要合成呢?因为在真机上用编译模拟器时生成的.a库会报错,在模拟器上用编译真机时生成的.a库也会报错,合成后,随便用在什么设备上,都没问题
整合一个可用的lib文件夹
新建一个文件夹,将合成的.a文件和API文件放到文件夹中。然后将文件夹拖入新建的测试工程
在工程中调用
运行工程,不管是模拟器还是真机,都可以正常展示lib库中实现的功能。
二、Bundle文件生成
Bundle 是用来存放图片、xib等静态资源文件的,一般与lib库配合使用。
使用xcode创建Bundle项目
设置支持iOS系统
否则有xib文件的时候,编译不通过。
添加图片和xib文件
将准备好的图片拖入项目中
创建一个xib文件
将xib上添加4张imageView,并把图片展示上去
编译生成Bundle文件
Command+b,编译一下工程,然后找到bundle文件,就可以拿来用了
把bundle文件和上面创建的lib文件一起添加到项目中
使用bundle中的图片和xib文件
//使用bundle文件中的图片
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"ZHBundle_text" ofType:@"bundle"];
NSString *imagePath0 = [[NSBundle bundleWithPath:imagePath] pathForResource:@"箭头-2" ofType:@"png"];
UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[self.view addSubview:imageView];
imageView.image = [UIImage imageNamed:imagePath0];
效果如下
//使用bundle中的xib
NSBundle * xibBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"ZHBundle_text" ofType:@"bundle"]];
UIView * view = [[xibBundle loadNibNamed:@"ZHTestView" owner:self options:nil] objectAtIndex:0];
[self.view addSubview:view];
效果如下