1. 静态库和动态库
ⅰ. 区别
- 静态库:链接时完整的拷贝到可执行文件,多次使用多次拷贝,造成冗余,使包变的更大。
- 动态库:链接时不复制,程序运行时由系统加在到内存中,供系统调用,系统加在一次,多次使用,共用节省内存。
ⅱ. iOS/Mac 中的静态库
.a和.framework 文件
ⅲ. iOS/Mac 中的动态库
.dylib和.framework 文件
ⅳ. 使用静态库的原因
- 共享代码,方便使用。
- 实现iOS 程序的模块化,固定的业务模块话,减少开发的重复劳动。
- 和别人分享代码,但又不想让别人知道代码的具体实现。
- 开发第三方SDK 的需要。
2. 打包时注意要点
- AppDelegate
AppDelegate 不能打包进静态库,所以 AppDelegate.m 文件在编译的文件列表中要撤选,在 AppDelegate 中做的一些操作要全部封装成接口暴露出去
- 第三方库
项目中的第三方库优先使用 CocoaPods 管理,可以不用打包进自己的静态库。如果我们打包整个工程的时候没有把用到的第三方框架一起打包,那么提供静态库的时候,要说明依赖哪些第三方的库。
- 资源文件
默认情况下,静态库只会打包代码文件,像图片、xib、storyboard、plist文件等都不会被打包,就需要创建一个bundle 文件夹,把所有的图片、plist 文件、Images.xcassets、xib、storyboard 都打包进去,而且项目中用到图片的时候,只能通过 bundle/xxx.png 文件名的方式来设置。
3. 打包步骤
a. 创建Framework
1. 首先打开xcode新建项目选择Framework
2. 在Product Name 和 Organization Identifier中填写需要的名称,在Language中选择Swift。然后点击创建。
3. 在创建完成后高于xcode12的版本会默认隐藏Products文件。需要找到项目的文件目录,找到其中.xcodeproj文件,右键选择显示包文件。
然后点击project.pbxproj文件将其中mainGroup的值赋给productRefGroup,如下图所示。
4. 然后创建一个swift文件,创建一个类将方法写入其中。其中注意要写带 public 的 init(),且所有方法都要加上public。下图为例
5. 然后点击项目的根目录,找到Build Settings如下图所示
6. 將 下图红框中的Debug 改成 Yes,將Release 改成 No
7. 将下图红框中的Dead Code Stripping 改成 No,Mach-O Type 改成 Static Library
8. 然后按command+B构建Framework包但是需要真机和模拟机各构建一份,两者不能通用。
9. 然后找到/Users/用户名/Users/xuyi/Library/Developer/Xcode/DerivedData/你的Framework项目/Build/Products。这里面有构建的真机和模拟机的文件,再将里面的Framework文件导入到需要该Framework的项目中。到此完成。
4. 静态 Linux SDK
静态 Linux SDK 可以在 Swift 编译器和包管理器支持的任何平台上使用;这意味着您可以在 macOS 上开发和测试您的程序,然后构建并部署到基于 Linux 的服务器(无论是在本地运行还是在云端的某个地方运行)
参考官方文档: