『iOSのバンドルとファイルシステム』


iOSファイルシステムサンドボックス)について
iOSにはサンドボックス(wiki)という仕組みがあって、
バイスiPhoneシミュレータにアプリを初めてインストールした時に、
1つのアプリにつき1つのサンドボックスが作られます。
サンドボックスは安全にデータを保存できる領域で、
他のアプリのサンドボックスにデータを読み書きする事はできません。
※語源は子供を安全な砂場で遊ばせる事から来ているらしい



サンドボックスの狙いは?】

1.悪意のあるアプリによって、ファイルを書き換えられる事を防止する。

2.アプリの誤動作でのファイルの破損等をサンドボックス内に抑える


サンドボックス内にあるファイルは?】

iOSアプリケーションプログラミングガイドからの分かりやすい画像の引用
前述の通り、1つのアプリにつき1つのサンドボックスが作られます。



ディレクトリ構成】
iOSではホームディレクトリ(/Applications/アプリの一意の識別子GUID)以下に全てのデータを保存します。
※ホームディレクトリはサンドボックス内のルートディレクトリです。


ホームディレクトリには以下のディレクトリが存在します。
◯ アプリ名.app      アプリの実行ファイル、リソースファイルを含むアプリケーションバンドル
◯ Documents        アプリのデータを保存する場所
◯ Library/Preferences   アプリの設定ファイルを保存する場所
◯ Library/Caches          キャッシュファイルを書き込む場所
◯ tmp         一時ファイルを保存する場所

この中で『iTuens』のバックアップ対象になるのは、DocumentsとPreferencesです。
実機においては、Documents、tmp以下のみアクセスでき、
その他のディレクトリや、ホームディレクトリ直下は書き込み等のアクセスが制限される。

 参考サイト:データの保存 (2) - ホームディレクトリとファイルパス
http://bit.ly/qGsDYV



【バンドルとは何?】

Finder (wikipedia)リソースとパッケージとバンドルの項を参考にしました。
バンドルとは簡単に言うと、入れ子になったフォルダを1つの書類に見せかけるもの。
複雑なファイル構成が隠されて、ユーザーにとってシンプルに扱えるようになった。


【アプリケーションバンドル】

前述した【サンドボックス内にあるファイルは?】のMyApp.appもバンドルだからこそ、
見た目には1つのファイルとして扱える。
ちなみにアプリケーションバンドルの中身は「右クリック」> 「パッケージの内容を表示」でみられる。


iPhoneシミュレータでビルドしたファイルの保存場所】

以下のパスに保存されており、中身はiphone実機のディレクトリ構成と一緒です。
参考:Mac OS X Lionで隠しファイルを表示する
アプリケーションIDは1意の名前(アルファベットと数字の組み合わせ)からなるので、
ぱっと見分かり辛いです、更新日時等でソートすると探しやすくなります。

/Users/ユーザー名/Library/Application Support/iPhone Simulator
/ビルド時のiOS_Versionのフォルダ/Applications/アプリケーションID内

バンドル地獄

いまさらながら、iOSアプリケーションプログラミングガイドを読んでいます。
http://developer.apple.com/jp/devcenter/ios/library/documentation/iPhoneAppProgrammingGuide.pdf


ファイルを保存する時に、Documentsに保存するのが良いのか?どこが良いのかで迷ったからです。


読み始めると、サンドボックスについて解説がありました。
アプリが最初にデバイスにインストールされるとき、システムがアプリのホームディレクトリを作成し、
サンドボックスのセキュリティ権限を設定すると、
そして、ホームディレクトリのパスは次の形式をとりますよと、
/ApplicationRoot/ApplicationID/
なるほど。

そしてiOSアプリケーションの各ディレクトリについてはこのように書いてありました。
/AppName.app

アプリ自体を含むバンドルのディレクトリです。
このディレクトリには何も書き込まないで下さい。
ここに書き込むと、署名が変化するから、アプリを起動することができなくなります。
このディレクトリはiOS2.1以降ではiTunesのバックアップなし
ただし、AppStoreから購入したアプリの最初の同期はiTuensに実行されると、、
ちゃんと書き込むなって書いてありますね。



/Documents

ユーザー文書や、アプリのデータを保存するのにはここを使います。
iTunesのバックアップ有り
ファイル共有もできますよと、なるほど




/Library/

このディレクトリはユーザーのデータファイル用には使用しないで下さい。
iTunesのバックアップ有り



/Library/Preference

アプリケーション固有の環境設定ファイルを保存する。
NSUserDefaults等で、、
iTunesのバックアップ有り




/Library/Caches

アプリを次に起動するまでの間、
アプリの更新中に残しておきたいアプリ固有のサポートファイルを書き込む。
iOS2.2以降ではiTunesのバックアップなし。


/tmp

アプリを次回起動するまで、保持する必要のない一時的なファイルを
書き込むのに使用する。
システムが古いファイルをこのディレクトリから削除する場合も、、
iOS2.1以降ではiTunesのバックアップなし。


保存はいるけど、バックアップはいらないという大きいデータや、
良く変更がかかるデータはCachesにいれておきましょう。
大きいデータをDocumentsにいれておくと、同期の度にバックアップをとるので時間がかかるからです。

もうちょっと公式文書をしっかり読みます。

PS:tmpやCachesディレクトリに書き込めないという事態に陥った、
と思っていましたが、iOS5で試したり、iOS4.3で試したりしていたので、
iOS5iOS4で別々の場所にデータが保存されているだけでした、、くやしい。。