Flutter 3.47 iOS 建置失敗,最快的處理順序是:先升級到包含相關 iOS 與 SwiftPM 修復的最新 3.47 穩定補丁版,再用同一提交重跑依賴解析、Build 與 Archive;仍然失敗時,才按專案類型檢查 SwiftPM 集成和插件支援,只有插件不相容才暫時回退 CocoaPods。

這篇適合剛升級 Flutter 3.47、發現原本正常的 iOS 專案無法建置或歸檔的獨立開發者。若你使用 Xcode 27、遠端 Mac 或無人值守打包,也能用同一套流程區分專案故障與環境故障。

最後更新於 2026 年 9 月 16 日。 Xcode 27 已於 2026 年 9 月 14 日正式發布;日期與版本狀態請以 Apple 的 Xcode 發布資料Xcode Release Notes 為準。

先保存失敗現場,再動任何設定

典型的脫敏對照日誌會是:

同一提交:
舊 Flutter/Xcode 環境:依賴解析成功,Debug Build 成功
升級 Flutter 3.47 與 Xcode 27 後:Swift package 解析或 Xcode Build 失敗

這個對照只能說明升級後出現關聯,不代表所有 Flutter 3.47 iOS 建置失敗都由同一個回歸造成。你應先保存以下資料:

  • 實際 Flutter 補丁版本、Xcode 版本與目前使用的 SDK。
  • 觸發方式:flutter build ios、Xcode 圖形介面、xcodebuild、CI 或 SSH。
  • 第一個有效錯誤,而不是最後一行泛用的 build failed
  • 依賴解析結果、普通 Build 結果,以及 Archive 結果。
  • 專案提交、插件鎖定檔、Podfile.lock 和 Package 解析狀態。
要保存的證據 你要回答的問題 不要先做的事
Flutter 與 Xcode 版本 故障是否在工具鏈切換後出現? 不要先重建整台打包機
SwiftPM/Pods 解析輸出 失敗發生在依賴解析還是編譯? 不要先刪除全部快取
Debug、Release、Archive 結果 是普通建置問題還是發布鏈路問題? 不要只保留最後一行錯誤
本地與遠端命令列記錄 是專案問題還是執行環境問題? 不要把遠端失敗直接歸因於 Flutter

先把 Flutter 3.47 補丁版本收斂

截至 2026 年 9 月 16 日,Flutter 官方 changelog 已把「啟用 SwiftPM 時的 iOS/macOS 建置失敗」列入 Flutter 3.47.2 修復項,也列出原生 iOS Add-to-App 專案在 Xcode 27 下建置 Flutter Swift packages 的相關修復,並繼續列出後續 3.47.3。請直接對照 Flutter 官方 changelog,不要把 3.47.0、3.47.1 與後續補丁視為同一環境。

Xcode 27 的發布狀態則以 Apple 的 Xcode 27 工具說明為準。修復時保持以下變數不變:

  1. 在獨立分支或可回退環境確認目前 Flutter stable 補丁。
  2. 升級到官方已包含相關修復的最新 3.47 補丁。
  3. 保留專案原始碼、插件鎖定檔與建置命令。
  4. 先重跑依賴解析,再執行普通 Debug Build。
  5. 最後執行 Release Build 和 Archive。
  6. 把升級前後的第一個有效錯誤並排保存。
版本狀態 建議動作 判斷結果
早於官方修復補丁 先升級到最新穩定 3.47 補丁 先排除已知回歸
已在修復補丁仍失敗 檢查 SwiftPM 集成、插件與 Target 轉入專案結構排查
使用後續 3.47 補丁 重新記錄最小專案與真實插件專案結果 不把舊錯誤直接套用
升級後只有遠端失敗 對比本地與遠端工具鏈、權限和會話 轉查環境差異

按專案類型檢查 SwiftPM 集成

Flutter 官方的 Swift Package Manager 集成文件是檢查入口。你要確認專案是否存在 FlutterGeneratedPluginSwiftPackage、建置前置腳本是否正常,以及正確的 Target 是否依賴對應 package product。

不要把三種專案混在一起處理:

  • 普通 Flutter App:先看生成的 Swift package、插件解析及 Runner Target。
  • 原生 iOS Add-to-App:除了宿主專案,還要核對 Flutter module 與原生 Target 的接入方式;可參考 Add-to-App 官方文件
  • 自訂 Target 或多環境專案:確認每個 Target 是否都加入正確依賴,不能只在 Debug Target 修好後就宣告完成。

Swift Package Manager 的解析成功,不等於 Xcode 編譯一定成功。依次區分:

  • 依賴解析失敗:看 package identity、版本、Git 存取與解析記錄。
  • Xcode Build 失敗:看 Target 依賴、模組匯入和插件原生程式碼。
  • Archive 失敗:看 Release 設定、簽名、匯出選項和打包腳本。
  • 上傳失敗:看產物、權限與 App Store Connect 流程。

