Xcodeで依存関係は解決できても、Archiveだけ失敗する。既存プロジェクトの移行範囲も読めない。
新規で主要依存がSwift Package Manager対応ならSwift Package Managerを優先し、Pod専用SDKや複雑なスクリプトを使う既存案件はCocoaPodsを維持します。混在案件は、まず併用して段階的に置き換えるのが最短です。

この判断が必要な人は、これからネイティブのSwift製iOS・macOSアプリを作る個人開発者です。CocoaPods、非公開コンポーネント、バイナリSDKを含む既存アプリの移行可否を見極めたい小規模チームにも向いています。リモートMacやCIで、依存関係の復元からArchiveまで安定させたい場合も対象です。

01

先に決める採用シナリオ

「公式統合が深いから」という理由だけで、すべてをSwift Package Managerへ移す必要はありません。依存ライブラリの対応状況、既存スクリプト、署名とArchiveの検証範囲を先に確認します。

  • 新規プロジェクト
    主要なSDKがSwift Package Managerに対応し、リソースやバイナリTargetも問題なく扱えるなら、Swift Package Managerを第一候補にします。Xcodeから依存関係を管理しやすく、Package.resolvedをリポジトリに含めて解決結果を固定できます。AppleのSwift Packages公式資料でも、Xcodeプロジェクトへの統合方法が案内されています。

  • 成熟したCocoaPodsプロジェクト
    PodfilePodfile.lock、Workspace、Ruby環境、独自のインストールスクリプトが安定しているなら、急いで移行しません。Pod専用の依存が残っている、複数Targetに影響する、直近に緊急リリースがある場合は、CocoaPods継続の方が安全です。

  • 一部だけ移行できる混在案件
    周辺コンポーネントから移し、核心部分は後回しにします。同じライブラリを両方から取り込まないことが条件です。重複した推移依存が生じると、ビルド設定やリンク対象の確認が難しくなります。

CocoaPodsとSwift Package Managerの比較では、導入の簡単さだけでなく「新しいMacで同じ状態を再現できるか」を見てください。依存解決の成功、ソースやバイナリの取得、コンパイル、テスト、Archiveは別々の合格条件です。

02

新規アプリでSwift Package Managerを選ぶ条件

Swift Package Managerは、Swift Packageのマニフェストで依存関係やTargetを定義します。Swift公式のPackageDescriptionリファレンスでは、パッケージの構成、Target、リソース、依存関係の宣言方法を確認できます。

新規アプリで評価しやすい利点は次の通りです。

  • Xcodeのプロジェクト設定からパッケージを追加・更新できる。
  • Package.resolvedで解決済みバージョンを共有しやすい。
  • パッケージのソースリポジトリと構成を近い形で管理できる。
  • RubyやCocoaPods固有の導入層を増やさずに済む場合がある。

ただし、Swift対応とSwift Package Manager対応は同じ意味ではありません。導入前に、対象SDKの正式ドキュメントで次を確認します。

  • iOSとmacOSのDeployment Targetが合っているか。
  • リソースファイルを含むTargetに対応しているか。
  • XCFrameworkなどのバイナリ配布を扱えるか。
  • 必要なBuild PhaseやRun Scriptを別途要求しないか。
  • Xcodeで通常ビルドだけでなくArchiveまで完了するか。

2026年に新しくiOSアプリを作る場合、CocoaPodsを最初から外してよいですか。
主要な依存が正式にSwift Package Managerへ対応しているなら、最初の候補から外して構いません。ただし、決済、分析、広告、社内SDKなどの重要コンポーネントがPodのみなら、無理に統一せず、採用予定の全依存を先に一覧化してください。

03

既存CocoaPods案件の移行判断

既存案件では、依存管理ツールそのものより、周辺の発行手順がリスクになります。Podfile.lockが固定するのは依存バージョンですが、Rubyのバージョン、Podspec、独自スクリプト、証明書処理まで自動的に同一になるわけではありません。

CocoaPodsの公式ガイドでは、pod installは既存のロック状態を尊重し、pod updateは依存の更新を目的とするコマンドとして区別されています。installとupdateの公式説明を、CIの手順書と照合してください。CIで毎回更新系の処理を走らせているなら、移行前にその挙動を分離する必要があります。

次の条件が複数あるなら、当面はCocoaPodsを維持する判断が合理的です。

  • 重要なSDKに同等のSwift Packageがない。
  • 複数TargetでPodのBuild Settingsを共有している。
  • post_installなどの独自処理がビルドに不可欠である。
  • 署名、テスト、Archiveの発行手順がすでに安定している。
  • リリース期限が近く、移行後の差分を検証する時間がない。

CocoaPodsからSwift Package Managerへ移す価値はどこで判断しますか。
依存の追加方法が変わることではなく、将来の新規MacやCIで同じ構成を復元できるかで判断します。移行によって消えるRuby依存より、失われるカスタム処理やSDKの正式サポートの方が大きいなら、今は移行しない方が適切です。

04

非公開依存とバイナリSDKの選別

