iOSアプリでファイルを扱う処理を書くときに、iOSシミュレーターのフォルダ構成について知っておくと便利です。
本記事ではiOSシミュレーターのフォルダ構成について説明します。
iOSシミュレーターのフォルダ構成
iOSアプリのフォルダ構成については公式ドキュメントで下図のように説明されています。iOSアプリにはSandboxという概念があり、セキュリティの観点からアプリはSandbox外のディレクトリにはアクセスできないようになっています。
上図が実際のファイルシステム上ではどう構成されているのでしょうか?iOSシミュレーターのフォルダを見てみます。
シミュレーターのフォルダは以下パスに存在しています。
~/Library/Developer/CoreSimulator/Devices/<SimulatorUUID>
各シミュレーターにはUUIDが割り当てられていて、それらはXcodeのシミュレーター一覧画面で確認できます。例えばiPhone12(iOS14.5)のUUIDは97206822-...
です(UUIDは環境によって変わります)。
では、iPhone12(iOS14.5)シミュレーターのフォルダを見てみます。パスは
~/Library/Developer/CoreSimulator/Devices/97206822-70C1-404B-876E-6F34A65DCA35/data
です。
公式ドキュメントの図に照らし合わせるとこんな感じです。ここでは例としてBambooApp.app
がインストールされているものとします。
- Bundle Container:
/Containers/Bundle
- アプリBundle:
/Containers/Bundle/Application/<AppID>/BambooApp.app
- アプリBundle:
- Data Container:
/Containers/Data
- Documents:
/Containers/Data/Application/<AppID>/Documents
- Library:
/Containers/Data/Application/<AppID>/Library
- Documents:
<AppID>
はどういうルールで決まるのかわからないのですが、アプリ実行時に設定される環境変数HOME
から知ることができます。デバッグコンソールで見てみると良いでしょう。
(lldb) po ProcessInfo.processInfo.environment["HOME"] ▿ Optional<String> - some : "/Users/<user>/Library/Developer/CoreSimulator/Devices/97206822-70C1-404B-876E-6F34A65DCA35/data/Containers/Data/Application/FB4B4575-79B0-4723-B488-992BD260CDB3"
なお、AppIDはアプリをインストールするごとに変わります。Documentsフォルダ内のファイルはアプリをインストールしても残るようでした。
※HOME
でわかるのはData ContainerのAppIDであり、Bundle ContainerのAppIDを知る方法はわかりませんでした
Bundleについて
Xcodeプロジェクト内に保存されたリソースファイルにアクセスするときには、例えば以下のようなコードを書きますよね。
let url = Bundle.main.url(forResource: "hoge", withExtension: "txt")! let data = try! Data(contentsOf: url) let str = String(data: data, encoding: .utf8)! print(str)
Bundle内のファイルにアクセスするという意味ですが、今まではBundleが何なのかよくわからずこのコードを書いていました。
ですが、今回Bundleを実際に見てみることで意味がわかりました!
FinderでBambooApp.appつまりBundleの中身を見てみましょう。BambooApp.appを右クリックして、「パッケージの内容を表示」をクリックします。
すると、Bundle内にhoge.txtが存在しています。Bundle内のリソースファイルにアクセスするとはまさにそのままの意味だったんですね。
まとめ
iOSシミュレーターのフォルダ構成と、Bundleについて説明しました。
今回は基本的なフォルダの話だけでしたが、本記事をきっかけに色々とフォルダの中を探っていくと面白いと思います。
iOSについて奥深く知っていくと楽しいですね。