質問: Swift, ios アプリの開発で、 `UserDefaults.standard.set("hogehoge", forKey: "my-key")` を、設定値の永続化の手段として使ってみようとしています。 その過程で、 UserDefaults の set メソッドを見ていました。 ``` /*! -setObject:forKey: immediately stores a value (or removes the value if nil is passed as the value) for the provided key in the search list entry for the receiver's suite name in the current user and any host, then asynchronously stores the value persistently, where it is made available to other processes. */ open func set(_ value: Any?, forKey defaultName: String) ``` 端的にまとめると、「最初は実行プロセスの中で値を書き換えて、それをそのうち永続化層などに反映するよ、その後は他のプロセスから見えるようになるよ」と書いてあると思っています。 ふと疑問に思ったのが、とあるアプリケーションが設定した default 値は他のアプリから参照できるでしょうか? (できてしまうのでしょうか?) というのも、仮に他のアプリから見えたとすると、一つおかしなアプリをダウンロードしてきて、その挙動のお行儀が悪かったとすると、他のアプリ達にもれなく影響を与えてしまいそうだな、と考えたからです。 ### 質問 * `UserDefaults.standard.set(val, forKey: key)` で保存した設定値は、どの範囲に影響を及ぼしますか?
回答: * ***UserDefaults.standard.set(val, forKey: key) で保存した設定値は、どの範囲に影響を及ぼしますか?*** (通常の)`UserDefaults`により格納される値は、該当アプリケーションからだけ参照できます。(最終的にSandbox保護されたアプリケーション専用の領域にファイルとして永続化されます。) ***とあるアプリケーションが設定した default 値は他のアプリから参照できるでしょうか? (できてしまうのでしょうか?)*** ⇒(通常は)できません。 ※どんな場合が通常でないのかは、下の方まで読んでください。 ***仮に他のアプリから見えたとすると、一つおかしなアプリをダウンロードしてきて、その挙動のお行儀が悪かったとすると、他のアプリ達にもれなく影響を与えてしまいそうだ*** iOSアプリケーションなどで言われる「Sandbox保護」と言うのはアプリケーション間で、可能な限り、そう言った「他のアプリたちにもれなく影響を与えて」しまうのを防ぐ仕組みだと思ってもらうと良いでしょう。その分、iOSでは複数のアプリでデータを共有したり、協調動作したりするのが難しくなっており、極めて少数の限られたAPIを通じてのみデータの共有や協調動作ができるようになっています。(通常の)`UserDefaults`は、その極めて少数には入っておらず、アプリケーションごとに独立です。 `UserDefaults` =================================================================================== (抜粋) > > Sandbox Considerations > ---------------------- > > > A sandboxed app cannot access or modify the preferences for any other > > app, with the following exceptions: > > > * App extensions on macOS and iOS > * Other apps in your application group on macOS > > > (拙訳) > > Sandbox環境での考慮事項 > --------------- > > > Sandbox保護されたアプリでは、以下の例外を除き、他のいかなるアプリの設定(訳注:`UserDefaults`は「設定」の保存を主な用途と想定しているので、これは`UserDefaults`の保存内容だと思ってください)を参照することも変更することもできません。 > > > * macOSとiOSのアプリ拡張 > * macOSのアプリグループ内の他のアプリ (訳注:明記されていませんが、iOSにもアプリグループの概念があります) > > > アプリグループの機能は同じデベロッパー内のアプリでしか使用できないようになっていますが、同じアプリグループに所属するアプリの中で、「その挙動のお行儀が悪かった」ものがあったとすると、「他のアプリ達に」「影響を与えて」しまう可能性はあります。が、「もれなく」ではないので、それはそのデベロッパーの責任ということになるでしょう。 (アプリグループによる`UserDefaults`の共有に関しては、日本語の良記事がすぐに見つかりますので、興味がお有りならば検索してみてください。)