Flutter 3.44 iOS 构建的建议很明确:新项目现在直接采用 Swift Package Manager;普通存量项目在 2026 年迁移,但必须保留回退分支;插件密集、Add-to-App 和多 Target 项目先双轨验证,不要急着删除 CocoaPods。

截至 2026 年 8 月 14 日,Flutter 官方已经确认 3.44 默认启用 Swift Package Manager,并在插件尚未兼容时回退到 CocoaPods。你本周最该做的不是立刻删掉 Podfile,而是复制一条迁移分支,在干净 macOS 环境完成依赖解析、Release Archive、签名和回退测试。

谁该看这篇:

准备把现有 iOS 项目升级到 Flutter 3.44、但不确定插件是否兼容的独立开发者。维护远程 Mac、自动构建脚本或多套 Flavor 的小团队。开发 Flutter 插件、Add-to-App 模块或自定义原生 Target 的开发者,也需要单独核对集成边界。

01

先按项目角色决定迁移节奏

Flutter 3.44 的变化不是简单替换一个命令。它改变的是 iOS 和 macOS 原生依赖的默认接入路径。官方发布说明列出了默认启用 Swift Package Manager、插件兼容性提示,以及 CocoaPods 与 SwiftPM 冲突检测等变化,可参考 Flutter 3.44.0 官方发布说明

你可以先按下面的结论分组:

  • 新建 Flutter 项目:优先使用 Flutter 3.44 默认的 Swift Package Manager。
  • 普通存量项目:建立升级分支,验证通过后再合并。
  • 插件密集项目:先确认关键插件是否提供 SwiftPM 支持,暂时保留 CocoaPods。
  • Add-to-App 项目:不要直接套用普通 Flutter App 的自动迁移经验。
  • 多 Target、多个 Flavor 或自定义脚本项目:先逐个 Target 验证依赖和构建阶段。
  • 持续集成维护者:在没有本地缓存的干净构建节点重新解析依赖。

你要区分 4 个不同结果:

  1. 依赖解析成功;
  2. Debug 可以编译;
  3. Release Archive 成功;
  4. 签名、导出和上传前校验成功。

只完成第 1 步,不能说明项目已经迁移完成。模拟器能启动,也不能证明生产包可以签名。

02

新项目直接采用默认 Swift Package Manager

新项目通常没有历史 Podfile、Ruby Gem 环境、自定义 CocoaPods Hook,也没有多年积累的构建脚本。此时主动恢复 CocoaPods,反而会把旧依赖管理负担带回项目。

Flutter 官方文档说明,从 3.44 开始,Swift Package Manager 默认开启;如果某个插件还不支持 SwiftPM,Flutter 会回退使用 CocoaPods。具体行为可查看 Flutter Swift Package Manager 应用开发者文档

新项目建议这样检查:

  • 执行 flutter pub get,确认插件依赖可以生成;
  • 打开 Xcode,查看是否出现 Flutter 生成的 Swift Package;
  • 检查插件是否被加入正确的 App Target;
  • 使用真机运行一次,不只测试模拟器;
  • 执行 flutter build ipa,确认可以生成 Archive 和 IPA;
  • 查看构建日志,确认是否发生 CocoaPods 回退;
  • Package.resolved 等依赖锁定文件纳入版本控制。

Apple 的官方说明建议提交 Package.resolved,让团队和构建节点使用相同的包版本。依赖锁定文件不应只存在于开发者个人电脑中,否则远程构建节点可能解析出不同版本,导致本地能编译、CI 却失败。

新项目的验收重点不是“项目里有没有 CocoaPods”,而是依赖能否在干净环境中稳定解析。

03

普通存量项目先建立可回退分支

如果你的项目主要使用常见 Flutter 插件,原生代码改动不多,通常适合迁移。但不要直接在唯一生产分支上升级。

第一步,记录当前可发布状态:

  • Flutter 版本和 Dart 版本;
  • Xcode 版本;
  • iOS Deployment Target;
  • 当前插件清单;
  • PodfilePodfile.lock 和自定义脚本;
  • Debug、Release 和真机运行结果;
  • 当前签名方式和导出参数。

第二步,建立迁移分支。保留旧分支的 PodfilePodfile.lock、构建脚本和 CI 配置。迁移失败时,你需要能够在短时间内回到原来的打包路径,而不是重新猜测构建机应该安装什么。

第三步,升级 Flutter 并运行项目。自动迁移成功后,比较以下差异:

  • Xcode 项目文件是否出现新的包依赖;
  • Scheme 是否增加 Flutter 预处理脚本;
  • 插件 Target 是否发生变化;
  • 构建阶段是否仍然调用 CocoaPods;
  • Debug 与 Release 的链接参数是否一致。

