Chuyển đến nội dung chính

Swift Package Manager giờ là mặc định — và CocoaPods đã có hạn chót

Phần lớn lập trình viên Flutter đã migrate sang Swift Package Manager mà không hay biết. Nó bật mặc định từ Flutter 3.44, và tooling tự thêm phần tích hợp vào project Xcode ngay lần build đầu sau khi nâng cấp. Lý do phải để ý lúc này là một cái mốc: registry CocoaPods chuyển sang chỉ đọc ngày 02/12/2026. Sau mốc đó, việc tắt SwiftPM không còn là lối thoát được hỗ trợ.

Flutter 3.47 công bố 92 trong 100 plugin iOS phổ biến nhất đã chuyển sang Swift Package Manager. Cái đuôi dài mới là thứ cắn bạn, không phải phần đầu phân phối.

Thực sự thay đổi gì trong project của bạn

Khi SwiftPM bật và bạn build, Flutter sửa project Xcode theo ba cách:

  1. Thêm FlutterGeneratedPluginSwiftPackage làm package dependency của target Runner.
  2. Thêm pre-action Run Prepare Flutter Framework Script vào build scheme.
  3. Resolve và tải các Swift package mà plugin Flutter của bạn phụ thuộc.

Package sinh tự động đó nằm ở ios/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage. Chữ ephemeral ở đây có ý nghĩa thật — nó được sinh lại, không phải để sửa tay, và không thuộc về version control.

Quan trọng: CocoaPods không biến mất. Flutter tự động fallback về CocoaPods cho bất kỳ dependency nào chưa hỗ trợ SwiftPM, nên một project pha trộn là trạng thái bình thường trong giai đoạn chuyển tiếp, không phải cấu hình sai.

Bật, tắt, và theo từng project

Nếu một phiên bản project trước đó đã tắt, bật lại toàn cục:

flutter config --enable-swift-package-manager

Tắt toàn cục:

flutter config --no-enable-swift-package-manager

Tắt cho riêng một project, trong pubspec.yaml:

flutter:
  config:
    enable-swift-package-manager: false

Công tắc theo project mới là thứ hữu ích. Nếu chỉ đúng một app trong tổ chức phụ thuộc vào một plugin nội bộ chưa migrate, hãy ghim app đó và để mọi thứ còn lại theo mặc định.

Gỡ bỏ hoàn toàn phần tích hợp

Nếu bạn cần rollback sạch — để bisect, hoặc vì build hỏng và bạn muốn một mốc chuẩn:

  1. Tắt SwiftPM bằng một trong hai công tắc trên.
  2. Chạy flutter clean.
  3. Mở Xcode workspace.
  4. Gỡ FlutterGeneratedPluginSwiftPackage khỏi Package Dependencies.
  5. Gỡ nó khỏi Frameworks, Libraries, and Embedded Content.
  6. Xoá pre-action Run Prepare Flutter Framework Script.

Bước 3 đến 6 là những bước hay bị quên, và một phần tích hợp gỡ dở dang sẽ sinh ra lỗi link rất khó hiểu.

Khi migrate tự động thất bại

Tooling đôi khi không vá được project Xcode — scheme tuỳ biến nặng và file project.pbxproj sửa tay là thủ phạm thường gặp. Đường thủ công:

Thêm package dependency. Mở ios/Runner.xcworkspace, vào Package Dependencies, bấm thêm, chọn Add Local…, và chọn ios/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage. Xác nhận nó gắn vào target Runner và xuất hiện dưới Frameworks, Libraries, and Embedded Content.

Thêm pre-action. Vào Product → Scheme → Edit Scheme, mở Build, bấm Pre-actions, thêm một run script action tên Run Prepare Flutter Framework Script, đặt Provide build settings from thành Runner, và dùng:

"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" prepare

Sau đó chạy app và xác nhận pre-action có thực thi. Nếu migrate tự động thất bại, hãy báo lỗi kèm project.pbxproj.xcscheme — đó là dữ liệu đội Flutter cần mà hiếm khi nhận được.

Cái bẫy deployment target

Đây là lỗi thực tế hay gặp nhất, và không hiển nhiên từ thông báo lỗi. Một plugin SwiftPM có thể khai báo phiên bản OS tối thiểu cao hơn app của bạn. Khi đó build sẽ hỏng cho tới khi bạn nâng Minimum Deployments trong Xcode và sinh lại config:

flutter build ios --config-only
flutter build macos --config-only

Flutter 3.47 đã nâng sàn — iOS 13 → 15macOS 10.15 → 12 — nên nếu bạn nâng cấp từ SDK cũ, có thể bạn vượt rào này một cách tình cờ.

Khía cạnhCocoaPodsSwift Package Manager
Manifest dependencyPodfile / Podfile.lockPackage.swift sinh tự động
ToolchainRuby gem, cài riêngTích hợp sẵn trong Xcode
Điểm tích hợp.xcworkspace từ pod installPackage dependency + pre-action của scheme
Trạng thái registryChỉ đọc từ 02/12/2026Đang phát triển tích cực
Mặc định của FlutterChỉ dùng làm fallbackMặc định từ 3.44

