iOS中Framework和.a的打包及使用

2018-08-08  本文已影响10人  00after

原文
iOS中,Framework和.a的打包及使用

最近在做一个小项目,需要给客户一个demo测试,有一部分核心代码暂时不想让客户知道,就想到了打包成framework或.a库。库有两种:

静态库和动态库的区别

总结:
静态库:
1.编译时将程序放进进可执行程序
2.会产生多分副本
3.不依赖程序运行
动态库:
1.程序运行时,加载时才去动态库找函数
2.多进程共享
3.依赖程序运行

使用静态库的好处

使用动态库的好处

静态库的使用场景

iOS设备的CPU架构
模拟器

真机

没有armv64

下面言归正传,做点正事

.a静态库

1.创建一个新的工程,选择下面这个模板:

a1.jpeg

完成

a2.jpeg

2.我这里就在Test操作了(亲,你打包.a的时候,可以删除默认文件,拉入自己想加入的任何文件)

a3.jpeg a4.jpeg

下面在创建一个Person类

a5.jpeg a6.jpeg

3.选择需要公开的头文件

a7.gif

4.修改配置

a8.jpeg a9.jpeg a10.jpeg

5.编译
选择Generic iOS Device任意一个模拟器各编译一次,完成后,在工程的Products文件夹下的.a文件从红色编程了黑色。编译成功,然后Show in Finder

a11.gif

可以看到真机与模拟器都生成了.a。里面都有有我选择公开的头文件
这个时候,可以用命令lipo -info 静态库名字来看下,支持的iOS的CPU框架

a12.gif

6.合并静态库-让模拟器和真机使用一个静态库
命令如下:
lipo -create第一个.a文件的绝对路径 第二个.a文件的绝对路径 -output 最终的.a文件路径

a13.gif

这个生成的libTest.a,就是支持真机和模拟器的静态库了。创建一个文件夹,把.a和头文件拖进去,这个文件夹就是我们所需要的。

a14.gif

为了开发方便,我们可以使用生成的通用静态库,但是上线的时候只导入真机的,这样工程的体积也会小一些。

使用.a静态库

新建一个工程,把我们的静态库拖进去,导入头文件。

a15.jpeg

.framework静态库

1.Xcode创建一个新工程,需要选择这个Cocoa Touch Framework这个模板

framework1.png

2.创建Person,也是输入名字和年龄,和.a一样

framework2.jpeg framework3.jpeg
注意事项:
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
//拿到路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"bundle" ofType:@"bundle"];
//设置图片
UIImage *image = [UIImage imageNamed:@"delete" inBundle:[NSBundle bundleWithPath:path] compatibleWithTraitCollection:nil];

 [button setImage:image forState:UIControlStateNormal];

3.选择要公开的头文件
这里主要是让使用者知道有哪些方法和头文件可以使用

framework4.jpeg framework5.gif

注意。要在这个文件中引入需要公开的头文件

framework6.jpeg

这里有一个注意点,公开的头文件中,#import的其他类也要公开,添加到public中,如果不想公开,就在头文件用用@class的方式,在对应的.m中用#import方式

4.修改配置

framework8.jpeg framework9.jpeg

5.编译
选择Generic iOS Device任意一个模拟器各编译一次,完成后,在工程的Products文件夹下的.framework文件从红色编程了黑色。编译成功,然后Show in Finder

framework10.gif

可以看到真机与模拟器都生成了.framework。里面都有我们选择公开的头文件
这个时候,可以用命令lipo -info framework静态库文件下二进制文件的名字来看下,支持的iOS的CPU框架

framework11.gif

6.合并静态库-让模拟器和真机使用一个静态库
命令如下:
lipo -create第一个framework文件下二进制文件的绝对路径 第二个framework文件下二进制文件的绝对路径 -output 最终的二进制文件路径

framework12.gif

将合成的二进制文件拖进任何一个framework,替换掉原来的,然后把这个新的framework拖进项目就可以使用了

使用framework静态库

新建一个工程,把我们的静态库拖进去,导入头文件。然后调用Person中的方法。

framework13.jpeg

如果静态库中有Category类,就要在使用静态库项目的配置中找到主工程的 target --Build Setting--Linking--更改其 Other Linker Flags为:-ObjC-all_load 即可。
如果创建的framework类中使用了.tbd,则项目中也要导入.tbd动态库

参考文章:
iOS中,Framework和.a的打包及使用
静态库与动态库的区别以及framework的使用
C语言静态库与动态库的区别的深入分析

上一篇 下一篇

猜你喜欢

热点阅读