macOS 10.5時代に開発した古いmacOSアプリを現代のOSに移植する作業を行っています。その中で、ビルドを通した物のデバッガにすら読み込まれず、起動できないという問題に遭遇しました。
今回の原因はローカライズリソースフォルダでした。
原因の調査
デバッガにも読み込まれないという状態なので、ビルドされたアプリケーションパッケージの構造に問題があると考えられましたので、ターミナルからの起動を試みます。Xcodeでビルドしたアプリの中間オブジェクトはデバッグ用のバイナリなどは、デフォルト設定では、以下のディレクトリにプロジェクトごとのフォルダが作られ出力されます。
~/Library/Developer/Xcode/DerivedData
今回のアプリは「RKDetailDesign」といいうアプリです。プロジェクトファイル名が RKDetailDesign.xcodeproj
なので、上記のディレクトリに RKDetailDesign-byccbbcuvpnixtdhipwqzxlntobv
というフォルダが見つかります。その中の以下のディレクトリにデバッグ版のアプリが入っています。
Build/Products/Debug
ターミナルからビルドしたデバッグ版のアプリを起動します。
% cd /Users/akira/Library/Developer/Xcode/DerivedData/RKDetailDesign-byccbbcuvpnixtdhipwqzxlntobv/Build/Products/Debug
% % ./RKDetailDesign.app/Contents/MacOS/RKDetailDesign
2024-03-15 22:10:17.965 RKDetailDesign[14090:143830] Unable to load nib file: MainMenu, exiting
原因が判明しました。 MainMenu.nib
をシステムが見つけることができず、起動処理が中断されていました。
MainMenu.nibファイルについて
MainMenu.nib
はビルド時に MainMenu.xib
ファイルから作られます。 MainMenu.xib
はプロジェクトに登録されており、ローカライズはEnglishのみになっています。そしてビルドされたパッケージ内にも以下のパスに出力されています。
RKDetailDesign.app/Contents/Resources/en.lproj/MainMenu.nib
Base国際化
en.lproj
というフォルダは英語版用のローカライズリソースフォルダです。昔はEnglish.lproj
という名前でした。旧形式の名前を使用していると現行形式の名前を使用するようにワーニングが出ます。Xcodeの移行機能で素直に従うとen.lproj
という現行形式に移行されるのですが、同時にbase.lproj
というローカライズしないファイルを入れるローカライズリソースフォルダを持った、Base国際化を使用する設定になります。
この設定になっていると、base.lproj
に入っておらず、特定言語用のフォルダにのみファイルが入っていると、ファイルが見つからないという動作になります。
今回の例では、en.lproj/MainMenu.nib
はあるが、base.lproj/MainMenu.nib
はないので、MainMenu.nib
が見つからず、起動できないという状態になっていました。
Base国際化を使用しない、昔のシステムはEnglish.lproj
がbase.lproj
の役割を兼任していました。
Base国際化を使用するかは、プロジェクトの設定の「Info」タブの「Use Base Internationalization」チェックボックスで設定します。

en.lprojからbase.lprojに移動する
en.lproj
からbase.lproj
にファイルを移動します。とりあえずは、問題になっているMainMenu.nib
を移動します。Xcodeでできます。ここではMainMenu.nib
を例にリソースファイルの別言語版を追加する手順を紹介します。以下の様に操作します。
ファイルインスペクタの「Localization」に選択しているファイルのローカライズ情報が表示されます。「English」だけが選択されています。これは英語版のみあることを示しています。「Base」を選択してBase版を追加します。これによりbase.lproj
にMainMenu.xib
がコピーされます。

Base版をローカライズしていないバージョンとして使用します。古いシステムでは英語版がその役割でしたので、英語版は必要なくなったので「English」のチェックを外します。これにより、en.lproj
からMainMenu.xib
が削除され、ビルド時にen.lproj/MainMenu.nib
が出力されなくなります。

テスト
リソースファイルの構成が変わるので、「Product」メニューから「Clean Build Folder…」を実行してからビルドします。
base.lproj/MainMenu.nib
が出力されたことでMainMenu.nib
が見つかり起動するようになりました。
en.lrpoj
にある他のファイルについても同様に操作して、base.lproj
に移動すれば、Base国際化を使うように移行完了です。