🚨

【Swift】`PBXGroup` attempted to initialize エラーの解消

2024/10/05に公開

初めに

今回は Xcode16 で開発している途中で発生した「PBXGroup attempted to initialize」というエラーを解消する方法を共有したいと思います。

記事の対象者

  • 上記エラーを解決したい方

環境

  • Xcode 16.0
  • MacBook Pro Apple M3

エラー内容(一部省略)

### Stack
   CocoaPods : 1.15.2
        Ruby : ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin23]
    RubyGems : 3.5.4
        Host : macOS 15.1 (24B5009l)
       Xcode : 16.0 (16A242d)
         Git : git version 2.39.5 (Apple Git-154)
Ruby lib dir : /usr/local/Cellar/ruby/3.3.0/lib
Repositories : trunk - CDN - https://cdn.cocoapods.org/

### Error

RuntimeError - `PBXGroup` attempted to initialize an object with unknown ISA `PBXFileSystemSynchronizedRootGroup` from attributes: `{"isa"=>"PBXFileSystemSynchronizedRootGroup", "explicitFileTypes"=>{}, "explicitFolders"=>[], "path"=>"watch-sample Watch App", "sourceTree"=>"<group>"}`
If this ISA was generated by Xcode please file an issue: https://github.com/CocoaPods/Xcodeproj/issues/new
/usr/local/Cellar/cocoapods/1.15.2/libexec/gems/xcodeproj-1.24.0/lib/xcodeproj/project/object.rb:359:in `rescue in object_with_uuid'
/usr/local/Cellar/cocoapods/1.15.2/libexec/gems/xcodeproj-1.24.0/lib/xcodeproj/project/object.rb:349:in `object_with_uuid'


――― TEMPLATE END ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

[!] Oh no, an error occurred.

Search for existing GitHub issues similar to yours:
https://github.com/CocoaPods/CocoaPods/search?q=%60PBXGroup%60+attempted+to+initialize+an+object+with+unknown+ISA+%60PBXFileSystemSynchronizedRootGroup%60+from+attributes%3A+%60%7B%22isa%22%3D%3E%22PBXFileSystemSynchronizedRootGroup%22%2C+%22explicitFileTypes%22%3D%3E%7B%7D%2C+%22explicitFolders%22%3D%3E%5B%5D%2C+%22path%22%3D%3E%22watch-sample+Watch+App%22%2C+%22sourceTree%22%3D%3E%22%3Cgroup%3E%22%7D%60%0AIf+this+ISA+was+generated+by+Xcode+please+file+an+issue%3A+https%3A%2F%2Fgithub.com%2FCocoaPods%2FXcodeproj%2Fissues%2Fnew&type=Issues

If none exists, create a ticket, with the template displayed above, on:
https://github.com/CocoaPods/CocoaPods/issues/new

Be sure to first read the contributing guide for details on how to properly submit a ticket:
https://github.com/CocoaPods/CocoaPods/blob/master/CONTRIBUTING.md

Don't forget to anonymize any private data!

Looking for related issues on cocoapods/cocoapods...
Searching for inspections failed: undefined method `map' for nil

解決策

このエラーは Xcode16.0 のiOSアプリに watchOS のターゲットを追加した際に起こりました。
今回関係のない部分は灰色で隠していますが、プロジェクトを開くと以下のような表示になっています。

この画像では以下の三つの項目のファイルの色が水色になっています。

  • watchSample Watch App
  • watchSample Watch AppTests
  • watchSample...atch AppUlTests

これらのファイルにカーソルを当てて右クリックして「Convert to Group」を選択します。

自分の環境では、三つのファイルで「Convert to Group」にして以下のような表示にしてから実行するとうまく実行できました。

エラー原因

Managing files and folders in your Xcode project のドキュメントに以下のような記述がありました。

Create groups
Creates a group structure in your project that matches the structure of the selected files and folders on disk. Xcode creates a group in the Project navigator for each folder you add, and it adds the contents of the folder to that group. Choose this option when you want the group structure in Xcode to differ from the directory structure on disk, or you want to reference files outside your project.

Create folders
Displays the folders in the Project navigator, and either copies, moves, or references files depending on the selection you make in the Action picker. In the Project navigator, each added folder points to a folder in the file system. Choose this option when you want your Project navigator folders to match the file and directory structure on disk, and to minimize changes to your project file when you add or remove files.

(日本語訳)
グループを作成
ディスク上で選択したファイルとフォルダの構造に一致するグループ構造をプロジェクト内に作成します。Xcodeは追加する各フォルダに対してプロジェクトナビゲータにグループを作成し、そのフォルダの内容をそのグループに追加します。Xcodeのグループ構造をディスク上のディレクトリ構造と異なるものにしたい場合や、プロジェクト外のファイルを参照したい場合にこのオプションを選択してください。

フォルダを作成
プロジェクトナビゲータにフォルダを表示し、アクションピッカーで選択した内容に応じてファイルをコピー、移動、または参照します。プロジェクトナビゲータでは、追加された各フォルダはファイルシステム内のフォルダを指します。プロジェクトナビゲータのフォルダをディスク上のファイルおよびディレクトリ構造と一致させたい場合や、ファイルの追加や削除時にプロジェクトファイルへの変更を最小限に抑えたい場合にこのオプションを選択してください。

ここで重要なのは以下の2点かと思います。

  • Groups:Xcodeプロジェクト内の論理的な構造で、実際のファイルシステムの構造とは独立している
  • Folders:実際のファイルシステムの構造をXcodeプロジェクト内に反映させる

エラー内容では PBXFileSystemSynchronizedRootGroup が参照できないと言われています。この PBXFileSystemSynchronizedRootGroup をCocoaPodsの現在のバージョンが適切に処理できていないために起こっています。
フォルダーを使用したことで、CocoaPodsが期待するプロジェクト構造とは異なる構造が生成され、解析エラーを引き起こしていると考えられます。

以上のことから、Groups を使用することでエラーが解決したと考えられます。

まとめ

最後まで読んでいただいてありがとうございました。
誤っている点や他の実装方法等あればご指摘いただけると幸いです。

参考

https://github.com/CocoaPods/CocoaPods/issues/12583

https://developer.apple.com/documentation/xcode/managing-files-and-folders-in-your-xcode-project

Discussion