LoginSignup
16
10

More than 3 years have passed since last update.

iOSアプリにおけるUserDefaultsとはそもそも何なのか

Posted at

この記事について

  • 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の「設定」からいけるようにするのが推奨です。

image.png
こちらより転載)

こんな感じです。

設定情報のドメイン

英文理解しきれてないですが、Appleは設定情報を5階層のドメインにわけています。

  1. The Argument Domain
  2. The Application Domain
  3. The Global Domain
  4. The Languages Domains
  5. The Registration Domain

1から順に検索していくみたいなので、重複があるとたぶん上位が優先されます。
UserDefaultsを使ってデータを保存すると、2番扱いになります。
The Registration Domain(登録層?)は、揮発性のデータということなのですが、具体的に何を指しているのかよくわかってないです。

ファイルの実体

UserDefaultsの実体がどうしても気になったので、下記の記事を参考に追ってみました。

NSUserDefaultsの保存場所

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.

16
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
10