先看结论:不要因为本机能构建,就把所有项目一次性切到 SwiftPM;应按插件支持情况分批验收 Flutter 3.47 的 iOS CI,并在干净的 Mac 环境重新解析依赖、测试和归档。 这适用于正在升级 Flutter、维护 iOS 插件或负责 Mac 发布流水线的团队;如果依赖链仍需 CocoaPods,就先保留并记录回退路径。

适合计划升级 Flutter 的 iOS 应用维护者,核对原生依赖是否兼容。
适合需要验证 SwiftPM 解析、归档与签名的 CI 工程师。
也适合要判断插件是否提供 SwiftPM 支持、是否仍需 CocoaPods 的插件维护者。

截至 2026 年 10 月 31 日,Flutter 官方资料将 3.47 列为稳定版,并说明从 3.44 起 SwiftPM 成为 iOS 与 macOS 原生依赖的默认管理方式。默认不代表每个仓库都已完成迁移:项目配置、插件支持和构建日志仍要逐项核对。(Flutter 官方稳定版发布说明)

普通 Flutter 应用:核对实际迁移状态

Flutter 3.47 项目的默认依赖管理方式是 SwiftPM。 官方说明从 Flutter 3.44 起 SwiftPM 默认开启,升级 Flutter 并运行应用时会自动添加集成;但项目可能曾被团队手动关闭、改动或迁移过,不能仅根据版本号推断仓库当前状态。检查 Xcode 项目中是否有 FlutterGeneratedPluginSwiftPackage 依赖,以及 Scheme 是否运行 Run Prepare Flutter Framework Script 预操作;再对照 project.pbxproj、Scheme 和 CI 日志。(Flutter 面向应用开发者的 SwiftPM 文档)

初次验收时先保留原有工作分支和 Pod 配置,记录变更前后的构建入口。若自动迁移后本地 Xcode 能运行、CI 却找不到包,先确认 CI 实际打开的工作区、Scheme 和生成配置是否与本地相同,再排查依赖恢复;不要直接删除 CocoaPods 文件来“清理干净”。

插件场景:分清 SwiftPM 支持与回退

插件暂时没有 SwiftPM 支持时,构建链会如何处理? Flutter 文档说明,对尚不支持 SwiftPM 的依赖存在 CocoaPods 回退路径;但回退能力不是每个插件、每种组合都必然可构建的保证。要结合插件自身的 Package.swift 或 .podspec、原生依赖声明,以及本次构建日志确认实际走的是哪条路径。(Flutter 面向应用开发者的 SwiftPM 文档)

插件清单应至少检查:

  • ✅ 插件是否提供 SwiftPM 描述文件,原生依赖是否在其中声明完整。
  • ✅ 如果只有 CocoaPods 配置,Pod 依赖、私有源和宿主项目自定义 Podfile 逻辑是否仍需要。
  • ✅ 解析出的包版本是否锁定并提交;不要只依赖开发机已经下载的缓存。
  • ✅ 插件最低 iOS 部署目标是否高于应用目标;SwiftPM 插件要求更高系统版本时,应用目标需要匹配,否则解析通过也可能在 Xcode 构建阶段失败。(Flutter 插件作者 SwiftPM 迁移说明)

插件作者可以按 Flutter 的迁移说明检查包目录与清单;应用维护者则应将实际插件版本和构建日志归档,避免把“文档声称支持”当作 CI 已验收。Flutter 的插件开发文档也区分 SwiftPM 原生依赖与用于向后兼容的 CocoaPods 声明。

原生 iOS 工程嵌入 Flutter:单独验收宿主

add-to-app 不是普通 Flutter Runner 工程的同一种验收对象:依赖解析和构建入口可能由原生宿主工程控制。先按官方将 Flutter 集成到现有 iOS 工程的指南核实宿主使用的集成方式、工作区和构建目标,再在宿主工程的实际 Scheme 下执行解析与归档。

从旧 CocoaPods 集成迁移时,不要把普通应用的清理步骤直接照搬到宿主仓库。先逐项核对官方迁移指南规定的移除范围,区分 Flutter 插件依赖与宿主自身通过 CocoaPods 加入的依赖;清理后单独复测宿主构建,避免删除仍被宿主使用的配置。

