この記事について
- UserDefaultsの操作方法の記事は多いんですが、「UserDefaultsってそもそも何なのか?」をズバンと説明してくれる記事が見つからなかったので、調べて書きました
- UserDefaultsの概念を説明する記事です。
- UserDefaultsのCRUD操作の実装方法が知りたい方は、別記事をあたってください
- 筆者の知識レベルは、何度か使ったことがあるレベルです
UserDefaultsとは
-
公式ドキュメント
を要約すると、「アプリの終了後も消えてほしくない永続データを、保存するDBにアクセスするためのプログラミング上のインターフェイス」 - ⇒インターフェイス、というと途端にイメージしづらいが、言葉を代えるならアクセス手法。
- DBの実体については後述する。
- < Key, Value >形式の辞書型でアクセスできる。
- 1つのiOSアプリは、1端末に対して1つの UserDefaultsを持っている
- 多人数で1つの端末を利用する場合は、NSUbiquitousKeyValueStoreの利用が推奨されている(iCloudに保存)
- アプリを削除すると、UserDefaultsも消える
想定されている使い方
以上がUserDefaultsの端的な説明ですが、どういうときに使うべきなんでしょうか?
基本的にはユーザーの設定情報(Preferences)を保存する場所です。
そのアプリのみで使う、かつ永続的に保存する設定情報の保存場所です。
UIの設計方針(ちょっと脱線)
下記のAppleのアーカイブ文書によれば、
Preferences and Settings Programming Guide(About the User Defaults System)
Preference | iOS | OS X |
---|---|---|
Frequently changed preferences | Custom UI | Custom UI |
Infrequently changed preferences | Settings bundle | Custom UI |
よく変更する設定の例としては、音量やゲームのコントローラー設定。
あまり変更しない設定の例としては、メールアドレスやメールサーバの設定情報など。
Mac OSのアプリならば、あまり変更しない設定であっても、設定画面から参照可能にすべき。
iOSなら、あまり変更しない設定は、iPhoneの「設定」からいけるようにするのが推奨です。
(こちらより転載)
こんな感じです。
設定情報のドメイン
英文理解しきれてないですが、Appleは設定情報を5階層のドメインにわけています。
- The Argument Domain
- The Application Domain
- The Global Domain
- The Languages Domains
- The Registration Domain
1から順に検索していくみたいなので、重複があるとたぶん上位が優先されます。
UserDefaultsを使ってデータを保存すると、2番扱いになります。
The Registration Domain(登録層?)は、揮発性のデータということなのですが、具体的に何を指しているのかよくわかってないです。
ファイルの実体
UserDefaultsの実体がどうしても気になったので、下記の記事を参考に追ってみました。
DBの実体は、「< ApplicationBundleIdentifer >.plist」という名前のplistファイルです。
自分のアプリのBundleIDは、Xcode上で自分のプロジェクトファイルを選択すると見れます。
捜索は結構難航しましたが、僕の環境だと、下記にありました。
ちなみに実機でデバッグした際に作成したものなので、シミュレータだとまた別の場所にあるかもしれません。
/Users/< Username >/Library/Developer/CoreSimulator/Devices/< Device ID >/data/Containers/Data/Application/ < 謎ID >/Library/Preferences/< Bundle ID >.plist
Applicationの下で、ID別のディレクトリがあったんですが、これが何のIDなのか謎です。
(アプリケーションごとのIDなんですかね?)
ネストがとにかく深いのと、Applicationの下のIDが何なのかわからず、まあまあな数あるので、下記のコマンドを使って特定しました。
cd /Users/< Username >/Library/Developer/CoreSimulator/Devices/< Device ID >/data/Containers/Data/Application
find ./ -name *.plist
こんな感じでファイルの実体が見られるので、試してはいませんが、やろうと思えばUserDefaultsではなく、
直でパスを指定してアクセスして、強引に書き込むのも可能と思われますが、当然Apple非推奨です。
You should not modify this file directly but can inspect it during debugging to make sure preference values are being written by your app.