iOS 建置突然出現套件解析錯誤,或原本能上傳 TestFlight 的 Archive 在升級後失敗。
最快解法是:不要一次刪除 CocoaPods;先以 Flutter 3.47 的 Swift Package Manager 為主,讓未相容插件回退至 CocoaPods,再於隔離 Mac 完成 Archive 與 TestFlight 驗收。

誰適合採用這套 Flutter 3.47 iOS 依賴遷移流程

這篇文章適合從舊版 Flutter 升級至 3.47、不能承受 iOS 發佈中斷的獨立開發者,以及依賴多個原生插件、尚未確認 Swift Package Manager 相容性的專案維護者。

如果你主要在 Windows 或 Linux 上編寫 Dart 程式碼,也可以把遷移工作拆成「跨平台盤點」與「Mac 上的 iOS 驗收」兩段,避免在唯一一台正式打包機上直接試錯。

提醒:截至 2026 年 9 月 17 日,Flutter 官方穩定文件以 3.47 系列為基線;Swift Package Manager 從 Flutter 3.44 起成為 iOS 與 macOS 原生依賴的預設管理方式,但不代表所有插件已經完成相容。請以Flutter 官方發布說明及遷移文件核對實際行為。

先建立可發佈基線,再開始遷移

Flutter 3.47 iOS 依賴遷移真正危險的地方,不是執行一次指令,而是你可能在沒有回復證據的情況下同時改動 Flutter、Xcode、插件與簽署設定。遷移前應先建立一份只讀紀錄,至少包含以下內容:

基線項目 應保留的內容 失敗時的用途
Flutter 工具鏈 Flutter SDK 版本、Dart 版本與 SDK 路徑 還原相同執行環境
依賴狀態 pubspec.lock、Podfile、Podfile.lock 與原生 Framework 清單 判斷是哪一層改變
Xcode 專案 工作區、Build Settings、Scheme 與自訂 Script 還原 Archive 入口
發佈證據 最近一次成功 Archive、IPA 匯出設定與上傳紀錄 確認舊鏈路仍可用
簽署資料 Team、憑證類型、Provisioning Profile 名稱 避免把簽署問題誤判為依賴問題

請在獨立 Git 分支或隔離 Mac 環境執行。正式打包機只保留可發佈分支,不要把「測試 SwiftPM」和「今天要上架的版本」放在同一個工作目錄。

截至上述日期,官方文件仍把未相容依賴的 CocoaPods 回退列為過渡路徑;因此,遷移目標應是「先證明新鏈路可發佈」,不是「先刪乾淨所有 Pod 設定」。你也應留意官方文件列出的 CocoaPods 註冊表只讀時間點為 2026 年 12 月 2 日,但這不等於現有專案會在當天自動失效,插件相容性仍須逐項檢查。Flutter Swift Package Manager 應用開發者文件提供了官方遷移邊界。

第一個工作時段完成插件相容盤點

不要只執行一次 Debug 建置就宣布遷移成功。Debug 可能沒有走完整的 Release 編譯、簽署、Archive 或上傳路徑;你要先從依賴樹與建置紀錄找出所有含有 iOS 原生程式碼的插件。

盤點時可按以下順序進行:

  • 檢查 pubspec.yaml 與鎖定檔,標示含有 iOS 原生目錄、Swift、Objective-C 或 Framework 的插件。
  • 搜尋 ios/Podfile、自訂 .podspec、本地 Pod、私有 Spec 及手寫安裝腳本。
  • 查看 Xcode 工作區中是否已有以 SwiftPM 加入的套件,以及插件註冊檔是否被重新產生。
  • 對每個插件記錄來源、目前管理方式、是否已有官方 SwiftPM 說明、最低 iOS 版本與替代方案。
  • 將來源不明的二進位 Framework 單獨列出,因為它可能完全不符合套件管理器的解析方式。

建議先產出一張插件表,而不是直接修改全部依賴:

依賴類型 目前證據 第一選擇 回退條件
已明確支援 SwiftPM 的插件 官方文件或插件自身提供套件設定 交由 SwiftPM 解析 包解析或編譯失敗
只有 CocoaPods 設定的插件 Podspec、Podfile 或安裝腳本 暫留 CocoaPods 官方未提供替代路徑
本地或私有二進位檔 只有 Framework 或自訂 Script 在隔離環境單獨驗證 模組、架構或簽署不符
來源不明的插件 無法確認維護方式 暫停遷移並追查 找不到可重現來源

插件的 iOS 原生整合規則,應以Flutter 插件開發文件中的實際說明為準。社群文章可以協助定位問題,但不能替代你對目前版本與插件來源的核實。

在隔離 Mac 上完成首次 SwiftPM 建置

如果你使用 Windows 或 Linux 開發,可以先在本機完成依賴清單與分支整理,再把已脫敏的專案送到 Mac。專案名稱、Bundle ID、Team ID、憑證名稱與紀錄檔中的 Token 都不應直接貼到共享工作區或支援工單。