非公開のソースリポジトリ、社内コンポーネント、XCFramework、リソース付きSDKは、同じ基準で扱えません。認証方式、配布形式、バージョンタグ、チェックサム、チームのアクセス権を依存ごとに確認します。

CocoaPodsで非公開Spec Repoを使う場合は、認証済みのリポジトリをCIから参照できる設計が必要です。CocoaPodsのPrivate Pods公式ガイドを基準に、認証情報をソースコードへ直接書かない構成にします。

Swift Package Managerでも、非公開リポジトリへのアクセス権がなければ取得できません。さらに、バイナリターゲットでは提供元が示すチェックサムや配布条件を確認します。SDK提供元が「Swift対応」とだけ説明している場合、Swift Package Managerで導入できるとは判断しないでください。正式なPackage導入手順があることを確認するのが先です。

05

併用移行の進め方

1つのXcodeプロジェクトでCocoaPodsとSwift Package Managerを同時に使えますか。
併用は可能ですが、同一ライブラリの二重導入と、異なる経路から同じ依存が入る状態は避けます。移行期間だけの暫定構成として、どのライブラリをどちらで管理するかを記録してください。

安全な移行順序は、低リスクの周辺ライブラリ、単独Targetのコンポーネント、最後に複数Targetが共有する核心ライブラリです。1回の変更で複数の管理方式を入れ替えると、失敗時に原因を切り分けられません。

各バッチでは、次の5段階を個別に記録します。

  1. 依存関係の解決。
  2. ソースまたはバイナリの取得。
  3. 通常のコンパイル。
  4. ユニットテストとUIテスト。
  5. 署名付きArchive。

Swift Package Managerの解決処理は、Swift Package Managerの公式ドキュメントで確認できます。CocoaPods側は、公式コマンドリファレンスと既存のCIスクリプトを照合します。

移行後に通常ビルドだけ成功しても、完了とは扱いません。Archive、エクスポート、App Store Connectへのアップロードまで確認し、失敗時に元のブランチとロックファイルへ戻せる状態を残します。

06

リモートCI向けの復元チェック

リモートMacでのiOSビルドでは、手元のDerived Dataや依存キャッシュが成功を隠すことがあります。キャッシュを消した環境、新しい作業ディレクトリ、認証情報を持たない初期状態から復元できるかを確認してください。

AppleのCIワークフローで依存関係を扱う公式資料を参照し、ロックファイルをリポジトリへ含める運用、非対話認証、キャッシュ失効時の処理を整理します。

  • [ ] Package.resolvedまたはPodfile.lockをコミットしている。
  • [ ] 依存取得に必要な非公開リポジトリの権限をCI専用に分離している。
  • [ ] キャッシュなしで解決と取得が完了する。
  • [ ] 通常ビルド、テスト、Archiveを同じ作業手順で実行できる。
  • [ ] Macを再起動、または別の作業環境へ切り替えても復元できる。
  • [ ] 失敗時にCocoaPods構成、Swift Package Manager構成のどちらへ戻すか決めている。
  • [ ] Archive後の署名とアップロードまで確認している。

このチェックで重要なのは、所要時間の短さではありません。依存の取得先、ロック状態、認証、キャッシュの前提が明文化されていることです。

07

プロジェクト決定カード

最後に、次の条件で停止点を決めます。

CocoaPodsを継続する条件

  • Pod専用の重要SDKが残っている。
  • 独自スクリプトが発行工程に組み込まれている。
  • 近いリリースで移行差分を検証できない。

Swift Package Managerへ移行する条件

  • 主要依存が正式対応している。
  • リソースとバイナリTargetの互換性を確認できている。
  • クリーンなMacでテストとArchiveまで再現できる。

一時的に併用する条件

  • 周辺ライブラリだけ先に置き換えられる。
  • 二重導入を防ぐ所有者と一覧を管理できる。
  • 各バッチに回退用ブランチと検証記録がある。

この判断は、依存解決が通った時点で終わりではありません。Archiveまで再現できないなら、移行を止めてCocoaPodsへ戻すか、問題の依存だけを旧方式に残します。

新規プロジェクトではSwift Package Managerを優先しやすい一方、既存のCocoaPods案件では安定した発行経路そのものが資産です。Macを購入するか迷っている場合は、まずMac miniの導入条件を比較するガイドで常設機の費用と運用条件を確認してください。短期間の検証なら、KVMNODEのMac環境を使い、現在の依存構成を変えずにクリーンなmacOS環境で復元、テスト、Archiveまで確認する方法もあります。

手元のMacだけで移行すると、既存のキャッシュ、Ruby環境、証明書、Derived Dataが結果に混ざります。購入したMacを常時CI用に確保する方法は、初期費用、保守、空き容量、運用担当の負担が残ります。クラウドCIだけに任せる方法も、macOS専用工程、非公開SDKの認証、キャッシュ失効時の再現確認で制約が出ます。移行テストや一時的なiOS打ち合わせ用環境なら、KVMNODEのMacを期間単位で借りて、検証専用の独立環境として使う方が、既存の発行環境を壊さずに判断できます。