【iOS】SDK静态库的封装

做SDK开发很久了,一直没有时间写一篇关于封装SDK的文章,今天抽出时间来做一下这方面的整理。

在介绍封装SDK的方法之前,我们先来了解一下iOS里的库。

1、什么是库

库是一种共享程序代码的方式。库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。在开发过程中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,不想被外界知道和修改核心代码,所以会把核心代码打包成库,只暴露出头文件以供使用。

2、库的分类

iOS里的库分为静态库和动态库。

静态库

静态库在链接时会被完整地拷贝进可执行文件中,被多次使用就会有多份冗余拷贝。静态库有两种形式:.a.framework.a 是一个纯二进制文件,不能直接使用,要有头文件配合。而 .framework 中除了有二进制文件之外还包含头文件等各种资源,可以直接使用。

动态库

动态库在链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。动态库也有两种形式:.framework.tbd( Xcode 7 之前为 .dylib) 。在 iOS 8 之前,苹果不允许第三方框架使用动态方式加载。 iOS 8 之后开始允许开发者有条件地创建和使用动态框架,这种框架叫做 Cocoa Touch Framework。虽然同样是动态框架,但是和系统 .framework 不同,哪怕我们封装的 .framework 是动态的,最后也还是要拷贝到 App 中去使用。也就是说,不同的 App 就算使用了同样的 .framework,但还是会有多份的框架被分别签名,打包和加载。苹果不仅需要动态库和app的签名一致,而且苹果会在上架的时候再经过一次AppStore的签名。因此想在线更新动态库,首先得有苹果AppStore私钥,而这个基本不可能,所以想要通过这种方法实现应用插件化、软件版本实时模块升级很难实现。

3、库的封装

.a 静态库的封装

1、创建一个 .a 静态库项目,如下图所示:

屏幕快照 2017-06-08 上午10.07.38.png

2、我们先以一个简单的例子来做介绍,在工程中新建类并添加如下方法

屏幕快照 2017-06-08 上午11.01.14.png

3、接下来我们需要设置要暴露出来的头文件。如图,进入 Build Phases ,点击左上角的加号,创建 Headers

屏幕快照 2017-06-08 上午10.53.47.png

4、点击 Headers 左下角的加号,将头文件导入到 Project 中,如图

屏幕快照 2017-06-12 下午4.44.38.png

5、随后选择需要暴露出来的头文件,将其从 Project 拖拽到 Public 当中。这里需要注意的是,我们想要隐藏的头文件需要放到 Project 当中,而不是 Private 当中。

屏幕快照 2017-06-08 上午10.58.03.png

6、点击 Target,选取 Edit Scheme ,如图

屏幕快照 2017-06-08 上午11.55.52.png

7、选择Run,将 Build Configuration 改为 Release,如图

屏幕快照 2017-06-08 上午11.19.06.png

8、选择 PROJECT 中的 Info,更改 iOS Deployment Target 为 7.0 或其他版本,如图

屏幕快照 2017-06-08 上午11.24.14.png

9、至此,我们工程的基本设置已经做完了,下面开始生成.a文件。分别选择模拟器和Generic iOS Device,command+B 各编译一次,生成两个.a文件,选择 Products 中的 .a文件,右键 Show in Finder ,如图

屏幕快照 2017-06-08 上午11.32.30.png

10、为了保证我们的静态库能够在真机和模拟器上同时运行,我们需要对两个.a文件进行合成。打开终端,输入如下指令

屏幕快照 2017-06-08 上午11.36.00.png

11、做完以上操作之后合成的.a文件就出现在我们的桌面上了。至于需要暴露的头文件也可以在上边的文件夹中轻松找到,如图

屏幕快照 2017-06-08 上午11.58.29.png

12、.a文件再加上.h文件,就组成了一个完整的静态库。当然,在制作SDK的过程中,我们也可能会用到资源文件,通常都是制作.bundle来解决,这个我们会在接下来讲。

.framework 静态库的封装

1、创建一个 .framework 静态库项目,如下图所示:

屏幕快照 2017-06-08 上午10.31.39.png

2、接下来的步骤与.a 静态库封装中的步骤 2 ~ 8 相同。

3、在 Targets -> Build Setting 里搜索 Dynamic ,将 Mach-O Type 设置为为 Static Library ,如图

屏幕快照 2017-06-12 下午2.54.42.png

4、至此,我们工程的基本设置已经做完了,下面开始生成.framework文件。分别选择模拟器和Generic iOS Device,command+R 各运行一次,生成两个.framework文件,选择 Products 中的 .framework文件,右键 Show in Finder ,如图

屏幕快照 2017-06-12 下午3.05.20.png

5、为了保证我们的静态库能够在真机和模拟器上同时运行,我们需要对两个.framework文件进行合成。这里需要注意的是,我们要合成的仅仅是.framework中的二进制文件。我们可以先拷贝出一份.framework放在桌面,以保存最终合并的二进制文件。随后打开终端,输入如下指令

屏幕快照 2017-06-12 下午3.12.32.png

6、至此,.framework静态库就制作完成了。

.framework 动态库的封装

1、.framework动态库的封装与.framework静态库的封装基本相同,唯一的不同点在于步骤3,需要将 Mach-O Type 设置为 Static Library。

2、动态库的加载与静态库有些不同之处,我们需要在 Targets -> General -> Embedded Binaries 中将动态库嵌入到工程中才可以正常使用。

.bundle 资源束的制作

.bundle,就是资源文件包。我们将许多图片、XIB、文本文件组织在一起,打包成一个Bundle文件。方便在其他项目中引用包内的资源。Bundle是静态的,也就是说,我们包含到包中的资源文件作为一个资源包是不参加项目编译的。也就意味着,bundle包中不能包含可执行的文件。它仅仅是作为资源,被解析成为特定的2进制数据。

.bundle的制作步骤如下:

1、在 macOS 中选择 Bundle 模板创建新工程,如图

屏幕快照 2017-06-12 下午4.06.47.png

2、Targets -> Build Settings里搜索hidp,将属性设成 NO 即可,如图

屏幕快照 2017-06-12 下午4.12.41.png

3、command+B 编译后,选择 Products 中的 .bundle文件,右键 Show in Finder ,如图

屏幕快照 2017-06-12 下午4.16.15.png

4、至此,我们就完成了Bundle 文件的制作。

4、封装SDK注意点

1、当我们封装的SDK中含有category时,在使用时要特别注意,需要在 Target -> Build Setting -> Linking -> Other Linker Flags 中添加 -ObjC 、-all_load 或 -force_load 标识。
2、封装SDK时,为了避免日后使用时类名、静态变量名等重复,通常需要在命名时加上前缀。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,104评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,816评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,697评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,836评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,851评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,441评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,992评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,899评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,457评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,529评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,664评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,346评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,025评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,511评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,611评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,081评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,675评论 2 359

推荐阅读更多精彩内容