本文来自简书,原文地址:http://www.jianshu.com/p/155a3cfb765e

前言

以下所涉及的框架和库只针对iOS而言,不确保在其他平台也适用。

最近由于公司业务需要,要求封装一个支付SDK,需要用到微信支付和支付宝,之前做过的Framework没有依赖其他第三方的库所以比较好做,这次有所不同;一开始我想把支付宝和微信支付的SDK全部融合进来,折腾一天才发现我之前的想法有很多误区,这样是根本行不通的,不过最后还是封装成功了,下面把我的经验分享出来,供有需要的同学少走弯路。 制作之前最好把功课做足,看看静态库和动态库到底是什么东西。

转载请注明出处:来自LeonLei的博客http://www.gaoshilei.com

一. 静态库和动态库的详细介绍

我们平时的工程中或多或少都要引入第三方的SDK,就算你没有引入第三方的,至少引用过系统的Framework吧?其实这些SDK和Framework都属于库,库又分为静态库和动态库,我们平时导入的第三方SDK有的是Framework,有的是.a,到底哪些是动态库,哪些是静态库呢?下面分别介绍静态库、动态库,Framework和.a以及.dylib/.tbd区别

一. 静态库与动态库

首先要解释一下什么是库,库(Library)其实就是一段编译好的二进制代码,加上头文件就可以供别人使用,一般会有两种情况要用到库:

  • 某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。
  • 对于某些不会进行大的改动的代码,比方说很多大公司常用且很少变动的模块都会编译成库,这样做的好处一是可以节省编译时间,二来对于代码的管理也非常方便。

因为库是已经编译好的二进制文件了,编译的时候只需要link一下,既然提到了link那就有不同的形式了,静态和动态,与之相对应的就是静态库和动态库

1. 静态库

平时我们用的第三方SDK基本上都是静态库,静态库的几个特点:

  • 在App项目编译的时候会被拷贝一份编译到目标程序中,相当于将静态库嵌入了,所以得到的App二进制文件会变大。
  • 在使用的时候,需要手动导入静态库所依赖的其他类库。(比如说某个SDK中使用到了CoreMotion.framework,在使用的时候需要手动导入。有的SDK需要link十几个系统库,这个时候非常恶心,只能一个一个手动加,这是静态库一个很大的不便之处。)
  • 导入静态库的应用可以减少对外界的依赖,如果导入的是第三方动态库,动态库找不到的话应用就会崩掉,例如Linux上经常出现的lib not found。
  • 静态库很大的一个优点是减少耦合性,因为静态库中是不可以包含其他静态库的,使用的时候要另外导入它的依赖库,最大限度的保证了每一个静态库都是独立的,不会重复引用。

2. 动态库

这个是我们最常用的一类库,使用频率最高的UIKit.framework和Fundation.framework都属于动态库,所有.dylib和.tbd结尾的都属于动态库。动态库的几个特点:

  • 平时使用的系统库都放在iOS系统中,在你打包应用程序的时候这些库不会拷贝到你的程序中,当需要使用的时候会动态从iOS系统中加载它们,因为这个原因,动态库也被称作共享库。编译时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码。
  • 这些库是所有应用公用的,换一种说法就是节省了应用安装包的体积,这是区别静态库很重要的一个特点,因为静态库使用一次就要拷贝一次,非常浪费资源。
  • 动态库在制作的时候可以直接包含静态库,也能自动link所需要的依赖库。
  • 使用动态库的时候不需要再次link依赖库,即导即用,这个就厉害了。唯一需要注意的是在导入自己制作的动态库时,需要在Embedded Binaries中导入,不然会报错:image not found。此时这个动态库会跟静态库一样被拷贝到目标程序中进行编译,苹果又把这种Framework叫做Embedded Framework

关于动态库要搞清楚一点,我们自己制作的动态库与系统动态库的区别,我们自己制作的动态库引入App项目的时候需要embed进项目,也就是要拷贝到目标程序中,这就有点不像动态库的特性了,苹果这么做也是考虑安全问题吧!
至于能不能正常上架,我也不清楚,查了大量资料都是抄来抄去没说清楚,我猜测是不能上架的,因为一般的第三方SDK也都是静态库的形式,我猜测一个重要原因是iOS的应用本来就是运行在沙盒里面的,不同应用之间不能共享代码,同时动态下载代码苹果肯定也是明令禁止的,所以动态库也就失去意义了。当然可能还有其他因素,欢迎交流学习!

二. Framework、.a、.dylib/.tbd

1. Framework

