Help us understand the problem. What is going on with this article?

今こそ復習したい、iOSアプリのディレクトリ構成

More than 3 years have passed since last update.

今更感も漂うテーマですが、「なんでもかんでもDocumentsディレクトリに入れる」という運用をしていると、ガイドラインに引っかかってリジェクトされたりもするので、復習を兼ねてまとめておきたいと思います。

iOSアプリのディレクトリ構成

iOSアプリのディレクトリ構成は下記のようになっております。

ちなみに、この画面は Xcode>Window>Devices を開いて、実機を選択し、"Installed Apps"をダブルクリックすると見ることができます。

dir.jpg

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項目あります。とりあえず「ざっくり」訳しておきます。

  1. Documentsフォルダに置いていいのはユーザー作成のデータのみおくべし
    ユーザ生成のデータではないファイルや、キャッシュデータなどは置いてはいけないです。

  2. 再ダウンロード出来るデータ、再作成できるデータは/Library/Cachesに置くべし

  3. テンポラリーファイルは /tmp に置くべし

  4. バックアップが不要なファイルは "do not back up" attribute を付けるべし

基本的にAppleの意図としては、「iCloudでバックアップされる容量を最低限にしたい」というのが目的みたいです。「Cachesとかtmpファイルをちゃんと使えよ」というのを徹底したいようです。

まとめ

データファイルというと、てきとーに「Documents」に入れてしまいがちなのですが、実はきちっとしたガイドラインがあり、守らない場合はリジェクトされてしまいます。

アプリでファイルを保存するときは、これらのことを頭の片隅に置いて、一発で審査に合格するようにしましょう〜。

tototti
仙台でプログラマー会社員をやっています。仙台iOS勉強会(SWWDC)をやったり、iOSアプリを開発したりしています。
http://lablog.tototti.com/
nanairo
仙台・宮城の伝統工芸の活性化や継承を目的としたオンラインクラフトショップ運営やアプリ開発を行う IT x クリエイティブ企業
https://nanairo-inc.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away