今更感も漂うテーマですが、「なんでもかんでもDocumentsディレクトリに入れる」という運用をしていると、ガイドラインに引っかかってリジェクトされたりもするので、復習を兼ねてまとめておきたいと思います。
iOSアプリのディレクトリ構成
iOSアプリのディレクトリ構成は下記のようになっております。
ちなみに、この画面は Xcode>Window>Devices を開いて、実機を選択し、"Installed Apps"をダブルクリックすると見ることができます。
File System Programming Guide
それでは、Appleの資料を元に各ディレクトリを見てみましょう。
File System Programming Guide: File System Basics
MyApp.app
- 読み込み可能
- 書き込み不可能
- iTunesでバックアップされない。
いわゆる、Bundle containerというやつです。Xcodeのプロジェクトに画像ファイルなどを追加する事があると思うのですが、そういったものはここに入ります。
Documents/
- 読み込み可能
- 書き込み可能
- iTunesでバックアップされる。
ユーザー作成のコンテンツ(テキスト、写真)がここに入ります。設定によっては、iTunes経由などで見ることができるので、ユーザーに見られて困るようなファイル(設定ファイルとか)はここに置いておくべきではないです。
Documents/Inbox
- 読み込み可能
- 書き込み不可能(削除は可能)
- iTunesでバックアップされる。
他のアプリからファイルを受け取るときに使用するディレクトリ。
Library/
- 読み込み可能
- 書き込み可能
- iTunesでバックアップされます(Cacheディレクトリを除く)。
ユーザー作成のファイル以外のデータ保存用のディレクトリ。Documents/ に入れるようなデータ以外の者は、だいたいここに入れておけばokな感じです。
Library/Cache
- 読み込み可能
- 書き込み可能
- iTunesでバックアップされない。
- システムから自動削除される場合あり。
キャッシュ用途に使用します。OSが勝手に消しちゃう場合もあるそうなので、消されると困るデータは、ここに置いておくべきではないです。
tmp/
- 読み込み可能
- 書き込み可能
- iTunesでバックアップされない。
- アプリが起動していない時に、システムが自動削除する可能性がある。 2016/05/11 修正しました
テンポラリーファイル用のディレクトリです。アプリ起動中のファイルの追加/削除は、自分で管理する必要があります。
また、アプリが起動していない時に、システムが削除する場合があります。アプリが再起動した場合は、tmpディレクトリ内のファイルは削除されていると想定して設計するのが良いでしょう。
iOS Data Storage Guidelines
もう一つデータディレクトリを使用する上で見ておくべき資料が、「iOS Data Storage Guidelines」です。
iOS Data Storage Guidelines - Apple Developer
リジェクト
このガイドラインに従っていない場合、AppStoreの審査でリジェクトになる場合があります。
※例えば、SQLiteのDBファイルをあらかじめ作成しておき、BundleからDocumentsフォルダにコピーして利用すると、ガイドライン(1)に引っかかるためリジェクトの対象になります。
ネットでは↑のようなことをしているサンプルが多いですが...注意が必要です。
ガイドライン
ガイドラインは4項目あります。とりあえず「ざっくり」訳しておきます。
-
Documentsフォルダに置いていいのはユーザー作成のデータのみおくべし
ユーザ生成のデータではないファイルや、キャッシュデータなどは置いてはいけないです。 -
再ダウンロード出来るデータ、再作成できるデータは/Library/Cachesに置くべし
-
テンポラリーファイルは /tmp に置くべし
-
バックアップが不要なファイルは "do not back up" attribute を付けるべし
基本的にAppleの意図としては、「iCloudでバックアップされる容量を最低限にしたい」というのが目的みたいです。「Cachesとかtmpファイルをちゃんと使えよ」というのを徹底したいようです。
まとめ
データファイルというと、てきとーに「Documents」に入れてしまいがちなのですが、実はきちっとしたガイドラインがあり、守らない場合はリジェクトされてしまいます。
アプリでファイルを保存するときは、これらのことを頭の片隅に置いて、一発で審査に合格するようにしましょう〜。