Checklist migrate của bạn

  1. Xác nhận bạn đang ở mặc định. Chạy flutter config và kiểm tra enable-swift-package-manager không bị tắt ở đâu, kể cả trong pubspec.yaml.
  2. Build sạch target iOS và macOS và quan sát pre-action có chạy không.
  3. Rà soát danh sách plugin. Với mỗi plugin iOS, kiểm tra repository của nó có kèm Package.swift không. Những cái không có chính là rủi ro tháng 12 của bạn.
  4. Migrate plugin của chính bạn trước — plugin nội bộ là thứ không ai sửa hộ. Theo hướng dẫn cho plugin author và ship Package.swift song song với podspec hiện có.
  5. Mở hoặc upvote issue cho các plugin bên thứ ba chưa migrate mà bạn phụ thuộc, ngay bây giờ thay vì tháng 11.
  6. Nâng deployment target lên iOS 15 / macOS 12 và sinh lại bằng --config-only.
  7. Đừng đưa ios/Flutter/ephemeral/ vào version control.

Kết luận

SwiftPM không phải tính năng bạn cần chủ động áp dụng — gần như chắc chắn bạn đã dùng rồi. Việc bạn cần làm là kiểm kê những plugin chưa chuyển, vì ngày 02/12/2026 sẽ biến câu “để sau tính” thành một lần build hỏng. Phần đầu hệ sinh thái đã xong: 92 trong 100 plugin phổ biến nhất đã chuyển. Bỏ một giờ cho cái đuôi — các plugin nội bộ và ba package ít tên tuổi không ai ngó từ 2024 — và cuộc chuyển đổi này chẳng tốn của bạn gì cả.


Bài viết gốc đăng tại FlutterCook. Bản trên đó là bản được cập nhật mới nhất.

Nhận xét

Bài đăng phổ biến từ blog này

Thiết kế giao diện với DotNetBar (Phần 1)

Đây là phiên bản DotNetBar hỗ trợ C# và Visual Basic https://www.dropbox.com/s/wx80jpvgnlrmtux/DotNetBar.rar  , phiên bản này hỗ trợ giao diện Metro cực kỳ “dễ thương” Các bạn load về và cài đặt, khi cài đặt xong sẽ có source code mẫu của tất cả các control. Để sử dụng được các control của DotNetBar các bạn nhớ add item vào controls box. Thiết kế giao diện với DotNetBar, giao diện sẽ rất đẹp. Link các video hướng dẫn chi tiết cách sử dụng và coding: http://www.devcomponents.com/dotnetbar/movies.aspx Hiện tại DotNetBar có rất nhiều công cụ cực mạnh, trong đó có 3 công cụ dưới đây: DotNetBar for Windows Forms Requires with Visual Studio 2003, 2005, 2008, 2010 or 2012.   DotNetBar for WPF Requires with Visual Studio 2010 or 2012 and Windows Presentation Foundation.   DotNetBar for Silverlight Requires with Visual Studio 2010 or 2012 and Silverlight. Dưới đây là một số hình ảnh về các control trong DotnetBar.   Metro User Interface  controls with Metro Tiles, toolba...

5 concepts every Flutter dev should know

  Phụ lục: State management architecture Testing IDE Shortcuts Platform channel Maintaining a project Tôi đã làm việc với Flagship trong một thời gian dài, và đây là những điều mà tôi phát hiện ra là điều cần phải có đối với bất kỳ nhà phát triển Flagship nào, về tổng thể nó sẽ khiến bạn trở thành một nhà phát triển Flagship giỏi trong thời gian dài. 1. State management architecture Đây là một trong những chủ đề quan trọng nhất trong cộng đồng thiết bị rung, nó khá quan trọng nếu bạn muốn duy trì một dự án rung kích thước trung bình hoặc lớn. Nó sẽ giúp tạo một dự án suôn sẻ và thêm các tính năng mới một cách hoàn hảo.  2. Testing Đây là một chủ đề duy nhất mà tôi không hiểu tại sao nó lại quan trọng trước đó trong sự nghiệp của tôi, nhưng khi tôi tiến lên trong sự nghiệp của mình và có kinh nghiệm với nhiều dự án và vấn đề xảy ra trong môi trường sản xuất. Tôi đã nhận ra một cách khó khăn, tại sao điều này lại quan trọng như vậy. Nếu bạn vẫn muốn có thêm lý do để cân nhắc thử...

Announcing Flutter 2

  Phụ lục: Flutter on the web Flutter 2 on desktops, foldables, and embedded devices The growing Flutter ecosystem Dart: The secret sauce behind Flutter Flutter 2: Available now Hôm nay, chúng tôi sẽ công bố Flutter 2: một bản nâng cấp lớn cho Flutter cho phép các nhà phát triển tạo các ứng dụng đẹp, nhanh chóng và di động cho bất kỳ nền tảng nào. Với Flutter 2, bạn có thể sử dụng cùng một cơ sở mã để gửi các ứng dụng gốc cho năm hệ điều hành: IOS, Android, Windows, macOS và Linux; cũng như trải nghiệm web nhắm mục tiêu các trình duyệt như Chrome, Firefox, Safari hoặc Edge. Flutter thậm chí có thể được nhúng vào ô tô, TV và thiết bị gia dụng thông minh, mang đến trải nghiệm di động và lan tỏa nhất cho thế giới điện toán xung quanh. Mục tiêu của chúng tôi là thay đổi cơ bản cách các nhà phát triển nghĩ về việc xây dựng ứng dụng, bắt đầu không phải với nền tảng bạn đang nhắm mục tiêu mà là với trải nghiệm bạn muốn tạo. Flutter cho phép bạn tạo ra những trải nghiệm tuyệt đẹp trong đó ...