Flutter 3.44 發布前夕,官方宣布 SwiftPM 將完全取代 CocoaPods

馬上就是 Google I/O 了,而在這個時候,官方突然官宣,**從下一個 Flutter 穩定版 3.44 開始,Swift Package Manager(SwiftPM)將取代 CocoaPods**,成為 iOS 和 macOS 應用程式的預設依賴管理工具。

也就是 CocoaPods trunk 明確會在 2026-12-02 進入唯讀,所以今年年底 SwiftPM 就會開始完全取代 CocoaPods 這個老古董。

其實這也不算突然,因為在 2024 我們就聊過這個話題,在去年也談論過 SwiftPM 的相關情況,而現在 Flutter 也開始正式提醒開發者,雖然現有版本還可以繼續使用 CocoaPods,但是 2026-12-02 之後將不會再對 Pod 進行適配與支援

實際對 App 開發來說,Flutter CLI 會自動處理遷移,當你開始執行或建置 iOS 或 macOS 應用程式時,CLI 會自動更新 Xcode 專案,改用全新的 Swift Package Manager。

如果 App 依賴的外掛還沒適配 SwiftPM,Flutter 會印出一條警告訊息,列出所有不受支援的依賴項,同時暫時回退到 CocoaPods

不過官方也說了,未來 CocoaPods 的支援會被完全移除,所以這種回退並不長久。

當然,如果真的遇到 SwiftPM 導致無法建置等問題,官方也提供了暫時關閉的方式:

yaml 体验AI代码助手 代码解读复制代码flutter:
  config:
    enable-swift-package-manager: false

而對於外掛的開發者,如果你還沒有適配,那麼適配 SwiftPM 是必選項,目前排名前 100 的 iOS 外掛裡已經有 61% 完成了遷移,後續如果沒有新增 Swift Package Manager 支援的 Package,在 pub.dev 評分中分數也會被拉低。

另外,Flutter 外掛在切到 SwiftPM 之後,必須明確宣告「我依賴 Flutter 引擎」,否則編譯流程就不完整,所以需要新增一個 Package.swift 檔案,並將原始碼移動到符合標準 Swift 套件結構的位置。

因為在 CocoaPods 時代,Flutter 外掛的 .podspec 裡其實已經隱式做了:

  • 自動把 Flutter.framework 加進來
  • 自動處理 header / linker / search path
  • 不用關心 Flutter 引擎怎麼進來的

換成 SwiftPM 後:

  • SwiftPM 是完全宣告式依賴系統
  • 不會有 CocoaPods 那種「魔法注入」
  • 所有依賴都必須在 Package.swift 明確寫出來

也就是你的外掛程式碼其實是執行在 Flutter 引擎之上的,所以你需要在 Package.swift 裡加上這個依賴,例如類似:

less 体验AI代码助手 代码解读复制代码let package = Package(
    name: "MyPlugin",
    platforms: [.iOS(.v13)],
    products: [
        .library(name: "MyPlugin", targets: ["MyPlugin"])
    ],
    dependencies: [
        // 關鍵就是這個
        .package(name: "FlutterFramework", path: "../Flutter")
    ],
    targets: [
        .target(
            name: "MyPlugin",
            dependencies: [
                "FlutterFramework"
            ]
        )
    ]
)

另外如果在 2025 年做過外掛遷移了,現在還也需要補充一個操作:在 Package.swift 檔案中加入 FlutterFramework 作為依賴項,因為現在必須明確宣告依賴。

可以看出來,對 Flutter 來說這次變動影響最大的是外掛生態,以前 Flutter 外掛的 iOS/macOS native 部分基本靠 .podspec + Podfile + pod install 接入,而遷到 SwiftPM 後,外掛作者需要提供 Package.swift,Flutter CLI 需要負責把外掛依賴轉成 Xcode 可識別的 Swift Package 整合。

實際上今年 KMP 也提到了這件事,不過進度相對 Flutter 慢一些,不過都是在今年開始推 SwiftPM,可以看出來 CocoaPods 真的是末路了,這個陪伴了大家這麼多年的依賴管理框架,終究要消失在歷史的進程裡。

最後,使用 SwiftPM 是完整支援 Objective-C 的,只是一些支援的力度和方式不太一樣,比如 SwiftPM 不允許同一個 target 裡同時混放 Swift 和 C-family 原始碼,target 可以包含 Swift、Objective-C/C++ 或 C/C++,但單一 target 不能混合 Swift 和 C-family 語言。

所以舊的純 OC 外掛/函式庫遷到 SwiftPM 是可行的,關鍵是目錄結構要符合 SwiftPM 規則。

真正麻煩的是 Swift + OC 混編專案,遷移到 SwiftPM 後,通常需要拆成多個 target,讓 Swift target 依賴 OC/C-family target。

那麼,你開始使用 SwiftPM 了嗎?


原文出處:https://juejin.cn/post/7635969457790648383


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝14   💬8  
296
🥈
我愛JS
💬1  
4
🥉
Gigi
2
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登