截至 2026 年 12 月 2 日 是 CocoaPods 注册表计划停止接受新 Podspec 的日期;这不等于现有 Flutter iOS 项目届时必然无法构建。本周建议:新项目优先评估 Flutter 3.44 的 Swift Package Manager 路径;存量项目先盘点插件与构建脚本,再用 macOS/Xcode CI 验证构建、测试和签名链路,之后分批决定是否迁移。 (docs.flutter.dev)
这篇适合维护 Flutter iOS 应用、需要判断依赖迁移范围的开发者。
如果你负责 Flutter 插件或原生集成,重点看插件适配与双轨验证。
如果你维护 Apple 平台 CI,重点看验收边界和生产切换条件。
新项目与存量项目:迁移起点不同
Flutter 官方文档说明,自 Flutter 3.44 起,Flutter 的 iOS/macOS 原生依赖默认使用 Swift Package Manager;CocoaPods 仍处于维护模式。注册表计划只读针对的是新 Podspec 的提交,不应被解读成现有 Podfile、Podfile.lock 或本地缓存立即失效。CocoaPods 公告也明确表示计划日期仍可能调整。(docs.flutter.dev)
Flutter 3.44 的 iOS 项目必须整体从 CocoaPods 迁到 Swift Package Manager 吗?
不必把框架版本升级、Flutter 自身默认依赖策略和你项目中所有原生依赖的迁移混为一谈。对新项目,优先评估 SPM 能否覆盖直接与间接依赖;对存量项目,则按实际插件、脚本和发版链路决定迁移范围。单凭注册表计划日期,不足以要求一次性全量切换。
| 项目情况 | 建议路径 | 关键决策条件 | 主要风险 |
|---|---|---|---|
| 新建 Flutter iOS 项目 | 优先评估 Swift Package Manager | 项目所需插件和原生库均有可验证的 SPM 支持 | 插件仍只提供 Podspec,或团队脚本假设 CocoaPods 目录存在 |
| 已稳定发版的存量项目 | 先盘点,再在隔离 CI 试迁 | 锁定依赖可解析,构建、测试及签名归档均通过 | 只验证解析便切换,遗漏归档、脚本或签名问题 |
| 存在暂不兼容插件的项目 | 暂缓全量迁移,明确双轨边界 | 维护方未确认支持,或关键依赖仍只支持 CocoaPods | 双轨期间两套依赖声明产生差异,责任人不清 |
按项目集成方式也要区分:Flutter 应用自身的 iOS 依赖与“把 Flutter 模块接入既有原生 iOS 工程”不是同一套迁移任务。Flutter 的集成文档对后者给出单独的 SPM 集成路径,并列出最低 Flutter 3.44 与 Xcode 15.0 前置要求;若你的仓库属于 add-to-app,不能只依据普通 Runner 项目的验证结果作结论。(docs.flutter.dev)
插件兼容与团队责任:解析通过不代表可以切换
遇到尚未支持 Swift Package Manager 的 Flutter 插件,应该怎样安排?
先确定它是直接依赖还是由其他插件带入的间接依赖,再查维护方是否提供 SPM 支持、计划或替代实现。Flutter 插件包含平台原生实现,Dart 侧依赖解析成功,并不能证明 iOS 原生依赖已经完整接入。Flutter 文档目前将 SPM 作为原生依赖的主要策略,同时仍保留 CocoaPods 兼容路径;这两点并不等于每个插件都已经适配。(docs.flutter.dev)
你可以把候选依赖逐项分成三类:已声明 SPM 支持且项目验证通过、维护方尚未确认或需要补充原生配置、依赖 CocoaPods 专属脚本或集成行为。第一类进入迁移候选;第二类先在测试分支验证或向维护方确认;第三类则需要评估替代方案、团队自维护能力和暂缓成本,不要为了消除 Podfile 而把未知责任转移给构建团队。
Swift Package Manager 也需要锁定与复现策略。检查 Xcode 工程或工作区中的 Package.resolved 是否纳入版本控制、CI 是否按仓库锁定版本解析,以及升级依赖时是否有明确审查流程。SwiftPM 文档说明解析结果会记录在 Package.resolved;CocoaPods 的 pod install 则会将已安装版本写入 Podfile.lock。比较两种方案时,应核对锁文件是否在团队和 CI 中稳定生效,而不是只比较清单文件的写法。(docs.swift.org)
| 验收维度 | 通过的证据 | 未通过时的处理 |
|---|---|---|
| 插件与原生依赖 | 直接、间接依赖均有明确来源和支持状态 | 逐个确认维护方,替换或暂缓相关插件 |
| 依赖解析 | 全新 CI 工作区可按锁定文件解析,无未审查的版本漂移 | 检查锁文件、私有源访问和版本约束 |
| 构建与测试 | 干净构建及项目测试通过,关键 flavor 均覆盖 | 定位脚本、原生编译或配置差异,保持旧路径可回退 |
| 签名与归档 | 使用预期证书及配置完成归档,产物可供后续发布流程使用 | 单独排查签名权限、钥匙串、配置文件与归档步骤 |
macOS/Xcode CI:把“能用”拆成可复核的结果
存量项目暂时保留 CocoaPods,眼下需要关注哪些影响?
短期判断应基于现有依赖的获取方式和项目实际构建,而不是把“注册表计划只读”直接等同于已锁定 Pod 无法安装。注册表公告写的是停止接受新 Podspec;现有仓库是否能复现构建,还取决于锁定文件、依赖来源、缓存、网络和脚本。特别是依赖更新、首次构建新环境或新增 Pod 时,风险与仅重建已锁定依赖并不相同。(blog.cocoapods.org)
注意:截至 2026 年 11 月 4 日,计划中的注册表只读日期仍是 2026 年 12 月 2 日,但 CocoaPods 公告注明日期并非不可调整。发布策略应以届时的官方状态和你的 CI 记录为准,不要把计划日期写成已执行的停服事件。(blog.cocoapods.org)
Apple 平台构建环境本身也是迁移变量。Flutter 官方说明,构建和发布 iOS 应用需要 Xcode,并须在 macOS 设备上完成;设备测试和发布还涉及证书、配置与签名。因此,Linux 上的 Dart 测试通过不能代替 iOS 原生构建和归档验收。(docs.flutter.dev)
建议把 CI 验收拆成以下 6 项,每项都保留日志与依赖锁定状态,避免只用一个“流水线绿灯”概括迁移结果:
- 固定 Flutter 与 Xcode 版本,记录
flutter --version、xcodebuild -version和构建目标;不要让测试分支与生产流水线使用不同的工具链。 - 在干净工作区检查依赖声明与锁文件,包括
pubspec.lock、Podfile、Podfile.lock、SPM 配置及Package.resolved;标出私有源、脚本和本地路径依赖。 - 从无旧构建产物的环境执行依赖解析,保存解析日志,并确认没有未审查的依赖版本变化。
- 执行 iOS 模拟器构建和项目测试;如果项目有多个 scheme 或 flavor,逐个覆盖实际发布配置。Flutter 的 flavor 文档也要求通过相应 scheme 验证不同构建配置。(docs.flutter.dev)
- 使用团队预期的证书与签名配置完成归档,核查 Bundle ID、签名身份和产物;仅
--no-codesign构建通过,不足以证明发布链路通过。 - 对照旧版流水线与新路径的依赖解析、构建、测试和归档记录;通过后先让有限分支或非生产任务采用新路径,并保留可执行的回退方式。
迁移后的 Xcode CI,哪些检查才能证明项目确实可用?
至少要证明干净环境能解析锁定依赖、目标 scheme 能完成原生编译、测试通过,并且归档使用预期签名配置。若 CI 只跑了依赖解析或模拟器测试,结论就只能写到那一步;它不能证明生产签名已通过,也不能外推到所有 Flutter 插件。
按兼容度分批决定,而非为日期仓促切换
你可以用下列规则做项目级决定:
- 直接迁移候选:新项目,依赖维护方明确支持 SPM,锁定策略清楚,隔离 macOS/Xcode CI 完成构建、测试和签名归档。
- 先做双轨验证:存量项目中有关键插件尚未确认支持,或脚本依赖 Podfile、Pods 目录等旧结构。先让新路径在独立分支验证,避免新旧声明同时成为两个未经审查的事实来源。
- 暂缓全量迁移:关键依赖无法解析、构建不稳定、签名归档失败,或团队尚无负责人维护原生集成。记录具体阻塞项与复核条件,等插件支持或构建证据补齐后再判断。
- 维持现状也要留证:如果现有 CocoaPods 工作流持续可复现,记录锁文件、依赖来源和 CI 结果,并在官方计划或依赖维护状态变化时重新检查。不要把“暂缓”变成没有期限的无人负责状态。
如需验证远端 macOS 环境能否满足团队的 Flutter 构建与测试要求,可先看 VpsHold 提供的 Mac 方案对比,再按自己的依赖和签名配置做一次隔离验收;实际环境信息也可参考 VpsHold 的远程 Mac 环境说明。远程 Mac 的价值在于免去立即采购并维护一台专用 Mac,适合临时验证、跨团队测试或阶段性 CI 迁移;如果你长期运行稳定的高负载任务,或必须连接本地物理设备与接口,自购 Mac 可能更合适。若当前流水线只用 Linux,无法完成 Xcode 原生构建与签名;若依赖人员桌面 Mac,则工具链版本和签名环境也可能难以统一。对这些边界明确的场景,按需租用 VpsHold 的远程 Mac,可作为建立隔离验证环境的选择。