以下範例使用佔位符,請在具備專案權限的執行帳號下操作:

# 執行帳號:具備專案讀寫權限的 macOS 使用者
# 專案目錄:/Users/BUILD_USER/Projects/APP_DIR
# Flutter SDK:/Users/BUILD_USER/flutter/bin/flutter

cd /Users/BUILD_USER/Projects/APP_DIR
/Users/BUILD_USER/flutter/bin/flutter --version
xcode-select -p
git status --short
/Users/BUILD_USER/flutter/bin/flutter pub get
/Users/BUILD_USER/flutter/bin/flutter build ios --config-only --no-codesign

預期先看到 Flutter 版本、Xcode Command Line Tools 路徑、乾淨或可解釋的 Git 狀態,接著完成 Dart 依賴取得與未簽署 iOS 設定產生。不要在這個階段直接上傳商店。

若要撤銷,先保存 git diff 與建置紀錄,再執行:

git restore -- ios Podfile Podfile.lock
git switch production-safe

這裡的 production-safe 只是你的舊版可發佈分支名稱,請改成實際分支。不要使用沒有確認內容的 git clean -fd,它可能刪除尚未提交的本地插件或測試資料。

首次建置要觀察三類證據:SwiftPM 是否完成套件解析、插件註冊是否仍存在,以及編譯階段是否出現模組找不到或最低系統版本衝突。只有無簽署建置成功,才可以進入 Release 與 Archive 驗證。

雙軌依賴的衝突處理與評分

SwiftPM 與 CocoaPods 可以在過渡期共同存在,但共同存在不等於同一個原生依賴可以安裝兩次。最常見的判斷方式,是把錯誤訊息和負責管理的依賴對應起來:

可見現象 優先判斷 處理方向 編輯評分
Duplicate symbols 或重複 Framework 同一依賴被兩條鏈路引入 只保留一個來源,再清理工作區重建 ★★★★★
Module not found 插件註冊或搜尋路徑不完整 回到該插件的管理方式,暫時保留 CocoaPods ★★★★☆
最低系統版本衝突 套件要求與專案設定不一致 逐項對齊部署目標,不要一次提高全專案 ★★★★☆
遠端套件下載失敗 連線、快取或套件來源不穩定 先驗證乾淨解析,再恢復可重現來源 ★★★☆☆
只有某個插件在 Release 失敗 Debug 沒涵蓋其編譯路徑 保留舊鏈路並對該插件做獨立替代評估 ★★★★★

這個評分是遷移風險的編輯判斷,不是建置速度或相容率的實測。不要為了「全 SwiftPM」而直接修改第三方插件原始碼;那會讓日後升級、回復及責任追查更加困難。若插件沒有官方支援,就先留在 CocoaPods,並在插件更新或下一次 Flutter 版本複核時再評估。

把遠端 Mac 與 CI 固定成可重現環境

遠端 Mac 的價值不只是讓你可以開啟 Xcode,而是把依賴遷移從唯一生產機隔離出來。你應固定以下項目:

  • Flutter SDK 的實際路徑,不要依賴互動終端的模糊 PATH。
  • Xcode 版本與 xcode-select 指向,互動工作階段與無人值守任務要一致。
  • pubspec.lock、Podfile.lock 與 SwiftPM 解析結果。
  • 建置執行帳號、專案工作目錄及輸出資料夾。
  • 憑證、私鑰、Provisioning Profile 與 App Store Connect 憑證的存取權限。

SwiftPM 快取只能用來縮短重複解析時間,不能當成成功條件。至少要做一次乾淨環境解析,確認沒有快取時仍能取得所需套件。依賴快取也不應和簽署私鑰放在同一個可下載目錄,遠端連線中斷後,應記錄工作階段狀態、最後一個成功指令與可安全重跑的步驟。

如果你需要在遠端 Mac 上執行這種隔離建置,應先查看 SSHMac 的幫助中心,確認連線、帳號權限與工作階段恢復方式;這些操作條件和 Flutter 本身的插件相容性是兩個不同問題,不要混在同一份故障紀錄中。

用 Archive 與 TestFlight 決定是否正式切換

無簽署建置成功後,仍要按發佈順序驗證:

  • 使用 Release 設定編譯,確認原生插件在實際模式下能完成連結。
  • 在 Xcode 中建立 Archive,檢查簽署團隊、Bundle ID、版本號與建置號。
  • 匯出 IPA,確認輸出方式與目前的發佈憑證一致。
  • 上傳至 App Store Connect,觀察處理狀態,而不是只看本地指令是否結束。
  • 透過 TestFlight 安裝,重新測試登入、推播、付款、相機或其他由原生插件負責的功能。
  • 保留舊依賴鏈路的可發佈節點,直到新鏈路通過真實裝置安裝與關鍵流程驗證。

