はじめに
現在参加しているプロジェクトで、データ保存に関する重要な点に気づくことがありました。ファイルがどこに保存されているかを正確に理解していないと、仕様に合った実装ができず、大きなミスにつながる可能性があると学びましt。この記事では、iOSでファイルがどこに保存されているのか、また、どのようなディレクトリ指定方法があるのかについて説明します。少しでも参考になれば幸いです。
今回は「PathProvider」を使用してディレクトリパスの取得を実装しています。
PathProviderについては下記の記事を参考に理解を深めました。
📌 目次
1. iOSのディレクトリ構成
まずiOSのディレクトリ構成について説明します。
1. Documents/
- ユーザーが作成したファイル(画像、動画、音声)や、ユーザーに見せても良いファイルを保存する場所
- iOSのファイルアプリから閲覧可能(アクセス許可のため
info.plist
の設定が必要)。 - iCloudにバックアップされる。
2. Library/
- ユーザーに見せたくないファイルを保存する場所。
-
UserDefaults
に保存したデータもこのフォルダ内に格納される。 - iCloudにバックアップされる(
Caches/
を除く)。
3. Library/Caches
- キャッシュ用のフォルダ。
-
tmp/
と似ているが、tmp/
より長期間保存される。 - 定期的にシステムによって削除される。
- iCloudにバックアップされない。
4. tmp/
- 一時的なデータ保存用のフォルダ。
- アプリ終了時にファイルを削除することを推奨。
- アプリ再起動時にはファイルが削除される可能性があることを考慮する。
- 定期的にシステムによって削除される。
- iCloudにバックアップされない。
🔗公式サイトリンク
2. アプリの一時保存領域(getTemporaryDirectory()
)
用途
- 一時的なデータ保存(アプリが閉じられると削除される可能性がある)
- iOSでは
tmp/
フォルダに格納される
パスの取得方法
import 'package:path_provider/path_provider.dart';
import 'dart:io';
Future<Directory> getTempDir() async {
return await getTemporaryDirectory();
}
保存例
import 'dart:typed_data';
import 'dart:io';
Future<void> saveTempFile(Uint8List audioData) async {
final tempDir = await getTemporaryDirectory();
File file = File('${tempDir.path}/audio.wav');
await file.writeAsBytes(audioData);
}
3. アプリの永続保存領域(getApplicationDocumentsDirectory()
)
用途
- アプリが削除されるまでデータを保持する
- iOSでは
Documents/
フォルダに格納される
パスの取得方法
Future<Directory> getAppDocDir() async {
return await getApplicationDocumentsDirectory();
}
保存例
Future<void> savePersistentFile(Uint8List audioData) async {
final docDir = await getApplicationDocumentsDirectory();
File file = File('${docDir.path}/audio.wav');
await file.writeAsBytes(audioData);
}
まとめ
-
一時的なデータ保存 ➝
getTemporaryDirectory()
(アプリ終了やシステムにより削除される可能性あり) -
永続的なデータ保存 ➝
getApplicationDocumentsDirectory()
(アプリ削除までデータ保持、iCloudバックアップ対象) -
キャッシュ用途 ➝
Library/Caches
(tmp/
よりも長期間保存可能、iCloudバックアップ対象外) -
完全な一時保存 ➝
tmp/
(アプリ終了時や再起動時に削除される可能性が高い)
アプリのデータ管理を適切に行い、ユーザー体験の向上を目指しましょう!