Flutter 3.44 からデフォルトの依存管理が CocoaPods から Swift Package Manager(SwiftPM)に。移行作業をしてみた
概要
Flutter 公式から、次の stable リリース Flutter 3.44 で iOS / macOS の デフォルトの依存管理ツールが CocoaPods(Ruby 製)から Xcode 同梱の Swift Package Manager(以下 SwiftPM)に切り替わることが発表されました。狙いは「Ruby のセットアップから開発者を解放する」こと。ただし CocoaPods サポートは継続するため、SwiftPM 未対応プラグインはそのまま CocoaPods にフォールバックされます。
📣 Starting with the next stable Flutter release, 3.44, Swift Package Manager replaces CocoaPods as the default dependency manager for iOS and macOS apps
本記事では、現在の stable(Flutter 3.41)で SwiftPM を opt-in で有効化し、既存プロジェクトを移行する作業を試して挙動を整理します。対象は iOS ですが、macOS も同手順で対応可能です(詳細は公式 docs を参照)。プラグイン作者向けの対応手順は扱いません。
伝えたいこと(TL;DR)
公式アナウンスを見て「自分のプロジェクトはどうなる?何すればいい?気をつけることはある?」と気になった方向けに、検証して得た結論を先にまとめます。
| 疑問 | 結論 |
|---|---|
| 影響は? | デフォルトの依存管理ツールが変わるだけ。CocoaPods サポートは継続するので、いきなり既存プロジェクトが動かなくなることはない |
| いつから? | 3.44 からデフォルト on。それ以前は 3.24 〜 3.41 で opt-in。3.22 以前はサポートなし |
| 何すればいい? | 有効化(flutter config --enable-swift-package-manager または pubspec.yaml で enable-swift-package-manager: true)して flutter run で 自動移行できる |
| 気をつけることは? | Flavor 構成 / Add-to-app 構成 / プラグインの最低 iOS バージョン は要注意。それ以外は概ね自動移行で済む |
| 戻せる? | いつでも CocoaPods に戻せる。無効化(flutter config --no-enable-swift-package-manager または pubspec.yaml で enable-swift-package-manager: false)すれば実害なくフォールバック |
移行手順
検証環境
- Flutter SDK: stable(3.41)
- プロジェクト: 自作の playground プロジェクト
- iOS Flavor:
dev/prodの 2 構成(後述するハマりどころのため重要) - 利用プラグイン:
bluetooth_low_energynfc_managerpermission_handlernsd
移行手順
Step 1. SwiftPM サポートを有効化
グローバルで有効化する場合は次のコマンドを実行します。Flutter ツールの グローバル設定(~/.config/flutter/settings)を変更するだけで、プロジェクトファイルには触りません。
flutter config --enable-swift-package-manager
プロジェクト単位で有効化したい場合は、pubspec.yaml に書きます(グローバル設定を上書き)。
flutter:
config:
enable-swift-package-manager: true
公式 docs には プロジェクト単位の無効化(false) のみ明示されていますが、検証で true も機能することを確認しました。
Step 2. iOS ビルドを実行(自動移行が走る)
flutter run --flavor dev
Step 3. 自動修正されたファイルを確認
git status で 3 ファイル(project.pbxproj / xcscheme / Podfile.lock)の変更が確認できます。実際の差分は次のコミットにまとめてあります。
📦 検証コミット: abe-tk/playground@2fb3e0b
自動修正された内容
| ファイル | 何が起きたか |
|---|---|
project.pbxproj(Xcode プロジェクト定義) |
SwiftPM パッケージ(FlutterGeneratedPluginSwiftPackage)を Runner ターゲットの依存に追加 |
xcscheme(ビルド設定) |
ビルド前にフレームワーク準備処理を走らせる Pre-action を追加 |
Podfile.lock |
SwiftPM 対応プラグインを Pods から削除(未対応プラグインは Pods に残る) |
移行後のプラグイン管理は二重構成になる
| プラグイン | SwiftPM 対応 | 移行先 |
|---|---|---|
bluetooth_low_energy_darwin |
✅ | SwiftPM(Pods から削除) |
nsd_ios |
✅ | SwiftPM(Pods から削除) |
nfc_manager |
❌ | CocoaPods に残留(フォールバック) |
permission_handler_apple |
❌ | CocoaPods に残留(フォールバック) |
SwiftPM 移行後も CocoaPods は完全には消えません。プラグインの SwiftPM 対応状況によって自動で振り分けられます。
CocoaPods へ戻したい場合
設定をオフにして再ビルドするだけで戻せます。project.pbxproj / xcscheme の SwiftPM 統合定義は残りますが、CocoaPods へフォールバックされるだけで実害はありません。
グローバルで無効化:
flutter config --no-enable-swift-package-manager
プロジェクト単位で無効化(公式 docs):
flutter:
config:
enable-swift-package-manager: false
移行時の注意点
Flavor ごとに xcscheme が別々に修正される
flutter run は、その実行で使った Flavor の xcscheme しか修正しません。
| 操作 | 修正された xcscheme |
|---|---|
flutter run --flavor dev を実行 |
dev.xcscheme のみ |
続けて flutter run --flavor prod を実行 |
prod.xcscheme も追加で修正 |
両方実行後の Runner.xcscheme |
未修正のまま |
つまり、ローカルで一度も実行していない Flavor は、CI でビルドすると Pre-action が無くてビルドが失敗する可能性があります。対策はローカルで全 Flavor を一度ずつ flutter run するか、各 xcscheme に手動で Pre-action を追加することです。
Add-to-app 構成は非対応
既存のネイティブ iOS アプリに Flutter モジュールを組み込む Add-to-app 構成では、SwiftPM サポートはまだ動作しません(Flutter Issue #146957)。該当する場合は、3.44 以降も CocoaPods を使い続けることになります。
プラグインの最低 iOS バージョンとの不一致
SwiftPM 対応プラグインがプロジェクトより高い iOS Deployment Target を要求している場合、次のようなエラーが出ます。Xcode の Minimum Deployments を上げて対応します。
Target Integrity (Xcode): The package product 'plugin_name_ios' requires
minimum platform version 14.0 for the iOS platform, but this target supports 12.0
自動移行が失敗した場合
今回の検証では自動移行が問題なく完了しましたが、失敗した場合は Xcode で手動統合します。手順は 公式 docs を参照してください。次の 2 つの変更を Xcode GUI で再現するイメージです。
Package DependenciesにFlutterGeneratedPluginSwiftPackageをローカル追加- 各 xcscheme の
Pre-actionsにRun Prepare Flutter Framework Scriptを追加
まとめ
検証してみると flutter config --enable-swift-package-manager + flutter run だけで自動移行が走り、想像以上にあっさり SwiftPM へ移行できました。Flavor 構成や Add-to-app には多少気をつけることがあるものの、3.44 リリース後に大きな混乱は起きなさそうです。
Ruby のセットアップから解放されるのは素直に嬉しい変化ですね。Flutter チームの皆さん、ありがとう!








