😭

Xcode16に上げたら、pod installができなくなった話

2024/12/02に公開

初めに

Xcode16に上げたらCocoaPodsが使えなくなったよ〜、助けてTOSHえもん〜。ということで助けるためにこの記事を書こうと思います。

TD;LR

See this

https://github.com/CocoaPods/CocoaPods/issues/12671#issuecomment-2467142931

どうしたら再現する?

実はXcode16にしただけだと多分再現しないですね。

おそらくこれで再現するようになるかと思います。

エラー

内容

pod系のコマンドを実行しようとすると下記のようなエラーが出てきます。

ArgumentError - [Xcodeproj] Unable to find compatibility version string for object version `70`.

これです。

解析

これだけだと何が原因かわからないと思うので、もう少し解析してみましょう。

ArgumentError - [Xcodeproj] Unable to find compatibility version string for object version `70`.
/opt/homebrew/Cellar/cocoapods/1.16.0/libexec/gems/xcodeproj-1.26.0/lib/xcodeproj/project.rb:85:in `initialize'
/opt/homebrew/Cellar/cocoapods/1.16.0/libexec/gems/cocoapods-1.16.0/lib/cocoapods/project.rb:48:in `initialize'

エラーの前後の数行を出してみました。どうやら、cocoapodsが内部依存として持っているxcodeproj側でエラーを出してそうです。
ここの周辺コードを見てみましょう。
ここです。どうやら、プロジェクトのobject_version何らかの値がCOMPATIBILITY_VERSION_BY_OBJECT_VERSIONにマッチしていなかったために終了してそうです。

では、いったいこのobject_versionとは何で、COMPATIBILITY_VERSION_BY_OBJECT_VERSIONとはいったい何なのでしょうか?

object_versionとは

プロジェクトの、.pbxprojファイル内に存在するobjectVersion = <value>;が該当項目になります。今回このプロジェクトを見てみるとobjectVersion = 70;のようになっていました。どうやらエラーの内容と一致してそうです。

ではこの値はいったい何が入っているといいのでしょうか?
xcodeprojのソースコードへと戻ります。

    # @return [Hash] The compatibility version string for different object versions.
    #
    COMPATIBILITY_VERSION_BY_OBJECT_VERSION = {
      77 => 'Xcode 16.0',
      63 => 'Xcode 15.3',
      60 => 'Xcode 15.0',
      56 => 'Xcode 14.0',
      55 => 'Xcode 13.0',
      54 => 'Xcode 12.0',
      53 => 'Xcode 11.4',
      52 => 'Xcode 11.0',
      51 => 'Xcode 10.0',
      50 => 'Xcode 9.3',
      48 => 'Xcode 8.0',
      47 => 'Xcode 6.3',
      46 => 'Xcode 3.2',
      45 => 'Xcode 3.1',
    }.freeze

どうやら、Xcode16系であれば77であることが期待されており、70といった数値は予期されていなさそうです。これが原因で、pod installが失敗してそうでした。

対応方法

(NG)手動で、pbxprojのobjectVersionを77にする

NGです。pod installはできるようになるのですが、例えばフォルダ追加やpod installといった.pbxprojに対して変更が入る修正を入れるたびに70へと戻してしまうようです。
objectVersionはあくまで機械的に管理されるものなので、手動で変えるものではないようです。
ではいったいどこを変えれば良いのでしょうか?

Project FormatをXcode 16にする

.pbxproj内のobjectVersionはGUI上のProjectFormatに依存しています。なので、ここを変えてあげる必要があります。

これをあげることで、objectVersionも自動で適切な値へと変更してくれます。
objectVersionの挙動についてまとめてみましょう。
Xcode 16を使っている && Folder参照にしている && ProjectFormatがXcode 16ではない
の場合のみxcodeprojに定義のないobjectVersion: 70になるのでpod installが失敗する。

まとめ

I am a lifesaver.

Discussion