hachinoBlog

hachinobuのエンジニアライフ

メインバンドル内に階層をつくる方法

経緯

プロジェクト内にフォルダを作成して、そのフォルダ内にある画像を読み込む際にプロジェクト内で作成したフォルダはコンパイラ上では ホーム/[アプリ名.app]フォルダ直下にリソースが展開されてしまう。

f:id:hachinobu:20140207164229p:plain

//[アプリ名.app]フォルダ直下にsampleの3つの画像が配置されるため下記では取得できない
NSArray *images = [[NSBundle mainBundle] pathsForResourcesOfType:@"png" inDirectory:@"sample"];

また、ホーム/[アプリ名.app]フォルダ直下にフォルダを作成しようとしても権限がないためエラーになってしまう。 "The operation couldn’t be completed. (Cocoa error 513.)" UserInfo=0x1cd55700 {NSUnderlyingError=0x1cd54df0 "The operation couldn’t be completed. Operation not permitted",

解決策

プロジェクト内にフォルダを作成する際にXcode上で作成するのでなく、Finderで作成してXcodeのプロジェクトにドラッグ&ドロップして、オプション設定のダイアログの[Create folder references for any added folders]にチェックをつける。

f:id:hachinobu:20140207165630p:plain

そうするとXcodeのプロジェクト上にドラッグ&ドロップしたフォルダが青く表示される。

f:id:hachinobu:20140207170024p:plain

この状態になれば ホーム/[アプリ名.app]フォルダ直下にドラッグ&ドロップしたフォルダが配置されている。

//[アプリ名.app]/sample/配下にある3つの画像パスを取得できる
NSArray *images = [[NSBundle mainBundle] pathsForResourcesOfType:@"png" inDirectory:@"sample"];

ホーム/[アプリ名.app]フォルダ配下には書き込み権限はないので取得したファイルをアプリケーションのLibrary/Cachesフォルダなど書き込み権限のあるフォルダにコピーしておき、必要があればいつでもWEBからダウンロードしてAppleの審査なしで画像を差し替えることができる。

※該当の画像を読み込む際にはコピーしたパスから画像を表示させるようにするのは当然。