CocoaPodsでpod installやpod updateを実行した際に、Could not find compatible versions for podと表示され、依存関係の解決に失敗することがあります。多くの場合、Podfileのバージョン指定、Podfile.lock、iOSのDeployment Target、依存Pod同士の要求バージョンが一致していないことが原因です。
主な原因
- Podfileで指定したバージョンと依存ライブラリの要求バージョンが競合している
- Podfile.lockに古いバージョンが固定されている
- iOS Deployment TargetがPodの最低要件より低い
- Specs情報が古く、必要なバージョンを取得できていない
- 複数のPodが同じ依存Podに異なるバージョンを要求している
代表的なエラー例:
[!] CocoaPods could not find compatible versions for pod "ExamplePod":
In Podfile:
ExamplePod (~> 2.0)
Specs satisfying the `ExamplePod (~> 2.0)` dependency were found, but they required a higher minimum deployment target.
代表的な発生状況
ライブラリを更新した直後、Gitで別ブランチへ切り替えた後、XcodeやiOS SDKを更新した後、または複数人でPodfile.lockを共有しているプロジェクトで発生しやすいエラーです。
確認手順
1. CocoaPodsのバージョンを確認する
pod --version
2. PodfileとPodfile.lockを確認する
問題のPod名を検索し、Podfile側の指定とPodfile.lockで固定されているバージョンに差がないか確認します。
3. Deployment Targetを確認する
Podfileのplatform指定と、XcodeのTarget → General → Minimum DeploymentsまたはBuild SettingsのDeployment Targetを確認します。
platform :ios, '15.0'
解決方法
方法1:対象Podだけ更新する
まずは影響範囲を小さくするため、問題のPodのみ更新します。
pod update ExamplePod
方法2:Specsを更新して再実行する
pod repo update
pod install
または次のように実行できます。
pod install --repo-update
方法3:Podfileのバージョン指定を見直す
必要以上に厳しい固定指定をしている場合、依存関係の解決ができる範囲へ変更します。
pod 'ExamplePod', '~> 2.0'
方法4:Deployment Targetを引き上げる
エラー文にrequired a higher minimum deployment targetが含まれる場合は、Podが要求する最低OSバージョン以上へ引き上げます。
方法5:Podfile.lockを再生成する
依存関係が大きく崩れている場合は、Podfile.lockを削除して再解決します。
rm Podfile.lock
pod install --repo-update
注意:Podfile.lockを削除すると複数のPodが新しいバージョンへ変わる可能性があります。チーム開発では差分を確認し、安易に削除しないようにしてください。
方法6:Podsを再構築する
キャッシュや生成済みファイルが原因の場合は、Podsを再構築します。
rm -rf Pods
pod install --repo-update
依存関係の競合を読み解くポイント
エラーログには「どのPodが」「どの依存Podの」「どのバージョンを要求しているか」が表示されます。最後の1行だけでなく、要求元のPod名とバージョン制約を上から追うと原因を特定しやすくなります。
注意点
pod updateを引数なしで実行すると、Podfile.lockで固定されていた多数のライブラリが更新される可能性があります。まずはpod update PodNameのように対象を限定する方法がおすすめです。
まとめ
Could not find compatible versions for podは、CocoaPodsが要求された依存バージョンの組み合わせを成立させられないときに発生します。PodfileとPodfile.lock、Deployment Target、Specs情報を順に確認し、対象Podの更新、バージョン指定の調整、最低OSバージョンの見直しを行うことで解決できるケースが大半です。