Framework的英文释意是框架,主要由Headers、binary文件、.bundle这三部分构成,除此之外还有Info.plist和Modules,后两者主要记录Framework的版本之类的信息,一般都会删掉,不做讨论

  • Headers
    包含我们在制作Framework的时候暴露的头文件,所有被暴露的.h都放在这里。
  • binary文件
    整个Framework的核心,所有代码都被编译成了这样一坨二进制文件,这里要注意的是添加的依赖库不会被编译进来,用的时候还需要重新link其他依赖库。
  • .bundle
    资源文件都打包放在这里。在制作Framework的时候不可以把图片直接放在项目中,否则制作好之后图片是一张一张的出现在项目中非常乱,需要新建一个bundle将图片放进去,这里的bundle提供整个SDK的图片资源。
    注意:图片放进bundle之后不可以用[UIImage ImageWithName:]读取图片。要先找到bundle包再拿图片。

这里要纠正一个误区

很多人认为系统的Framework就是动态库,我们自己制作的Framework就是静态库。

其实Framework既可以是静态库也可以是动态库,这取决于编译成的Mach-O(就是那个二进制文件)是动态库还是静态库,Framework本质上并不是一个库,它是苹果为了方便开发者提供了一种库的打包方式,Framework会将Mach-O文件、头文件和资源包全都包含进来,不需要你再手动整理,我们也可以通过Xcode来制作framework动态库使用。
所以总结: Framework是库的打包形式,既可以是动态库也是静态库。

2. .a静态库

这类静态库与Framework基本类似,不同的是在打包成.a文件的同时,还需要提供头文件,使用时相较于Framework比较麻烦,(例如微信支付SDK使用的是.a,不同的是支付宝SDK是以framework的形式打包的)。.a这样打包不够方便,而Framework编译完成暴露的头文件都已经放好了。

3. .dylib/.tbd 动态库

这类动态库我们也经常用,基本上都是系统提供的,一般不能自己制作,就算你通过其他方式制作使用,也肯定不能上架的,这里没什么好讲的。

二. Framework(静态库+动态库)的制作

动态库与静态库的制作流程基本一样,包括头文件的暴露等,唯一不同的是Mach-O文件的编译形式。本节将介绍Xcode制作Framework的过程,本次制作的Framework静态库依赖其他第三方静态库(Framework和.a)。

1> 新建工程

新建Framework工程

这里要选Framework,如果选择右边的Static Library制作出来的是.a静态库。

2> 导入所有要打包的文件和其他第三方静态库
正常导入要打包的文件就可以了,在导入第三方静态库的时候要注意,不要选择添加到target中,如果添加进去要去target里面把第三方静态库删掉(只需导入,不要添加进target)

导入第三方静态库

导入第三方静态库之后再link依赖的系统库,像这样

link依赖库

注意上面的运行目标,因为我用的是Xcode8,最低支持到iOS8。
要打包的文件和第三方静态库全部导入完成

所有文件导入情况

3> 项目性质修改
把项目的membership需改为public,否则头文件暴露将会不正常

修改项目的membership

4> 暴露头文件
将头文件暴露出去,供外界使用,所有的编译文件都在Project中,需要右击添加到public里面

暴露头文件

5> 选择Mach-O的编译方式
这是最重要的一步,这一步决定我们制作出来的是静态库还是动态库,默认选择的是Dynamic Library,要手动选择Static Library

Mach-O 形式

6> 编译
如果你的依赖库里面有lib开头的dylib动态库,此时应该会报错

动态库链接报错

什么意思呢?大概就是没找到对应的库文件,因为tbd是苹果提供的新的动态库格式,之前都是dylib,不知道这里又抽什么风,下面解决问题。

7> tbd动态库报错修改
先把原来的.tbd删掉,然后再次添加,这个时候选择add other,在弹出的窗口中按快捷键shift + command + G 调出finder的前往窗口,输入/usr/lib,然后添加相应的dylib动态库

修改的动态库

替换完成之后重新编译项目,生成Framework(可在Product文件中右击在finder中显示找到)

8> 使用
新建一个文件夹,将制作好的静态库拷贝出来放进去,再将第三方静态库拷贝到相同的文件夹中,此时只要将这个文件夹提供给外界使用就可以了,这是我写的测试demo验证打包好的SDK是否可以正常使用

制作完成使用

至此我们已经完成了Framework中包含其他第三方静态库的制作。
如果需要制作动态库,只需要在第5步中将Mach-O的形式改为Dynamic Library就可以了,其他步骤一样

如果有问题请在留言区留言,或者邮件给我,互相交流学习!

