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 个不同结果:
- 依赖解析成功;
- Debug 可以编译;
- Release Archive 成功;
- 签名、导出和上传前校验成功。
只完成第 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;
- 当前插件清单;
Podfile、Podfile.lock和自定义脚本;- Debug、Release 和真机运行结果;
- 当前签名方式和导出参数。
第二步,建立迁移分支。保留旧分支的 Podfile、Podfile.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 步执行:
-
创建独立分支
不在生产分支直接修改 Flutter、Xcode 或依赖配置。 -
记录当前环境
保存 Flutter、Dart、Xcode、CocoaPods、Ruby 和项目依赖版本。 -
清理缓存并重新拉取代码
删除构建输出,重新获取依赖,避免依赖本地DerivedData或旧 Pods。 -
执行依赖解析
运行flutter pub get,检查 SwiftPM 是否生成,记录哪些插件回退到了 CocoaPods。 -
完成命令行构建
先执行 Debug,再执行 Release。把失败归类为依赖解析、编译、链接还是脚本错误。 -
完成 Xcode Archive
使用与生产相同的 Scheme、Flavor 和签名配置,验证.xcarchive是否生成。 -
验证签名和回退路径
不公开密钥,把证书和 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 官方公告。