第四步,分别执行 Debug 和 Release 构建。Debug 通过,只能说明开发路径基本可用。Release 还要检查资源、架构、签名和导出设置。

第五步,在真机上验证登录、推送、相机、定位、支付等原生能力。依赖迁移可能不会影响 Dart 层代码,却可能改变原生库的链接方式或资源处理方式。

对于正式发布,不能只依赖模拟器启动结果。应完成一次真实的 Release Archive,并保存构建日志、导出配置和签名校验结果,之后再决定是否合并迁移分支。

04

插件兼容性不足时的处理路径

不要为了追求“完全移除 CocoaPods”而强行替换插件。Flutter 当前的设计允许不兼容 SwiftPM 的依赖回退到 CocoaPods,因此混合状态是官方支持路径之一,不代表迁移失败。

你可以按阻塞程度处理:

  • 非关键插件不兼容:暂时保留 CocoaPods,记录替换计划。
  • 关键插件不兼容但已有新版本:先在分支升级插件,再测试原生功能。
  • 私有 Pod 或闭源 SDK 不兼容:保留 CocoaPods,建立明确的构建机依赖。
  • 插件作者长期不维护:评估替代插件,或自行增加 SwiftPM 支持。
  • 插件包含原生资源、二进制 Framework 或自定义脚本:不能只看 pubspec.yaml,还要检查 Xcode Target 和资源复制阶段。

插件作者需要额外检查 Package.swift、平台版本、资源声明、Objective-C 或 Swift 混编方式,以及测试 Target。下游项目能否真正构建,比插件仓库里是否存在一个 Package.swift 文件更重要。

CocoaPods 是否仍要保留

答案取决于项目依赖,而不是 Flutter 版本本身。

如果所有原生依赖都能通过 SwiftPM 解析,新的普通项目可能不再需要主动运行 pod install。但只要某个插件、私有 SDK 或原生 Target 仍然回退到 CocoaPods,你的构建节点就不能贸然删除 CocoaPods 环境。

CocoaPods Trunk 计划在 2026 年 12 月 2 日转为只读,官方公告同时说明现有构建和现有 Pod 并不会因此立即失效,时间表也可能调整。这里的重点是提前减少新依赖对 CocoaPods 的依赖,不是现在就把所有 Pod 清空。参考 CocoaPods Trunk 只读计划公告

更稳妥的做法是保留兼容环境,同时在迁移分支中记录哪些插件触发了 CocoaPods 回退。等关键插件完成 SwiftPM 验证,再分批删除旧配置。

05

复杂原生集成需要双轨,而不是一次性替换

Add-to-App 项目

Add-to-App 把 Flutter 模块嵌入已有 iOS 应用。宿主项目通常有自己的 Xcode 工程、Target、Scheme、构建配置和签名流程,不能把普通 Flutter App 的自动迁移当成完整方案。

Flutter 官方的 Add-to-App 新流程要求生成 FlutterNativeIntegration Swift Package,并将其加入宿主 Xcode 项目。官方文档还要求配置 FLUTTER_SWIFT_PACKAGE_OUTPUT、预处理脚本和 Build Phase。详细步骤见 Flutter iOS Add-to-App 集成文档

你需要重点核对:

  • Flutter 模块的相对路径是否适合 CI;
  • 自定义 Configuration 是否正确映射到 Debug、Profile 或 Release;
  • 宿主 App 的多个 Target 是否都加入必要依赖;
  • Build Phase 的脚本是否按正确顺序执行;
  • 宿主项目原有 CocoaPods 是否仍服务其他 SDK;
  • 本地构建和命令行构建是否使用同一套输出路径。

多 Flavor、多 Target 和扩展 Target

通知扩展、分享扩展、Widget、内部测试 Target,都可能有自己的依赖关系。迁移时不能只打开主 App Target 看一眼。

逐个检查:

  • 主 App 是否能解析依赖;
  • 每个 Flavor 是否使用正确 Scheme;
  • Extension 是否误链接了不应包含的 Flutter Framework;
  • 原生测试 Target 是否仍能编译;
  • 自定义脚本是否依赖 Pod 的环境变量;
  • Archive 中是否出现重复 Framework 或错误的嵌入关系。

这种项目更适合保留两条构建路径。新路径验证 SwiftPM,旧路径继续服务紧急发布。等至少完成一次真实 Release Archive 和签名导出,再考虑删除旧配置。

