iOSシミュレーターのフォルダ構成

f:id:bamboohero:20210520092200p:plain iOSアプリでファイルを扱う処理を書くときに、iOSシミュレーターのフォルダ構成について知っておくと便利です。

本記事ではiOSシミュレーターのフォルダ構成について説明します。

iOSシミュレーターのフォルダ構成

iOSアプリのフォルダ構成については公式ドキュメントで下図のように説明されています。iOSアプリにはSandboxという概念があり、セキュリティの観点からアプリはSandbox外のディレクトリにはアクセスできないようになっています。

f:id:bamboohero:20210501064614p:plain:w500
https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html#//apple_ref/doc/uid/TP40010672-CH2-SW2

上図が実際のファイルシステム上ではどう構成されているのでしょうか?iOSシミュレーターのフォルダを見てみます。

シミュレーターのフォルダは以下パスに存在しています。

~/Library/Developer/CoreSimulator/Devices/<SimulatorUUID>

f:id:bamboohero:20210501070100p:plain

各シミュレーターにはUUIDが割り当てられていて、それらはXcodeのシミュレーター一覧画面で確認できます。例えばiPhone12(iOS14.5)のUUIDは97206822-...です(UUIDは環境によって変わります)。

f:id:bamboohero:20210501070226p:plain

では、iPhone12(iOS14.5)シミュレーターのフォルダを見てみます。パスは

~/Library/Developer/CoreSimulator/Devices/97206822-70C1-404B-876E-6F34A65DCA35/data

です。

f:id:bamboohero:20210501070550p:plain

公式ドキュメントの図に照らし合わせるとこんな感じです。ここでは例としてBambooApp.appがインストールされているものとします。

  • Bundle Container: /Containers/Bundle
    • アプリBundle: /Containers/Bundle/Application/<AppID>/BambooApp.app
  • Data Container: /Containers/Data
    • Documents: /Containers/Data/Application/<AppID>/Documents
    • Library: /Containers/Data/Application/<AppID>/Library

<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を右クリックして、「パッケージの内容を表示」をクリックします。

f:id:bamboohero:20210501075046p:plain

すると、Bundle内にhoge.txtが存在しています。Bundle内のリソースファイルにアクセスするとはまさにそのままの意味だったんですね。

f:id:bamboohero:20210501075131p:plain:w250

まとめ

iOSシミュレーターのフォルダ構成と、Bundleについて説明しました。

今回は基本的なフォルダの話だけでしたが、本記事をきっかけに色々とフォルダの中を探っていくと面白いと思います。

iOSについて奥深く知っていくと楽しいですね。