ブログ
iOSのファイル保存場所について
こんにちは、M.Hと申します!
今回は、iOSアプリのファイルシステムについて書きます。
以前に携わっていた業務で、画像を保存する必要があった際にファイルシステムの
仕様を知らずに保存してハマってしまったのでメモを残したいと思います。
iOSアプリのディレクトリ構成
Documents/
ユーザーが作成したファイル(画像、動画、音声)やユーザーに見せてもいいファイルを保存する場所。
iOSのファイルアプリから見ることができる(アクセスを許可するためinfo.plistの設定が必要になる)。
このフォルダはiCloudにバックアップされる。
Library/
ユーザーに見せたくないファイルを保存するための場所。
UserDefaultsに保存したデータはここに保存される。
このフォルダはiCloudにバックアップされる(Caches/を除く)。
Library/Caches
キャッシュ用のフォルダ。
tmp/と似たようなものだが、tmp/より長期間保存される。
定期的にシステムに削除される。
このフォルダはiCloudにバックアップされない。
tmp/
一時的にデータを保存するための場所。
アプリ終了時にファイルを削除することを推奨。
アプリの再起動時に保存しているファイルは削除されることを想定して実装することを推奨。
定期的にシステムに削除される。
このフォルダはiCloudにバックアップされない。
ガイドライン
ハマった所
- 起きたこと
作成していたアプリで、起動時のデータ通信量が多くなっていた。 - 原因
tmp/フォルダにファイルを保存していた。
アプリの仕様が、起動時に画像を複数ダウンロードするようになっており、ファイルを
一時保存する場所であるtmp/フォルダに保存するようにしていました。
tmp/フォルダは仕様上、システムがファイルを定期的に削除するため、ダウンロードして
保存していたファイルが定期的に削除されていたことが原因でした。 - 対策
Library/Cachesフォルダにファイルを保存するようにした。
iOSアプリのファイル保存の仕様について調べ、Library/Cachesフォルダも
ファイルが定期的に削除されるがtmp/フォルダと比較して長期間保存されることを知り
ファイルの保存場所をLibrary/Cachesに変更しました。 - 結果
アプリ起動時の画像ダウンロードの頻度とデータ通信量が減った。
ファイル保存場所をtmp/フォルダからLibrary/Cachesフォルダに変更したことで
保存期間が長くなり、結果的にダウンロード頻度が少なくなり通信容量を落とすことができました。
各ディレクトリパスの取得方法
Documents/
// URL型
FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
Library/
// URL型
FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first!
Library/Caches
// URL型
FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!
tmp/
// String型
NSTemporaryDirectory()
まとめ
iOSアプリのファイルシステム仕様について紹介させていただきました。
初めてiOSの開発を行なったため、今回のことでファイルの保存場所にも
決まりがあることを知ることができ勉強になりました。
今後、ファイルの用途によって正しい場所に保存するように気をつけたいと思います!
株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!