iOS静态库SDK制作(包含第三方静态库)相关推荐

  1. iOS架构-静态库.a之依赖第三方静态库.a的制作(8)

    上一篇讲的是静态库.framework 依赖第三方库,是通过Cocoapod 提供的第三方库.而有时我们会依赖第三方.a 或者.framework 的.那么怎么样来制作依赖第三方.a 或者.frame ...

  2. iOS静态库SDK制作(包含支付宝支付、微信支付或其它第三方静态库)

    前言 以下所涉及的框架和库只针对iOS而言,不确保在其他平台也适用. 最近由于公司业务需要,要求封装一个支付SDK,需要用到微信支付和支付宝,之前做过的Framework没有依赖其他第三方的库所以比较 ...

  3. 【错误记录】360 加固后的运行错误 ( 加固 SO 动态库时不能对第三方动态库进行加固 )

    文章目录 一.加固 SO 动态库报错 二.解决方案 一.加固 SO 动态库报错 在 [Android 安全]使用 360 加固宝加固应用 ( 购买高级加固服务 | 设置资源加固 | 设置 SO 文件保 ...

  4. 使用Eclipse将包含第三方jar库的java工程打包成jar包

    1.MANIFEST.MF 在工程下新建一个MANIFEST.MF的文件,项目结构如下. M.java package cn.hwd.main; import java.io.IOException; ...

  5. iOS架构-静态库.framework(引用第三方SDK、开源库、资源包)(9)

    前面介绍了 静态库.a依赖第三方静态库.a的制作 静态库.framework之依赖第三方库(Cocoapods进行管理) 今天课题: 静态库.framework(引用第三方SDK.framework. ...

  6. ANE的开发需求一般太少,这个静态库如何包含第三方

    1.介绍 原本不打算在分开发一遍这个的,应该是包含在这篇Flash Air ANE for iOS 集成最新版本的友盟统计SDK.framework功能中的,但是由于ANE的开发需求一般太少,这个静态 ...

  7. iOS中引入第三方静态库头文件找不到的问题解决方案

    在前几次项目中,因为要引入一些自己打包好的静态库,也就是第三方静态库,但是出了很多问题,有时会遇到莫名其妙的问题,明明有这个文件,但是就是显示头文件找不到.为了在以后能够快速处理这种问题,所以在这里做 ...

  8. Linux中gcc的编译、静态库和动态库的制作

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 Linux中gcc的编译.静态库.动态库 文章目录: 1 gcc的编译过程 1.1 gcc的编译过程 1.2 gcc的常用参数 2 gcc 静态库的制 ...

  9. 【Linux】Linux下静态库(.a)和动态库(.so)的制作和使用

    如有错误,欢迎大家指正,感谢! ​​​​​​​目录 一.程序工作过程简单介绍 1. 安装GCC 2. 源程序工作流程 3. 使用示例 4. gcc常用的编译参数选项 二.静态库的制作及使用 1. 库是 ...

最新文章

  1. 25 uname-用于显示系统信息
  2. lisp xy轴不等比缩放_UV的详细解释,不懂得赶紧看过来!
  3. 基于tensorflow的RNN自然语言建模
  4. C语言学习之利用指针将字符串a复制为字符串 b,然后输出字符串b
  5. C# 网络编程之通过ip地址获取地理位置(补充)
  6. php数组验证用户名密码,求个php数组验证问题,在线等
  7. SpringBoot基础教程1-1-2 配置文件介绍
  8. Impala与Hive的关系
  9. 解决XP中CPU占用率过高问题, 关了445这个端口(ZT)
  10. jquery 设置背景
  11. echart 中国地图 带effectScatter和lines
  12. 《御制皇陵碑》(明)朱元璋 撰
  13. 01读书笔记:《编码》-隐匿在计算机软硬件背后的语言(01-11章)
  14. 设计模式--适配器模式
  15. VIVADO学习笔记之--DONT_TOUCH
  16. AutoCad 新建或打开对话框 经常变为命令提示行的解决办法!
  17. Mac 序列号不可用导致超时代视频加密视频播放失败
  18. upupoo为什么服务器维护中,upupoo怎么隐藏桌面图标 只需两步轻松隐藏
  19. 分享几个在记账本中快速删除收支明细的技巧
  20. 全屏状态下的ESC键监听处理

热门文章

  1. 2020.5.31 牛客“科林明伦杯” A.点对最大值【树形dp】
  2. 按字符串属性值对对象数组进行排序
  3. 2022年必看的18个HR面面试题是这些【值得收藏】
  4. TCP网络调试助手上提示错误:“1035 未知错误”的有效解决方法,本人实测确实可行
  5. [VCS]后仿真中的几个基本概念
  6. js实现图片裁剪功能
  7. android短信拦截与发送,有效拦截苹果iMessage垃圾短信的几个方法
  8. ASp.net判断文件或文件夹是否存在
  9. 《写给女人》--[美]桃乐丝·卡耐基
  10. Pandas函数read_csv的参数na_values的用法