移动/游戏
Capacitor iOS 从 CocoaPods 迁移到…
适用于已有 Capacitor iOS 应用需要从 CocoaPods 迁移到 Swift Package Manager(SPM),并保留原生定制、运行迁移助手、修复插件兼容性和完成 Xcode 配置。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
Capacitor iOS 从 Coco特定
解决思路
- 迁移约束:Capacitor 8 默认创建使用 SPM 的新 iOS 项目。
- 迁移约束:现有 CocoaPods 应用不会仅因 Capacitor 升级而自动改变。
- 迁移约束:在基于 SPM 的 Capacitor 应用中,插件依赖通过 `ios/App/CapApp-SPM` 引用。
- 迁移约束:不要手动编辑 `CapApp-SPM`;Capacitor CLI 会在 `npx cap sync` 期间重写它。
- 迁移约束:不要在同一个 Capacitor 应用迁移中混用 CocoaPods 和 SPM;`package.json` 中所有 Capacitor 和 Cordova 插件都需要支持 SPM,应用才能完全迁移。
- 迁移约束:在删除、重新生成或 deintegrate iOS 项目前,提交或以其他方式保留当前项目。
- 命令策略:依赖安装和 package scripts 使用目标仓库的包管理器。
- 命令策略:本技能中的 Capacitor CLI 命令统一使用 `npx cap ...`,确保使用项目本地 Capacitor CLI。
- 命令策略:在 Capgo 仓库中,如果仓库说明要求,本地开发命令使用 Bun;但 Capacitor CLI 示例仍保持 `npx cap ...`。
- 项目快照:使用 Live Project Snapshot 的 `node -e` 片段扫描 `package.json`,列出 `dependencies` 和 `devDependencies` 中所有 Capacitor、Capgo、Cordova 及相关插件依赖与版本。
- 项目快照:使用 `find` 在 `ios` 下最大深度 5 查找 `Podfile`、`Podfile.lock`、`Pods`、`App.xcworkspace`、`Package.swift`、`Package.resolved`、`CapApp-SPM`、`debug.xcconfig`、`project.pbxproj`、`Info.plist`、`*.entitlements`、`GoogleService-Info.plist`。
- Step 1:检查 `package.json` 中的 Capacitor 主版本和已安装插件。
- Step 1:检查 `ios/App/Podfile` 和 `ios/App/Podfile.lock`,确认当前 CocoaPods 依赖。
- Step 1:检查 `ios/App/App.xcodeproj/project.pbxproj`,记录自定义 build settings、package references、entitlements、签名和原生源文件。
- Step 1:检查 `ios/App/App/`,记录应用定制。
- Step 1:修改文件前验证应用处于支持 SPM 迁移的 Capacitor 版本。
- Step 1:修改文件前验证工作区干净,或用户接受保留本地更改。
- Step 1:修改文件前验证每个 Capacitor/Cordova 插件都有 SPM 支持或替代方案。
- Step 1:如果迁移属于 Capacitor 8 升级,结合 `capacitor-app-upgrade-v7-to-v8`。
- Step 2:记录并保留 `ios/` 下会被全新模板覆盖的内容:`ios/App/App/Info.plist`。
- Step 2:记录并保留 `ios/App/App/AppDelegate.swift`。
- Step 2:记录并保留 `ios/App/App/SceneDelegate.swift`(如果存在)。
- Step 2:记录并保留 `ios/App/App/Assets.xcassets/`。
- Step 2:记录并保留 `ios/App/App/Base.lproj/`。
- Step 2:记录并保留 `ios/App/App/*.entitlements`。
- Step 2:记录并保留 `ios/App/App/GoogleService-Info.plist`(如果使用 Firebase)。
- Step 2:记录并保留自定义 `.xcconfig` 文件。
- Step 2:记录并保留自定义 Swift 或 Objective-C 源文件。
- Step 2:记录并保留自定义 frameworks、SDK 文件、extension targets、build phases、schemes 和 signing settings。
- Step 2:优先通过 git 和显式 diff 保留;不要依赖记忆。
- Step 3:根据项目选择迁移路径:CLI assistant 适用于 iOS 项目有中等定制且插件大多支持 SPM;它会自动化移除 CocoaPods,但仍需 Xcode 步骤。
- Step 3:Fresh SPM re-scaffold 适用于 iOS 项目接近 Capacitor 模板;结果最干净,但必须小心恢复原生定制。
- Step 3:Manual repair 适用于 assistant 已运行或项目高度定制;控制更多,但需要更多 Xcode 工程编辑。
- Step 3:如果不确定,先处理插件兼容性和备份工作;在保留清单完成前不要删除 `ios/`。
- Step 4:优先尝试运行 `npx cap spm-migration-assistant`。
- Step 4:确认该助手会执行 CocoaPods deintegration。
- Step 4:确认该助手会删除 `Podfile`、`Podfile.lock`、`Pods` 和 `App.xcworkspace`。
- Step 4:确认该助手会创建 `ios/App/CapApp-SPM`。
- Step 4:确认该助手会根据已安装插件生成 `Package.swift`。
- Step 4:确认该助手会生成 `debug.xcconfig`。
- Step 4:确认该助手会警告无法表示为 SPM 包的插件。
- Step 4:运行 `npx cap open ios` 打开 iOS 项目。
- Step 4:在 Xcode 中选择 app project。
- Step 4:在 Xcode 中打开 Package Dependencies 标签页。
- Step 4:在 Xcode 中添加本地 `CapApp-SPM` 包。
- Step 4:按 assistant 输出把生成的 `debug.xcconfig` 添加到项目配置。
- Step 4:完成 Xcode 改动后运行 `npx cap sync ios`。
- Step 5:当 iOS 项目几乎没有自定义原生配置,或 assistant 路径比重建更混乱时,使用全新重建路径。
- Step 5:删除任何内容前,先保留 Step 2 列出的原生文件。
- Step 5:运行 `rm -rf ios`。
- Step 5:运行 `npx cap add ios --packagemanager SPM`。
- Step 5:运行 `npx cap sync ios`。
- Step 5:Capacitor 8+ 中 `npx cap add ios` 默认使用 SPM,但记录迁移时仍保留 `--packagemanager SPM` 以明确意图。
- Step 5:有意识地恢复自定义文件和设置:复制回 app icons 和 launch storyboards。
- Step 5:重新应用 `Info.plist` 键,但不要盲目覆盖新模板改动。
- Step 5:恢复 entitlements 和 signing。
- Step 5:恢复 Firebase 或其他服务配置文件。
- Step 5:重新添加自定义原生源文件、extensions、build phases 和 schemes。
- Step 6:如果 `npx cap sync` 或 assistant 警告不支持的插件,将插件升级到支持 SPM 的版本。
- Step 6:如果无法升级,用官方、Capgo 或维护良好的社区替代插件替换。
- Step 6:如果插件由项目自己维护,用 `capacitor-plugin-spm-support` 迁移插件本身。
- Step 6:如果关键插件还不能支持 SPM,推迟完整 SPM 迁移。
- Step 6:不要在其他部分已迁移到 SPM 时继续让某个插件留在 CocoaPods。
- Step 7:先运行仓库常规 web build,然后同步并构建 iOS:`npx cap sync ios`。
- Step 7:运行 `npx cap open ios`。
- Step 7:在 Xcode 验证 `CapApp-SPM` 作为本地包依赖存在。
- Step 7:验证 `debug.xcconfig` 已附加到 debug 配置。
- Step 7:验证迁移后的应用不再有 `Podfile`、`Pods`、`Podfile.lock` 和 `App.xcworkspace`。
- Step 7:验证 `Package.resolved` 已生成,若存在则提交。
- Step 7:验证 signing team、bundle identifier、deployment target、entitlements 和 capabilities 保留下来。
- Step 7:验证应用能在模拟器构建并启动。
- Step 7:当原生插件流程需要硬件或权限时,在真机上验证仍可用。
- Step 7:如果用命令行验证,使用迁移后实际存在的 workspace/project 和 scheme。
- 常见失败 Unsupported Plugin:原因是一个 Capacitor 或 Cordova 插件没有提供 SPM 元数据;修复是升级、替换或迁移插件;如果插件为项目所有,使用 `capacitor-plugin-spm-support`。
- 常见失败 Missing CapApp-SPM:原因是 assistant 未完成、文件被删除或 `npx cap sync` 尚未重新生成包;修复是运行 `npx cap sync ios`,然后在 Xcode 中链接本地包(若尚未链接)。
- 常见失败 Missing debug.xcconfig:原因是生成的配置未加入 Xcode 项目;修复是按 migration assistant 输出把 `ios/App/debug.xcconfig` 添加到 Xcode 项目配置。
- 常见失败 Duplicate Symbols or Duplicate SDKs:原因是同一依赖仍被残留 CocoaPods 产物和 SPM 同时引用;修复是从 app 移除 CocoaPods 产物,清理 derived data,在 Xcode 中重置 package caches,然后重建。
- 常见失败 Lost Native Customization:原因是全新 iOS scaffold 覆盖了定制文件;修复是从 git 或保留备份恢复,然后针对新 SPM 模板选择性重新应用更改。
- 规划任务输出 markdown:`## SPM Migration Plan`,包含 `### Current State`(Capacitor version、CocoaPods files、Plugins needing SPM check、Native customizations to preserve)。
- 规划任务输出:`### Recommended Path`(CLI assistant / fresh re-scaffold / manual repair 及原因)。
- 规划任务输出:`### Steps`(1. Preserve native files;2. Verify plugin SPM support;3. Run migration;4. Complete Xcode package/config setup;5. Sync and build)。
- 规划任务输出:`### Risks`(Unsupported plugins、Native customizations、Manual Xcode steps)。
- 实现任务:进行迁移更改,运行仓库中可用的相关构建或验证命令,并报告剩余只能由 Xcode 或真机完成的检查。
适用边界 · 注意事项
- 不要用于给插件包本身添加 SPM 支持;该场景使用 `capacitor-plugin-spm-support`。
- 不要在同一个 Capacitor 应用迁移中混用 CocoaPods 和 SPM;所有 Capacitor/Cordova 插件需支持 SPM 后才能完全迁移。
- 如果关键插件尚不能支持 SPM,不要强行完成完整迁移,应推迟。