带你了解Swift Package Manager工具

基础介绍

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中导入包

  1. 在 Xcode 中打开你的项目。
  2. 选择菜单栏的 File > Add Packages...,如图所示:
  1. 在弹出的窗口中,选择Add Local,可以添加本地的package,如图所示:

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

  1. 选择完成后,点击Add Package,Xcode 会自动解析并下载该包及其所有依赖项。
  2. 依赖的包会出现在项目导航器的 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程序保护最佳实践

滚动至顶部
售前客服
周末值班
电话

电话

13910187371