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-11-17 09:50:32

    android开发怎样让悬浮Activity只是隐藏而不销毁

    android在mainfest中给Activity添加一个属性 android:theme="@android:style/Theme.Dialog",可以使Activity悬浮在其它窗口上面,在布局中可以设置activity的大小,当点击悬浮Activity边缘以外区域时,Activity会消失,观察消失时其生命周期会发现执行了finish()方法从而执行了onDestroy方法。有时我们只是需要将Activity隐藏,并不销毁,此时可以重写finish方法,如下:

  • 2020-11-17 09:56:02

    uni-app直接用webiew打开本地js资源

    如果再结合activity不销毁,隐藏的方法,像里面传递参数,来改变页面,不销毁webview,我发现这样比原生的都要快。这样又能用于app端,又能生成小程序,何乐而不为

  • 2020-11-17 09:59:05

    在线图片取色器工具

    不知道为啥,现在idea的取色工具怎么都不好使了,给开发人员反映过,都一年了有没修复咋地。 网上搜到一个取色工具,把图片传上去,就可以点击取色。不错。

  • 2020-11-17 10:05:53

    mongoDB 修改密码

    mongodb的用户信息是存放在system.users表中的,修改密码不能直接更新表数据,这样的话,存到表里的密码是明文的,这就不对了。

  • 2020-11-17 10:13:16

    Vue.observable()进行状态管理

    随着组件的细化,就会遇到多组件状态共享的情况, Vuex当然可以解决这类问题,不过就像 Vuex官方文档所说的,如果应用不够大,为避免代码繁琐冗余,最好不要使用它,今天我们介绍的是 vue.js 2.6 新增加的 Observable API ,通过使用这个 api 我们可以应对一些简单的跨组件数据状态共享的情况。

  • 2020-11-17 10:17:18

    MongoDB日志文件查看

    默认情况下,MongoDB在此路径/var/log/mongodb/mongodb.log创建日志文件,如果找不到该日志文件,请检查MongoDB配置文件。