06

迁移是否会影响签名,关键看构建产物边界

依赖管理方式变化不等于证书自动失效。真正需要关注的是 Xcode Target、嵌入 Framework、Entitlements、Provisioning Profile 和导出方式是否发生变化。

签名验证至少包括:

  • Bundle Identifier 没有被迁移脚本改写;
  • Team 和 Signing Certificate 保持正确;
  • 主 App 与 Extension 的 Provisioning Profile 对应;
  • 推送、关联域名、Keychain Sharing 等能力仍在;
  • Archive 中的 Framework 已按预期签名;
  • 导出的 IPA 可以通过上传前校验。

Apple 的签名文档指出,Capabilities 会影响 Entitlements 和 Provisioning Profile,手动签名时尤其需要逐项检查 Apple 的 Xcode 签名与 Capabilities 文档

迁移前后建议对比以下产物:

  • Archive 文件大小和目录结构;
  • .app 内嵌 Framework;
  • Entitlements 文件;
  • codesign 检查结果;
  • ExportOptions 配置;
  • App Store Connect 上传前的校验日志。

如果依赖管理迁移后出现签名失败,先确认 Target 和 Entitlements 是否改变,再判断证书问题。不要一看到上传失败就重新创建证书或删除本地签名配置。

07

在远程 Mac 上完成干净环境验收

远程 Mac 的价值不只是“能打开 Xcode”,而是提供一台可以随时回到干净状态的 macOS 构建节点。迁移时尤其要避免本地缓存掩盖缺失配置。

你可以照下面的 7 步执行:

  1. 创建独立分支
    不在生产分支直接修改 Flutter、Xcode 或依赖配置。

  2. 记录当前环境
    保存 Flutter、Dart、Xcode、CocoaPods、Ruby 和项目依赖版本。

  3. 清理缓存并重新拉取代码
    删除构建输出,重新获取依赖,避免依赖本地 DerivedData 或旧 Pods。

  4. 执行依赖解析
    运行 flutter pub get,检查 SwiftPM 是否生成,记录哪些插件回退到了 CocoaPods。

  5. 完成命令行构建
    先执行 Debug,再执行 Release。把失败归类为依赖解析、编译、链接还是脚本错误。

  6. 完成 Xcode Archive
    使用与生产相同的 Scheme、Flavor 和签名配置,验证 .xcarchive 是否生成。

  7. 验证签名和回退路径
    不公开密钥,把证书和 API Key 放入安全的 CI Secret。确认新路径失败时,旧 CocoaPods 分支仍能完成发布构建。

你可以把这份清单直接放进迁移任务:

  • [ ] 新项目或存量项目类型已确认;
  • [ ] 所有 Flutter 插件已逐项检查 SwiftPM 支持;
  • [ ] Podfile、锁文件和旧构建脚本已备份;
  • [ ] 干净远程 macOS 环境可重新解析依赖;
  • [ ] Debug 真机运行通过;
  • [ ] Release Archive 生成成功;
  • [ ] 主 App 与扩展 Target 签名一致;
  • [ ] IPA 通过上传前校验;
  • [ ] CocoaPods 回退路径仍可用;
  • [ ] CI 记录了失败阶段和恢复步骤。

如果你当前没有独立的 macOS 测试节点,可以先参考 VpsMesh 的 Mac 远程租赁方案,用临时环境复制现有工具链。对于需要重复迁移和持续打包的团队,再比较 Mac mini M4 租赁配置Mac mini M4 租赁价格,不要在没有验收数据前直接改变生产构建机。

08

当前方案与 Mac 构建环境的取舍

如果你继续在唯一一台本地电脑上完成 Flutter 3.44 迁移,常见问题是环境无法隔离、缓存难以清理、签名配置容易和日常开发混在一起。Windows 或 Linux 用户还需要临时寻找 macOS 环境,遇到插件回退 CocoaPods 时,Ruby、Pod 和 Xcode 配置又会增加排查成本。

对于只需要一次迁移验证、短期发布或临时复现构建问题的情况,租赁一台远程 Mac 通常比立即购买专用 Mac 更灵活。你可以先复制生产工具链,完成 Flutter 3.44 iOS 构建的前后对照,再决定是否保留常驻 Mac。若你需要长期高频构建、物理 USB 设备调试或持续重负载运行,自购 Mac 或固定构建机仍可能更合适。

最后更新于 2026 年 8 月 14 日,版本与迁移结论核实自 Flutter 3.44 官方文档、Flutter Add-to-App 文档、Apple 开发者文档及 CocoaPods 官方公告。