干净 Mac CI:复现解析并保存交付证据

怎样确认 Swift 包依赖能在干净环境解析? 关键是让测试不借用开发机缓存:使用与目标流水线一致的提交,在全新或清理过缓存的 Mac 工作环境恢复依赖,检查锁定文件、Xcode 解析结果和后续归档,而不是只重复本机成功记录。

可照以下顺序操作:

  1. 固定仓库提交,并记录 Flutter、Xcode、构建 Scheme 和依赖锁定文件状态。
  2. 在干净 Mac 工作环境检出该提交;不要把本机 Pods、Swift 包缓存或未提交的 Xcode 改动带入验收。
  3. 执行项目实际使用的 Flutter 依赖恢复及 iOS 构建配置步骤,保存完整日志;确认解析结果来自锁定状态,而非开发机遗留缓存。
  4. 运行测试和 Xcode 构建,确认插件编译、最低部署目标及原生链接均通过。
  5. 生成 IPA 归档,留存 .xcarchive、导出 IPA、签名验证结果和构建日志;涉及分发时,另外核对导出选项与团队的发布流程。
  6. 如果依赖私有 Git 仓库或需要认证,给 CI 配置必要凭据,并检查日志不会输出令牌、私钥或敏感环境变量。

Apple 建议将 Package.resolved 纳入版本控制,以固定 CI 使用的包版本;对于直接调用 xcodebuild 的流水线,还提供禁用自动解析的选项。私有包需要配置认证;SSH 依赖还需确认执行任务的 macOS 用户能读取相应凭据。详见 Apple Swift 包持续集成文档。Flutter 的 iOS 发布文档说明,flutter build ipa 会生成 .xcarchive 和 IPA;因此,“构建命令返回成功”与“归档可验证、IPA 可按预期导出”应分别留证。(Flutter iOS 发布文档)

CocoaPods 仓库只读是否已经发生? 截至 2026 年 10 月 31 日,Flutter 官方文档列出的安排是 2026 年 12 月 2 日转为只读;该日期尚未到,不能写成已经生效。文档说明,届时的变化针对 trunk 新增 Podspec 的能力,不应被误解为现有项目当天就无法构建;但依赖更新与维护规划仍值得提前复核。

按验收结果确定迁移范围

用下面的条件分支形成团队决策,而不是对所有应用套用同一个结论:

  • 若所有 iOS 插件均有适用的 SwiftPM 声明、锁定文件已纳入版本控制,且干净 Mac CI 能完成解析、测试和归档,则可扩大 SwiftPM 使用范围,并在发布流水线保留依赖和签名证据。
  • 若少数插件仍依赖 CocoaPods,且当前构建日志能确认回退路径成功,则保留必要的 CocoaPods 配置,单独标记相关插件与负责人;不要因此宣称全部依赖已迁移。
  • 若干净环境解析失败、私有依赖无法认证,或 IPA 归档和签名尚未验证,则暂缓扩大迁移,先修复该阶段,再从同一提交复跑。
  • 若项目是原生宿主嵌入 Flutter,则按宿主工程的构建入口单独验收,不以普通 Flutter 应用的成功结果代替。

最后,团队现在用的方式是否值得继续?只用开发者本机做发布构建,容易受缓存和个人配置影响;共享一台常开 Mac 会带来排队、权限与密钥隔离问题;临时拼装的云端环境则可能难以复现固定的 Xcode 与签名状态。需要短期补齐 macOS 验收节点、并希望通过 SSH、VNC 或网页控制台使用真实 Mac 时,可评估 RUVCLOUD 的远程 Mac 环境;若项目长期稳定高负载或必须连接本地物理设备,先比较自购 Mac 与远程环境的持续成本及硬件要求,也可查看 套餐与计费信息。更稳妥的做法,是先挑一个代表性 Flutter 项目跑完依赖恢复、测试和归档,再决定是否扩大迁移。

最后更新于 2026 年 10 月 31 日;版本与迁移规则核实自 Flutter 官方稳定版说明、SwiftPM 应用与插件文档、add-to-app 指南及 Apple Swift 包 CI 文档。