Swift Package Manager
Swift Packages 是 Apple 用于软件依赖的新第一方工具。传统上,Capacitor 一直使用 CocoaPods 来管理内部依赖和插件,但现在是时候转向受支持的解决方案了。
自 Capacitor 6 起,你可以选择使用 CocoaPods 或 Swift Package Manager(SPM)。几乎所有当前 capacitor 团队支持的插件都支持 SPM,即 capacitor-plugins 中的插件。
我们已尽最大努力确保你使用 SPM 时无需对 Capacitor 的工作方式进行太多更改,但仍有一些事项需要了解。
工作原理
当 Capacitor 项目使用 SPM 时,我们使用一个"基础 SPM"包作为引用所有项目依赖的位置:

当你同步新插件时,Capacitor CLI 会修改 CapApp-SPM 包。请不要修改此处的文件,因为 CLI 可以且将会更改它们。
在新的 Capacitor 项目中使用 SPM
首先,从正常的 npm init @capacitor/app@latest 开始:

现在,将 iOS 平台添加到项目中:
npm install @capacitor/ios
接下来构建 Web 项目:
npm run build
完成后,我们可以添加 iOS 项目。我们需要在正常的 add 命令中添加 --packagemanager SPM 选项:
npx cap add ios --packagemanager SPM
现在,你可以使用 npx cap open ios 打开 iOS 项目并从那里运行你的应用。
使用 SPM 添加和使用 Capacitor 插件
让我们为这个项目添加一个插件,并进行一些操作。
首先安装 Capacitor App 插件:
npm install @capacitor/app
然后同步 Web 应用。这会将 App 插件 SPM 添加到 iOS 项目中:
npx cap sync
现在你可以正常使用 App 插件了。
在现有的 Capacitor 项目中使用 SPM
首先,确保你已备份当前项目状态,无论是通过源代码管理还是其他方式。
删除 iOS 目录
如果你根本没有手动更改过 Xcode 项目,一种迁移方法是删除 ios 目录,然后运行 npx cap add ios --packagemanager SPM。这将删除 CocoaPods 模板项目,并用 SPM 模板项目替换它。
使用我们的迁移工具
Capacitor CLI 有一个命令可以帮助从 CocoaPods 迁移到 Swift Package Manager。但是,仍然需要两个手动步骤。需要注意的一些事项:使用 Cordova 插件的项目应该可以工作,但某些插件可能无法正常工作,因为我们需要为它们生成一个 Package.swift 文件。此外,使用没有 SPM 版本的 Capacitor 插件的项目将无法正常工作,并且在迁移期间和运行 npx cap sync 时会显示关于不兼容插件的警告。
首先,在项目根目录下运行 npx cap spm-migration-assistant。
该工具将:
- 运行
pod deintegrate删除 CocoaPods - 删除
Podfile、App.xcworkspace和Podfile.lock - 创建一个
CapApp-SPM目录,包含所需的文件 - 从你的插件生成一个
Package.swift,并警告你如果某些插件无法包含 - 向你的 iOS 项目目录添加一个
debug.xcconfig
然后运行 npx cap open ios,你应该会看到类似这样的内容:

选中 App,然后选择 Package Dependencies 选项卡,在此页面上按 + 符号添加一个依赖:

你应该会看到类似下面的内容 - 从对话框中选择 Add Local...:

在此对话框中选择 CapApp-SPM,然后点击 Add Package:

出现此屏幕时,再次点击 Add Package:

完成时,你应该会看到类似这样的屏幕。现在,继续下一节关于添加 debug.xcconfig 的内容。

将 debug.xcconfig 添加到项目
从应用信息选项卡中,选择 Add Configuration file...

然后选择名为 debug.xcconfig 的文件

最后选择 xcconfig 作为你的选择

至此,你就完成了,可以像往常一样构建和开发。
将现有插件转换为 SPM
如果你的插件除了必需的 [Name]Plugin.m 和 [Name]Plugin.h 之外只包含 Swift 代码,你可以使用 capacitor-plugin-converter。
该工具将进行以下更改:
- 在你的主 Swift 插件文件
[Name]Plugin.swift中添加以下必需内容:- 为你的类添加对
CAPBridgedPlugin协议的遵循。 - 为你的类添加 3 个变量:
identifier、jsName和pluginMethods:identifier将对应CAP_PLUGIN宏的第一个参数。jsName将对应CAP_PLUGIN宏的第二个参数。pluginMethods将是传递给CAP_PLUGIN宏的方法数组。
- 为你的类添加对
- 在插件文件夹的根目录创建一个
Package.swift文件。 - 以下文件将被删除,因为它们不再需要:
Plugin.xcodeprojPlugin.xcworkspacePlugin/Info.plistPluginTests/Info.plistPodfile
- 为遵循 SPM 最佳实践,项目文件将移动到
Sources和Tests目录。 - 插件的
package.json将有以下更改:- files 数组将添加以下文件或目录:
ios/Sourcesios/TestsPackage.swift
verify:ios将更改为xcodebuild -scheme YourPluginName -destination generic/platform=iOS以使其继续按预期工作。
- files 数组将添加以下文件或目录:
- 你的插件 podspec 将被修改,使
s.source_files现在指向Sources目录而不是Plugin目录。
更多信息请参阅 capacitor-plugin-converter 仓库中的文档。
故障排除
添加插件后,尝试在 Xcode 中"重置包缓存":
