iOS封装SDK(分别生成.a和framework)

一、库的介绍

  1. 什么是库?
    库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用

  2. 根据源代码的公开情况,库可以分为两种类型
    a.开源库:公开源代码,能看到具体实现,比如SDWebImage、AFNetworking

    b.闭源库:不公开源代码,是经过编译后的二进制文件,看不到具体实现,主. 要分为静态库、动态库

    什么时候我们会用到库呢?

    一种情况是某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。 (一些引入的第三方库)

    对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,因为库是已经编译好的二进制了,编译的时候只需要 Link 一下,不会浪费编译时间。 (一些比较稳定的工具类,或者很稳定的功能模块)

  3. 静态库

    静态库 (静态链接库) 以.a 和 .framework 结尾 。 只所以叫静态库在编译的时候会被直接拷贝一份,复制到目标程序里,这段代码在程序里就不会在改变

    优点:编译完成之后,库文件没有作用了,目标没有外部依赖,直接可以运行缺点: 链接时,静态库会被完整的复制到可执行文件中,被多次使用就有多份冗余拷贝,会使目标体积增大

  4. 动态库

    动态库(动态链接库) 以 .dylib 或者 .framework 后缀结尾 与静态库相反,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。

    优点:不会影响目标程序的体积,而且同一份库可以被多个程序使用(因为这个原因,动态库也被称作共享库)。同时,运行时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码。

    缺点: 动态载入会带来一部分性能损失,使用动态库也会使得程序依赖于外部环境。如果环境缺少动态库或者库的版本不正确,就会导致程序无法运行。(Linux lib not found 错误)

注意:

由于iOS8之后才允许使用插入动态库,所以网上大部分教程在选MachO-Type的时候选择的是Static Library。但是.a静态库和静态framework无法访问库中的资源图片的。所以自己创建的framework如果想访问库中的资源文件,那么必须要是动态库。

自建动态库手动拖入的工程后,必须选择embed选项,否则的话,启动即崩溃

相关链接🔗:iOS动态库、静态库及使用场景、方式

二、生成.framework

  1. 打开Xcode,新建工程,命名GJJDateToolSDK

  2. 设置参数

📢

  • Dead Code stripping

    Xcode 默认会开启此选项,C/C++/Swift 等静态语言编译器会在 link 的时候移除未使用的代码,但是对于 Objective-C 等动态语言是无效的。因为 Objective-C 是建立在运行时上面的,底层暴露给编译器的都是 Runtime 源码编译结果,所有的部分应该都是会被判别为有效代码。

  • Link With Standard Libraries

​ 设置NO,避免重复链接

  1. 系统默认会创建该文件,作用相当于项目中统一管理头文件的那个文件

  2. 新建文件,在GJJDateToolSDK.h中引入头文件。

  3. 在Build Phase进行如下配置,把公开文件放到Public下边,把需要隐藏的放到private下边。

  4. 继续进行如下配置

  5. 打包Framework。选中模拟器command + b,选中真机command + b。

  6. 查看编译好之后的framework

  7. 合并真机与模拟器编译后的framework文件通过lipo -create 命令合并

    相关命令:lipo -create + 模拟器编译后的framework中的GJJDateToolSDK + 真机编译后的framework中的GJJDateToolSDK + -output + 合并后的要保存的路径

    注意:合并模拟器编译后的静态库与真机编译后的静态库报错have the same architectures (arm64) and can't be in the same fat output file 查看步骤2设置参数是否添加Build Setting –> Excluded Architectures –> Release –> 添加上 arm64

  8. 导出文件

    将合并后的文件拖入到真机编译后的文件中进行替换,然后将整个GJJDateToolSDK.framework拷贝出,添加到项目中。至此制作完毕一个适用于真机与模拟器的framework静态库制作完毕。

三、生成.a

  1. 新建工程,以GJJDateToolSDK为例

  2. 配置参数

  3. 创建bundle文件,名字一般与工程名相同(如果静态库有资源文件要使用,必须放入.bundle文件)

  4. 写代码

  5. 将头文件公开

    注意:如果头文件过多,可以新建一个.h文件统一引入,避免引用SDK的时候,需要导入过多.h文件

  6. 打包.a文件

    选择模拟器和真机,分别进行command+b

  7. 合并真机与模拟器编译后的.a文件通过lipo -create 命令合并

------ 本文结束------
0%