以前のXcodeでは普通にフォルダをリソースとして使えていた
以前とある教育用のアプリを開発していました。教育用なので、WEBのコンテンツのように、テキスト、レイアウト、画像音声など大量のリソースのバンドルが必要となります。そうするとやはり、部、章など構造的な単位でリソースを管理した方が何かと都合がよいです。そして、同様なプロジェクトが毎年続いたので、アプリのテンプレから同様にやっていました。
ある年に、心機一転プロジェクトをスクラッチから起こす事にしました。例年と同じようにコンテンツリソースの詰まったフォルダをプロジェクトにドロップします。あれ!?グループにするかリファレンスにするか訊いてきません。キャンセルしてオプション推しながらとか、何度か試しても同じです。諦めてそのままドロップします(コピーだったか移動だったか)。
フォルダのいろが違う
ドロップしてから気がつきます。リソースのフォルダの色が他のと同じブルーとうかシアンです。これはやばいと思いますが、試しにリソースを読み込むコードを書いてみます。
読めません。
しかも、リソースを増やすと競合するようなビルドエラーがでてくるようになります。
これはやばいと思い、ビルドエラーがでない状態に戻して、実行バイナリーをバラしてみます。フォルダー構造が保たれていません。構造的なリソースがばらされて、散らばっています。あ、これはやばいと思いいろいろ試したり、スタックオーバーフローをあさったりしましたが、ピンとした回答がないので、あきらめて例年どおりプロジェクトのテンプレートから新規プロジェクトを起こしているのを続けてきました。
本日、別件で、やはり構造的なリソースが欲しいと思い再度いろいろ試した所、いろいろわかってきたので、同様に困っている人がいれば、ここに辿り着けるように、記事を書く事にしました。
スクリーンショット用のプロジェクトを作ってみる
まずは、HelloDirectoryResources という架空のプロジェクトを想定して、その中にPhotos
というディレクトをドロップしてみます。Xcodeの進化のどこかで、その類の指定はできなくなっています。諦めてドロップします。
試しにビルドして、実行バンドルをバラしてしみます。Macだと「Resources」フォルダがあって上手くいったような錯覚を受けますが、実は「Photos」のディレクトリがありません。そう、フラットにバラされてビルドされています。なので、「各フォルダ」にindex.html
のようなファイルを用意していると、名前が衝突してビルドエラーになります。
ここまでが、ここまでにわかってきた事です。
ここからは本日調べてわかった事です
今度は、Photos
をルート直下にドラッグ&ドロップしてみます。
今度はグループが選べるようになりました。どちらがどちらなのでしょう。せっかくなので、「Group」を選んでみます。
そうそう、ブルーというかシアンでないフォルダができました。さて実行バンドルをバラしてみます。
ありません。
今度はGroup
ではなくてFolder
を選んでみます。
フォルダはブルーです。が、実行するとリソース用のフォルダはばらけて存在します。
普通ならここで諦めそうですが、なんで他のプロジェクトはできて、これでは聞きないのだろうと自問しながら、調べてみます。XcodeでPhotos
のフォルダを選んで、インスペクタを見てみます。
「!!!」 お気づきだろうか…
見覚えのないメニューが出現
なんだか見覚えのないメニューが出現します。
Target Membership
から+
を押して、実行ターゲットを指定します。
では、ビルドして実行バンドルをバラして見ましょう。
フォルダがあった (;_;)
ちゃんと、Resoures
の直下にPhotos
フォルダがあります。これでディレクトリをリソースとして扱える筈です。iOSだと、「Resources」フォルダがなくて、直にPhotos
が配置されます。
こんなの普段使わなくて、一年後には思い出せないので、ここに備忘録として残す事にします。
執筆時の環境
MacOS: 15.5 (24F74)
Chip: Apple M1 Max
Xcode: Version 16.4 (16F6)