基础介绍
Swift Package Manager(通常简称为SPM)是苹果官方为 Swift 语言提供的依赖管理工具。
它与 Swift 语言本身深度集成,适用于 Swift/跨平台(iOS、macOS、Linux),它用于自动化地下载、编译、链接和管理包的依赖过程。
核心概念
主要特点
Package
一个包含 Swift 源代码和 Package.swift
清单文件的目录。
Products
对外产物,比如库 (Library)和可执行程序 (Executable),其中库是最常见的类型,是其他代码可以导入和使用的可重用组件。
Target
构建单元,它包含一组源代码文件,可以依赖其他目标,比如library、executable。
Dependencies
你的包需要依赖的其他包,其中SPM会自动帮你获取和构建这些依赖项。
Tools version
是指最低支持的 Swift 工具链版本。
主要优势
- 官方原生支持:由苹果开发并与 Swift 语言和 Xcode 深度集成,无需额外安装。
- 跨平台:在所有支持 Swift 的平台上(Linux, macOS, Windows)都能工作。
- 声明式依赖:使用
Package.swift
文件声明依赖关系,简洁明了。 - 自动化管理:自动处理依赖的下载、编译、版本冲突解决(语义化版本控制)。
- 与Xcode无缝集成:在 Xcode 中可以直接编辑和管理 Swift 包,使用时添加依赖可以输入包所在的URL或直接导入包,方便快捷。
常用命令
常用命令一般如下:
swift package init --type library # 初始化包
swift build # 构建
swift test # 运行测试
swift run <executable-target> # 运行可执行目标
swift package resolve # 解析依赖
swift package update # 更新依赖
基本使用
创建Swift包
使用命令行可以快速创建包,命令参考如下:
# 创建一个库包
swift package init --name MyLib --type library
# 创建一个可执行包
swift package init --name MyLib --type executable
这会在当前目录生成一个标准的library包结构:
MyLib/
├── Sources/
│ └── MyLibMyLib/
│ └── MyLib.swift
├── Tests/
│ └── MyLibTests/
│ └── MyLibTests.swift
└── Package.swift
如图所示:

Package.swift文件
关于Package.swift
清单文件里的内容信息,一般如下:
// swift-tools-version: 6.0
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "MyLib",
platforms: [.iOS(.v18), .macOS(.v15)],// 指定包所支持的平台和最低版本
products: [
.library(name: "MyLib", targets: ["MyLib"])//指编译后的包,对外提供
],
dependencies: [// 声明此包所依赖的外部包
.package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.8.0")
],
targets: [// 定义包的相关信息
.target(
name: "MyLib",
dependencies: ["Alamofire"],
resources: [.process("Resources")]
),
.testTarget(
name: "MyLibTests",
dependencies: ["MyLib"]
)
]
)
MyLib.swift文件
Sources目录下一般是实现代码的存放位置,MyLib.swift
一般作为程序的入口,用于处理命令行参数并调用核心功能。
构建和测试
# 编译包
swift build
# 运行测试
swift test
# 运行包
swift run
Xcode中导入包
- 在 Xcode 中打开你的项目。
- 选择菜单栏的
File > Add Packages...
,如图所示:

- 在弹出的窗口中,选择Add Local,可以添加本地的package,如图所示:

也可以添加包存在的网址,如图所示:

- 选择完成后,点击
Add Package
,Xcode 会自动解析并下载该包及其所有依赖项。 - 依赖的包会出现在项目导航器的
Package Dependencies
部分,然后可以在代码中直接import
使用。
Xcode中删除包
如果在Xcode中导入包后,在项目导航器的 Package Dependencies
部分可能存在无法删除包的现象,那么如何让包不在项目里显示?
可以在项目.xcodeproj包内内容下的project.pbxproj里进行包的删除,删除后保存文件即可,如图所示:

安全防范
安全风险
编译后Swift包的位置,一般会以库或资源的形式存放在App内。
- 如果是static library/静态 Swift 包,编译后其目标代码被链接到主可执行文件内,app中看不到单独库文件。
- 如果是dynamic framework/XCFramework,则一般以框架形式内嵌到 App 包的 Frameworks 目录下,比如Payload/MyApp.app/Frameworks/<Name>.framework 或 <Name>.xcframework。
由于经过编译的目标文件包含汇编指令和符号表等信息,使用反编译工具对其进行解析,依然可以反编译为类C伪代码。针对一些只需交付静态库和目标文件的用户场景,为了保证程序不被逆向破解,则对静态库和目标文件的保护变得尤为重要
防范措施
Virbox Protector
工具在对静态库和动态库文件的保护上有着成熟的方案,可以实现对静态库和动态库文件进行函数级和整体保护,静态库具体方案参考官网文档静态库和目标文件保护最佳实践,动态库具体方案参考官网文档Native程序保护最佳实践。