Flutter 的 iOS 發佈文件涵蓋建置與簽署流程,可參考官方 iOS 建置發布指南。上傳後的處理狀態則要按照 Apple 的建置狀態說明判讀;「已上傳」不代表已可供 TestFlight 測試。

驗收階段 通過證據 不通過時的回退
Release 編譯 無模組、連結或插件註冊錯誤 回到插件相容表逐項隔離
Archive 產生可簽署的 Archive,設定與舊鏈路可比較 切回舊分支,不改生產機
IPA 匯出 匯出方式、Team 與憑證符合發佈要求 還原簽署設定並重新檢查權限
App Store Connect Apple 接受上傳並進入處理流程 依處理狀態分類,不先重做依賴
TestFlight 真實測試裝置能安裝且原生功能正常 保留 CocoaPods 鏈路,暫緩切換

Apple 的上傳建置規則及App Store Connect 工作流程應與團隊的發佈紀錄一併保存。若新鏈路只通過本地 Archive、未通過 TestFlight,就不能視為完成遷移。

用條件分支決定最後方案

  • 若所有原生插件都有可核實的 SwiftPM 路徑,乾淨解析、Release、Archive 與 TestFlight 都成功,則可以安排完全切換。
  • 若只有部分插件相容,且 SwiftPM 與 CocoaPods 沒有重複引入同一依賴,則保留雙軌,並記錄每個插件的複核條件。
  • 若某個插件仍只能使用 CocoaPods,但舊鏈路可以穩定發佈,則不要為追求純 SwiftPM 而冒險,先保留 CocoaPods。
  • 若Archive 或 TestFlight 失敗,則回到最後一個可發佈節點,還原鎖定檔與工作區,再針對單一插件重做驗證。
  • 若你只有一台生產 Mac,或主要在 Windows、Linux 上工作,則先準備隔離的遠端 Mac,等新舊鏈路都完成 TestFlight 驗收後再決定是否長期保留。

這套分支比「遷移成功或失敗」更適合獨立開發者,因為雙軌本身可以是合格的中間狀態,而不是必須立刻消除的技術債。

FAQ:遷移時最容易忽略的判斷

Flutter 3.47 升級後,為什麼 iOS 專案檔案會自己變更?

從 Flutter 3.44 起,Swift Package Manager 已成為 iOS 與 macOS 原生依賴的預設管理方式。升級或重新取得依賴時,Flutter 可能更新 Xcode 工作區、套件解析資訊與插件註冊內容;先在分支中比對變更,並保留舊版依賴鎖定檔與最近一次成功 Archive,才能判斷哪些修改可接受。

Flutter 插件還不支援 Swift Package Manager,應該怎麼處理?

不要為了追求純 SwiftPM 而直接修改第三方插件原始碼。先確認插件是否含有 iOS 原生程式碼、手寫 Podfile 設定或本地 Framework;若官方尚未提供 SwiftPM 支援,就讓該插件暫時回退至 CocoaPods,或在獨立分支評估替代插件,並用 Archive 與 TestFlight 驗證後再決定。

Flutter 專案可以同時使用 SwiftPM 和 CocoaPods 嗎?

可以,但前提是兩套管理方式負責不同的原生依賴,不能讓同一個 Framework 或模組被重複引入。雙軌期間要檢查重複符號、模組找不到、最低系統版本衝突與套件解析失敗;只要出現責任歸屬不清,就應先回到可發佈的 CocoaPods 鏈路。

SwiftPM 遷移後 iOS Archive 失敗,要怎樣安全回復?

先停止修改生產建置機,切換至遷移前分支,還原依賴鎖定檔、工作區與原有 CocoaPods 設定,再使用相同的簽署方式重新 Archive。若舊鏈路能產生可上傳的 IPA,先保留該發佈節點;新鏈路必須完成真實 TestFlight 安裝及原生功能驗證,才可重新安排切換。

使用 Windows 開發 Flutter,要如何驗證 iOS 依賴遷移?

Windows 可負責 Dart 程式碼與依賴盤點,但 iOS 的 SwiftPM 解析、Xcode 建置、簽署、Archive 和 App Store Connect 上傳仍要在 macOS 完成。你可以把專案分支與鎖定檔送到隔離的遠端 Mac,以 SSH 或網頁控制台執行無簽署建置,再由具備憑證的環境完成發佈驗收。

如果你目前只有一台生產 Mac,直接在上面測試 Flutter 3.47 會把依賴風險、簽署風險與發佈中斷綁在一起;若主要使用 Windows 或 Linux,還會多出遠端連線與工具鏈不一致的問題。自購 Mac 適合長期固定重負載、需要實體介面或必須完全自行管理硬體的人,但為一次遷移而添置設備,成本與維護責任未必合理。對需要短期建立隔離環境的情況,租用 SSHMac 的遠端 Mac,先完成雙軌建置、Archive 與 TestFlight 驗收,再決定是否長期保留,通常更容易控制變更範圍;你可先從SSHMac 的服務入口了解可用方式。