Flutter ローカルストレージ(Android, iOS)
前提:Anroid, iOSが持つストレージオプション
Androidで利用可能な主なストレージ機能
- 内部ストレージ:
- アプリ専用のファイルシステムにデータをプライベートに保存。
- 他のアプリやユーザーにはアクセスできない。
- 外部ストレージ:
- SDカードや内蔵ストレージの公開領域にデータを保存。
- 他のアプリやユーザーがアクセス可能。
- SharedPreferences:
- キー/値ペアで軽量データを保存。
- 主にユーザー設定やアプリの状態の保存に使用。
- データベース (SQLite):
- アプリ内で構造化データを管理するために使用されるリレーショナルデータベース。
- Room Persistence Library:
- SQLiteの操作を容易にする抽象レイヤー。
- データベースのクエリをシンプルなアノテーションを通じて行うことができる。
- EncryptedSharedPreferences:
- Jetpackセキュリティライブラリの一部で、SharedPreferencesのデータを暗号化して保存。
- Android Keystore System:
- セキュリティが重視される暗号鍵の生成、保管、使用を行うためのシステム。
- セキュアハードウェアに鍵を格納し、アプリからの直接アクセスを防ぐ。
iOSで利用可能な主なストレージ機能
- UserDefaults:
- 軽量なデータをキー/値ペアで保存するためのもの。
- 主にユーザーの設定や状態の保存に使用。
- Core Data:
- 強力なオブジェクトグラフ管理と永続化フレームワーク。
- 複雑なデータ構造の管理と効率的なデータ操作が可能。
- Keychain Services:
- センシティブなデータ(パスワードやトークンなど)を安全に保存するためのセキュアなストレージ。
- 暗号化された形式でデータを保存。
- SQLite:
- 直接的なSQLデータベースアクセスを提供する軽量データベース。
- データの構造化とクエリが可能。
- CloudKit:
- AppleのiCloudを利用してデータをリモートで保存および同期するためのフレームワーク。
- ユーザーのデータをデバイス間で共有や同期が可能。
- ファイルシステム:
- アプリ専用のサンドボックス内にファイルやデータを保存。
- 写真やドキュメントなどの大きなファイルを扱う場合に適する。
- Core Spotlight:
- アプリのコンテンツを検索可能にするために使用されるAPIで、検索インデックスに情報を保存。
よく使うFlutterのストレージパッケージとそれぞれのストレージオプション
SharedPreferences
プラットフォームに依存せずに軽量なデータをキー/値ペアで保存する機能を提供
Android
同名のAndroidのストレージオプション名があり、 SharedPreferences を利用
iOS
iOSには、SharedPreferencesという名前のストレージオプションは存在しないが、同様の機能を実現できるUserDefaultsを利用
FlutterSecureStorage
クロスプラットフォームアプリケーションでセキュリティが強化(暗号化)されたデータの保存を提供
Android
Androidでは、デフォルトで Android Keystore System を利用
EncryptedSharedPreferencesを利用するように設定可能
iOS
iOSでは、Keychain Servicesを利用
補足
アプリ開発を行っていると、ローカルストレージを利用して一部データの永続化をしたいケースが頻発する。
簡易でセンシティブでもないデータであれば、SharedPreferences が有効な選択肢の一つになる。
一方で、ローカルストレージに保存させたいデータとして認証トークンが挙げられるが、これはセンシティブなデータの部類に入るため、特にセキュリティを考慮していないSharedPreferencesは使用に向かない。
そのため、FlutterSecureStorageのような暗号化が伴った保管を実現すべきである。
ただし、FlutterSecureStorageでいうと iOSのストレージオプションとして Keychain Servicesが利用されるため、アプリをアンインストールしてもそこに保存したデータが消えず、アプリを再インストールした際にも読み込めるという副作用がある。
こういった場合は、別途アプリの初回起動を扱うようなロジックの中で適切に削除する必要がある。
補足の補足:
Androidは、Android Keystore Systemに保存されたデータは、アプリをアンインストールした際に削除されることが一般的。(Android 6.0 Marshmallow以降)
※EncryptedSharedPreferences も同様。
Discussion