iOSシミュレータのフォルダの内容


Xcode 8.3と一緒にインストールされるiOSシミュレータのフォルダの内容について調べてみました。以前のバージョンのXcodeや以降の新しいXcodeではどうなっているのか分かりません。

## フォルダの場所

ここに配置されます。

    ~/Library/Developer/CoreSimulator/Devices/

## フォルダ1階層目(ルートフォルダ)の内容

    ~/Library/Developer/CoreSimulator/Devices/*

Xcodeの「Devices」ウィンドウにある「SIMULATORS」グループに登録されているデバイスと同じものが、Identifierの値(UUID)がフォルダ名となって存在します。ペアリングされたApple WatchはXcodeの「Devices」ウィンドウでは直接表示されていませんが、このフォルダにはフラットに配置されています。

デバイスごとのフォルダの他に、device_set.plistというファイルも配置されます。この階層の全てのファイルを削除して改めてシミュレータのデバイスを登録する際に、ペアリングするデバイスを指定しなかった場合はこのファイルは作成されなかったので、ペアリングされたデバイスを一つでも登録すると自動的に作成されるようです。

隠しファイルで、.default_created.plistというファイルも配置されます。内容的にはdevice_set.plistのDefaultDevicesキーの下の階層と同じものっぽいです。

### device_set.plistの内容

テキストファイルで、フォーマットはプロパティリスト形式です。

- "DefaultDevices"
   - "com.apple.CoreSimulator.SimRuntime.iOS-(OSバージョン)"
      - "com.apple.CoreSimulator.SimDeviceType.(モデル名)" = "謎のUUID"
   - "version" = 0
- "DevicePairs"
   - ペアリングのUUID
      - "active" = true 謎の論理値
      - "companion" = "ペアリングしているiPhoneデバイスのUUID"
      - "gizmo" = "ペアリングしているWatchデバイスのUUID"

(OSバージョン)はピリオドがハイフンに置き換えられています。
(モデル名)はピリオドと空白がハイフンに置き換えられています。

## フォルダ2階層目(デバイスUUIDフォルダ)の内容

    ~/Library/Developer/CoreSimulator/Devices/(デバイスUUID)/*

dataフォルダとdevice.plistというファイルが配置されます。

### device.plistの内容

テキストファイルで、フォーマットはプロパティリスト形式です。

- "UDID" = フォルダのUUIDと同じ値(デバイスのUUID)
- "deviceType" = "com.apple.CoreSimulator.SimDeviceType.(モデル名)"
- "name" = "Xcodeの「Devices」ウィンドウに表示されているユーザーが変更可能な名前"
- "runtime" = "com.apple.CoreSimulator.SimRuntime.iOS-(OSバージョン)"
- "state" = 1(Show In Run Destinations Menuを選択) もしくは、このキー自体が存在しない(未選択)

## フォルダ3階層目(dataフォルダ)の内容

    ~/Library/Developer/CoreSimulator/Devices/(デバイスUUID)/data/*

以下のフォルダが配置されます。

- Containers ... アプリとアプリのデータが配置されています。
- Documents ... 未解析です。
- Downloads ... 未解析です。
- Library ... 未解析です。アップルのアプリが使うデータらしきものが配置されています。
- Media ... 未解析です。アップルの写真アプリが使う写真とか動画らしきものが配置されています。
- Root ... 未解析です。
- private ... 未解析です。
- tmp ... 未解析です。一時作業フォルダっぽいです。
- var ... 未解析です。一時作業フォルダっぽいです。が、シミュレータの起動パラメータっぽいファイル(var/run/launchd_bootstrap.plist)が配置されています。

## フォルダ4階層目(Containersフォルダ)の内容

    ~/Library/Developer/CoreSimulator/Devices/(デバイスUUID)/data/Containers/*

以下のフォルダが配置されます。

- Bundle ... アプリと関連するライブラリやプラグインが配置されています。
- Data ... アプリのデータが配置されています。
- Shared ... 未解析です。

## フォルダ5階層目(Bundleフォルダ)の内容

    ~/Library/Developer/CoreSimulator/Devices/(デバイスUUID)/data/Containers/Bundle/*

以下のフォルダが配置されます。

- Application ... アプリが配置されています。
- Framework ... 未解析です。
- PluginKitPlugin ... 未解析です。
- VPNPlugin ... 未解析です。

## フォルダ6階層目(Applicationフォルダ)の内容

    ~/Library/Developer/CoreSimulator/Devices/(デバイスUUID)/data/Containers/Bundle/Application/*

シミュレータにインストールされているアプリごとにUUIDが付与されて、その名前でフォルダになっています。

## フォルダ7階層目(アプリUUIDフォルダ)の内容

    ~/Library/Developer/CoreSimulator/Devices/(デバイスUUID)/data/Containers/Bundle/Application/(アプリUUID)/*

iOSアプリが (プロジェクト名).app で配置されています。これはフォルダですがアプリケーションバンドルでもあります。このアプリケーションバンドルの構造については、[公式ドキュメント](https://developer.apple.com/library/content/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html)で解説されています。

隠しファイルで、.com.apple.mobile_container_manager.metadata.plistというファイルも配置されます。

### .com.apple.mobile_container_manager.metadata.plistの内容

バイナリファイルで、フォーマットはプロパティリスト形式です。

- "MCMMetadataUUID" = 謎のUUID
- "MCMMetadataIdentifier" = "(アプリのBundle Identifier)"
- "MCMMetadataContentClass" = 1 謎の数値
- "MCMMetadataInfo" = 謎の辞書
- "MCMMetadataPersona" = 謎の数値

## フォルダ5階層目(Dataフォルダ)の内容

    ~/Library/Developer/CoreSimulator/Devices/(デバイスUUID)/data/Containers/Data/*

以下のフォルダが配置されます。

- Application ... アプリのデータが配置されています。
- InternalDaemon ... 未解析です。
- PluginKitPlugin ... 未解析です。
- System ... 未解析です。
- TempDir ... 未解析です。
- VPNPlugin ... 未解析です。
- XPCService ... 未解析です。

## フォルダ6階層目(Applicationフォルダ)の内容

    ~/Library/Developer/CoreSimulator/Devices/(デバイスUUID)/data/Containers/Data/Application/*

シミュレータにインストールされているアプリのデータごとにUUIDが付与されて、その名前でフォルダになっています。ユーザの作成したアプリの他にアップルのアプリが使うデータも一緒に配置されています。

## フォルダ7階層目(アプリUUIDフォルダ)の内容

    ~/Library/Developer/CoreSimulator/Devices/(デバイスUUID)/data/Containers/Data/Application/(アプリデータUUID)/*

以下のフォルダが配置されます。

- Documents ... いわゆるドキュメントフォルダです。
- Library ... 未解析です。キャッシュフォルダとアプリ設定フォルダが配置されているようです。
- tmp ... 未解析です。一時作業フォルダっぽいです。

隠しファイルで、.com.apple.mobile_container_manager.metadata.plistというファイルも配置されます。

### .com.apple.mobile_container_manager.metadata.plistの内容

バイナリファイルで、フォーマットはプロパティリスト形式です。

- "MCMMetadataUUID" = 謎のUUID
- "MCMMetadataIdentifier" = "(アプリのBundle Identifier)"
- "MCMMetadataContentClass" = 2 謎の数値
- "MCMMetadataInfo" = 謎の辞書
- "MCMMetadataPersona" = 謎の数値

# おまけ

上記の解析結果を使って、SwiftでMac用のアプリを作りました。(実はこれが本題)

## SimFolderOpener

This application will help you to open application document folder in the iOS Simulator.

![SimFolderOpener Screenshot](https://github.com/ura14h/SimFolderOpener/raw/master/Screenshots/Devices.jpg)

iOSシミュレータにインストールしたアプリケーションのデータフォルダを開くのをお手伝いするアプリ。ソースコードを [GitHub](https://github.com/ura14h/SimFolderOpener) からダウンロードできます。

その後、自分が作ったアプリよりももっと素晴らしい [SimPholders](https://www.kf-interactive.com/apps/) というアプリを発見しました。 Oh...

おしまい。