提醒: 重置 Package Cache 會讓你失去部分現場證據。只有在已保存解析輸出、確認快取損壞,並且有明確回退方法時,才把它列入後續動作。

只在插件不相容時建立 CocoaPods 回退

Flutter 3.47 的 SwiftPM 路徑是否可用,還取決於插件和私有原生依賴。逐項核對:

  • 插件是否明確支援 SwiftPM。
  • 是否仍有插件只能透過 CocoaPods 整合。
  • Podfile 是否被手動修改過。
  • 私有原生套件是否要求特定最低系統版本。
  • Flutter 是否因插件不相容而回到 CocoaPods。
  • 目前建置是否仍然讀取 Podfile.lock 或 Pods 目錄。
依賴情況 建議路徑 回退條件
所有插件均支援 SwiftPM 保持 SwiftPM,修正 Target 與生成檔 不要為了習慣改回 Pods
單一插件尚未支援 SwiftPM 暫時保留 CocoaPods 插件完成相容後再重測
SwiftPM 與 Pods 同時存在 先畫出實際依賴鏈 不要盲目刪除其中一條
私有套件解析失敗 先核對來源、權限和版本 有可驗證替代來源才回退

回退時要先建立可撤銷變更。保存原始 Podfile、鎖定檔和建置命令,標記哪些插件使用 Pods,並在獨立分支完成一次 Debug、Release 與 Archive。這不是 SwiftPM 與 CocoaPods 的功能選型比較,而是為了讓發布鏈路先恢復,同時保留日後移除回退的路徑。

用 Archive 驗收,而不是只看 Debug Build

首次 Build 成功後,按以下順序復測:

  1. 以同一提交執行依賴解析。
  2. 以同一 Target 執行 Debug Build。
  3. 切換 Release 設定執行建置。
  4. 執行 Archive,保存 .xcarchive 結果。
  5. 執行匯出,核對簽名與匯出設定。
  6. 在必要時完成上傳前檢查。
  7. 以圖形會話與 SSH/CI 各跑一次。
  8. 若只有遠端失敗,再檢查工具鏈選擇、工作目錄權限、憑證會話和快取歸屬。

本地能打包、遠端 Mac 失敗時,先不要改程式碼。比較兩邊的 flutter doctor、Xcode 路徑、環境變數、執行使用者、Keychain 解鎖狀態和工作目錄。遠端無人值守工作還要檢查登入會話是否真的能讀取簽名資料;圖形介面成功不代表 SSH 服務程序擁有相同權限。

驗收階段 必須看到的結果 失敗時歸類
依賴解析 package、插件與鎖定版本一致 SwiftPM/Pods 或來源問題
Debug Build 開發建置完成 Target 或原生編譯問題
Release Build 發布設定可編譯 編譯旗標或配置問題
Archive 產生可檢查的封存產物 Release、簽名或腳本問題
匯出/上傳前 產物與簽名符合發布要求 匯出設定或憑證權限問題

把修復結果固化到遠端打包環境

如果你需要遠端 Mac 作為長駐 iOS 打包環境,第一週不要急著切換生產主機。先固定 Flutter 補丁、Xcode、依賴鎖定檔與建置入口,並保留一組最小回歸任務。

  • [ ] 為 Flutter、Xcode、插件與 SwiftPM/Pods 狀態建立版本記錄。
  • [ ] 讓最小 Flutter 專案完成依賴解析、Build 和 Archive。
  • [ ] 讓包含真實插件的脫敏專案重跑相同流程。
  • [ ] 測試 SSH 或 CI 執行時的目錄、Keychain 和憑證權限。
  • [ ] 斷線重連後重新執行一次發布建置。
  • [ ] 主機重啟後確認工具鏈路徑和快取歸屬沒有改變。
  • [ ] 為每次 Flutter 或 Xcode 更新保留可回退環境。
  • [ ] 只有在兩條環境都可驗收後,才決定是否移除舊工具鏈。

若你需要同時保留舊版與新版 Flutter/Xcode,或主要開發電腦是 Windows、Linux,無法獨立完成 Archive,可以先查看 MACCOME 的遠端 Mac 方案。先用真實發布任務驗證工具鏈,再決定是否長期保留;需要了解服務入口時,也可從 MACCOME 繁體中文首頁查看可用方案。

本地方案的問題通常是要自行維護常駐 Mac、承擔硬體閒置與升級衝突,還要處理斷線後無法取用的打包環境;雲端 CI 則可能讓你失去完整的圖形化 Xcode 診斷入口,並受限於預設工具鏈與快取策略。若你的需求是短期驗證 Flutter 3.47、並行保留兩套 Xcode,或讓 Windows/Linux 工作站完成遠端 Archive,租用 MACCOME 的 Mac 會比臨時購置一台專用打包機更容易先驗證,再決定長期架構。