iOS 中的库CocoaPods的两种模式

2021-02-03 17:11:48

参考地址 关于 iOS 中的库

库是什么?

库一般是封装好的代码,便于复用。例如 GitHub 上可以看到的开源库,开箱即用。

下面我们主要说的,是编译成二进制的库。

什么场景使用二进制的库?

  • 保护源代码。日常开发中的各种商业 SDK 就属于此类。只暴露头文件给使用者,而隐藏具体的实现。

  • 加快编译速度。因为是编译完成的二进制,所以编译的时候只需要 Link 一下。

动态库与静态库

根据 Link 的方式,分成了2种库,静态库和动态库。

什么是静态库?

静态库,即静态链接库。不同平台的文件格式如下:

系统静态库文件格式
Windows.lib
Linux.a
MacOS/iOS.a

静态库的特点,在于编译的时候会直接复制到目标程序里。

意味着代码在目标程序中,不会再改变了。如图:

3D044AD0-C6D0-40E4-ABD7-AB07945E6E26

什么是动态库?

动态库,即动态链接库。
不同平台的文件格式如下:

系统动态库文件格式
Windows.dll
Linux.so
MacOS/iOS.dylib

动态库的特点,在于编译的时候,并不会被拷贝到目标程序中。

目标程序中,只会存储指向动态库的引用。程序运行时,动态库才真正被加载。

而同一个动态库,可以被多个程序使用。如图:

91EDA5EA-2038-4B89-9ECB-BAA8DD4D94FE

MacOS/iOS 里的 Framework

Framework 实际上是一个 bundle 或者说特殊形式的文件夹,将库的 二进制文件/头文件/资源文件 打包到一起。

Framework 可以选择创建为动态或者静态。

区别

由于 .a /.dylib 等只能打包库的二进制代码,可以用以下公式区别:

动态库/静态库 + .h + 资源文件 = Framework.

如何制作 Framework?

制作 Framework 已经有很多教程,可以直接谷歌百度查阅,这里就不纠结具体过程了。可以参考这篇文章->静态库和动态库的制作(OC、Swift)

关于动态的 Framework

真正动态的 Framework ,只有苹果自家的 UIKit.Framework,Foundation.Framework 等。

由于 iOS 的沙盒机制,自己创建的 Framework 和系统 Framework 不同,App 中使用的 Framework 运行在沙盒里,而不是系统中。每个 App 都只能用自己对应签名的动态库,做不到多个 App 使用一个动态库。

如果不同的 App 使用了同样的 Framework,还是会有多份的 Framework 被分别签名,打包和加载。

所以,iOS 上的动态库只能是私有的,我们无法将动态库放置在除了自身沙盒以外的地方。

CocoaPods 管理库使用的是哪种形式?

CocoaPods 是 iOS 项目的依赖管理工具,类似于 Android 的 gradle。不过gradle 还能负责构建, CocoaPods 只管理依赖。

CocoaPods 目前分别支持了 Framework 动态库和 .a 静态库 2种方式。

默认使用的是 .a 静态库的方式,主工程依赖 libPods.a,通过脚本,把资源等文件复制到目标目录。

在 Podfile 使用了 use_frameworks! 进行声明,则使用 Framework 动态库的形式.主工程对 Pods 的依赖为 Pods.framework。

由于 Xcode9 之前 Swift 项目不支持静态库,如果为 Swift 项目,就必须采用 user_frameworks! 声明。

关于 Xcode9 以后使用 Swift 静态库的,可以参考下面的文章:

即刻Swift静态库实践

参考

dylib浅析

iOS 静态库,动态库与 Framework

iOS 静态库和动态库的基本介绍和使用

CocoaPods 原理总结


  • 2020-04-03 10:20:20

    Vue 项目性能优化

    Vue 框架通过数据双向绑定和虚拟 DOM 技术,帮我们处理了前端开发中最脏最累的 DOM 操作部分, 我们不再需要去考虑如何操作 DOM 以及如何最高效地操作 DOM;但 Vue 项目中仍然存在项目首屏优化、Webpack 编译配置优化等问题,所以我们仍然需要去关注 Vue 项目性能方面的优化,使项目具有更高效的性能、更好的用户体验。本文是作者通过实际项目的优化实践进行总结而来,希望读者读完本文,有一定的启发思考,从而对自己的项目进行优化起到帮助。本文内容分为以下三部分组成:

  • 2020-04-03 13:07:46

    flex布局与position:absolute/fixed的冲突问题

    导航栏内,平均分为四块,为了适配各种移动设备,使用了flex布局。 与此同时,产品经理要求:页面上滚越过封面图时,导航栏变为固定定位,浮在页面顶部。 拿到需求之后,思路就是先搞好布局,然后监听window.onscroll,当页面滚的距离大于封面图的时候,给ul加入position:fixed。

  • 2020-04-03 16:56:59

    Inkscape教程

    本教程演示了Inkscape基础使用。这是常规Inkscape文档,你可以预览、编辑、复制、保存。 本教程包括画布导航、管理文档、形状工具基础、选择技术、使用选择转换对象、分组、设置填充和画笔、对齐和Z顺序。有关更高级的主题请查看帮助菜单中的其它教程。

  • 2020-04-03 17:04:35

    Inkscape/SVG附中文教程PDF

    Inkscape中的终极工具是XML编辑器(Shift+Ctrl+X),可以实时显示整个文档的XML树形图。修改绘图时,你可以注意一下XML树形图中的变化。也可以在XML编辑器中修改文本、元素或者节点属性,然后在画图上查看效果。这是一个非常形象化的学习SVG格式的交互式工具。并且可以实现一些通常的编辑工具无法完成的功能。

  • 2020-04-03 19:09:31

    CryptoJS.enc.UTF8 中文乱码

    ret = CryptoJS.AES.encrypt(data,'secret key 123') content = ret.toString() result = CryptoJS.AES.decrypt(content,'secret key 123') print(result.toString(CryptoJS.enc.Utf8))

  • 2020-04-03 19:10:56

    nodejs与javascript中的aes加密

    aes加密简单来说,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。高级加密标准已然成为对称密钥加密中最流行的算法之一。

  • 2020-04-03 19:13:05

    Express-session的使用

    当浏览器访问服务器并发送第一次请求时,服务器端会创建一个 session 对象,生成一个类似于 key,value 的键值对,然后将 key(cookie)返回到浏览器(客户)端,浏览器下次再访问时,携带 key(cookie), 找到对应的 session(value)。 客户的信息都保存在 session 中

  • 2020-04-08 22:46:28

    Element的操作方法

    Element 是一个通用性非常强的基类,所有 Document 对象下的对象都继承自它。这个接口描述了所有相同种类的元素所普遍具有的方法和属性。一些接口继承自 Element 并且增加了一些额外功能的接口描述了具体的行为。例如, HTMLElement 接口是所有 HTML 元素的基本接口,而 SVGElement 接口是所有 SVG 元素的基础。大多数功能是在这个类的更深层级(hierarchy)的接口中被进一步制定的。