├── .eslintrc ├── .github ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE.md ├── dependabot.yml └── workflows │ └── node.js.yml ├── .gitignore ├── .npmrc ├── LICENSE ├── README.md ├── babel.config.js ├── bin ├── ios-sim └── ios-sim.cmd ├── main.js ├── package-lock.json ├── package.json ├── src ├── BaseCommand.js ├── commands │ ├── install.js │ ├── launch.js │ ├── showdevicetypes.js │ ├── showsdks.js │ └── start.js ├── helpers.js ├── index.js └── index.legacy.js └── test ├── BaseCommand.test.js ├── commands ├── install.test.js ├── launch.test.js ├── showdevicetypes.test.js ├── showsdks.test.js └── start.test.js ├── fixtures ├── issue-234 │ ├── showdevicetypes.txt │ └── simctl-list.json ├── issue-262 │ ├── showdevicetypes.txt │ ├── showsdks.txt │ └── simctl-list.json ├── showdevicetypes.txt ├── showsdks.txt └── simctl-list.json ├── helpers.test.js ├── index.legacy.test.js ├── index.test.js └── jest.setup.js /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true, 4 | "es6": true, 5 | "jest": true 6 | }, 7 | "parserOptions": { 8 | "ecmaVersion": 2018 9 | }, 10 | "plugins": [ 11 | "jest" 12 | ], 13 | "extends": [ 14 | "plugin:jest/recommended", 15 | "standard" 16 | ], 17 | "rules": { 18 | "no-var": 2, 19 | "camelcase": 0 20 | }, 21 | "globals": { 22 | "fixtureFile": true, 23 | "fixtureJson": true, 24 | "fakeFileSystem": true 25 | } 26 | } -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Contributing to ios-sim 2 | 3 | Github url: 4 | 5 | https://github.com/phonegap/ios-sim 6 | 7 | Git clone url: 8 | 9 | https://github.com/phonegap/ios-sim.git 10 | 11 | ## Filing an issue 12 | 13 | Please run the commands below in your Terminal.app and include it in the issue: 14 | 15 | ``` 16 | 1. sw_vers -productVersion 17 | 2. ios-sim --version 18 | 3. xcodebuild -version 19 | 4. xcode-select --print-path 20 | 5. gcc --version 21 | ``` 22 | Also include **command line arguments** you used for ios-sim. 23 | 24 | 25 | ## Sending a Pull Request 26 | 27 | Please **create a topic branch** for your issue before submitting your pull request. You will be asked to re-submit if your pull request contains unrelated commits. 28 | 29 | Please elaborate regarding the problem the pull request is supposed to solve, and perhaps also link to any relevant issues the pull request is trying to fix. -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ## MUST READ BEFORE YOU FILE (DELETE THIS SECTION BEFORE FILING) 2 | 3 | Include the **command line arguments** you used for ios-sim. 4 | 5 | Don't forget to check out the [README](https://github.com/phonegap/ios-sim/blob/master/README.md) before filing this issue, to see if there are any known issues. 6 | 7 | # Expected behavior 8 | 9 | 10 | # Actual behavior. 11 | 12 | 13 | # Steps to reproduce the problem 14 | 15 | 16 | # System Specs 17 | 18 | Please run the commands below in your Terminal.app and include it in the issue. Check when done and include results below. 19 | 20 | - [ ] 1. system_profiler SPSoftwareDataType 21 | - [ ] 2. ios-sim --version 22 | - [ ] 3. xcodebuild -version 23 | - [ ] 4. xcode-select --print-path 24 | - [ ] 5. node --version 25 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "npm" 9 | directory: "/" 10 | schedule: 11 | interval: "weekly" 12 | -------------------------------------------------------------------------------- /.github/workflows/node.js.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: Node.js CI 5 | 6 | on: 7 | push: 8 | branches: [ master ] 9 | pull_request: 10 | branches: [ master ] 11 | 12 | jobs: 13 | build: 14 | runs-on: ${{ matrix.os }} 15 | strategy: 16 | matrix: 17 | node-version: [16.x] 18 | os: [ubuntu-latest] 19 | 20 | steps: 21 | - uses: actions/checkout@v2 22 | with: 23 | fetch-depth: 0 24 | - name: Use Node.js ${{ matrix.node-version }} 25 | uses: actions/setup-node@v1 26 | with: 27 | node-version: ${{ matrix.node-version }} 28 | - run: npm i --package-lock --package-lock-only 29 | - run: npm ci 30 | - run: npm run build --if-present 31 | - run: npm test 32 | - name: upload coverage 33 | if: success() 34 | uses: codecov/codecov-action@v3.1.1 35 | with: 36 | name: ${{ runner.os }} node.js ${{ matrix.node-version }} 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | /coverage 4 | /junit.xml 5 | /oclif.manifest.json 6 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | tag-version-prefix="" -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![NPM](https://nodei.co/npm/ios-sim.png?compact=true)](https://nodei.co/npm/ios-sim/) 2 | [![Build status](https://ci.appveyor.com/api/projects/status/xh7auct40k5oxwjg/branch/master?svg=true 3 | )](https://ci.appveyor.com/project/shazron/ios-sim-bn5fo) 4 | [![Build Status](https://travis-ci.org/ios-control/ios-sim.svg?branch=master)](https://travis-ci.org/ios-control/ios-sim) 5 | [![Codecov Coverage](https://img.shields.io/codecov/c/github/ios-control/ios-sim/master.svg?style=flat-square)](https://codecov.io/gh/ios-control/ios-sim/) 6 | 7 | ios-sim 8 | ========== 9 | 10 | 11 | 12 | * [Usage](#usage) 13 | * [Commands](#commands) 14 | 15 | # Usage 16 | 17 | ```sh-session 18 | $ npm install -g ios-sim 19 | $ ios-sim COMMAND 20 | running command... 21 | $ ios-sim (-v|--version|version) 22 | ios-sim/9.0.0 darwin-x64 node-v10.18.1 23 | $ ios-sim --help [COMMAND] 24 | USAGE 25 | $ ios-sim COMMAND 26 | ... 27 | ``` 28 | 29 | # Commands 30 | 31 | * [`ios-sim install APPLICATIONPATH`](#ios-sim-install-applicationpath) 32 | * [`ios-sim launch APPLICATIONPATH`](#ios-sim-launch-applicationpath) 33 | * [`ios-sim showdevicetypes`](#ios-sim-showdevicetypes) 34 | * [`ios-sim showsdks`](#ios-sim-showsdks) 35 | * [`ios-sim start`](#ios-sim-start) 36 | 37 | ## `ios-sim install APPLICATIONPATH` 38 | 39 | Install the application at the specified path to the iOS Simulator without launching the app 40 | 41 | ``` 42 | USAGE 43 | $ ios-sim install APPLICATIONPATH 44 | 45 | ARGUMENTS 46 | APPLICATIONPATH the path to the application to launch 47 | 48 | OPTIONS 49 | -d, --devicetypeid=devicetypeid The id of the device type that should be simulated (Xcode6+). Use 'showdevicetypes' 50 | to list devices. 51 | 52 | -l, --log=log The path where log of the app running in the Simulator will be redirected to 53 | 54 | -v, --verbose Enable verbose output 55 | 56 | -x, --exit Exit after startup 57 | 58 | --debug=debug Debug level output 59 | ``` 60 | 61 | _See code: [src/commands/install.js](https://github.com/ios-control/ios-sim/blob/v9.0.0/src/commands/install.js)_ 62 | 63 | ## `ios-sim launch APPLICATIONPATH` 64 | 65 | Launch the application at the specified path in the iOS Simulator 66 | 67 | ``` 68 | USAGE 69 | $ ios-sim launch APPLICATIONPATH 70 | 71 | ARGUMENTS 72 | APPLICATIONPATH the path to the application to launch 73 | 74 | OPTIONS 75 | -a, --args=args arguments to pass in to the launched app 76 | 77 | -d, --devicetypeid=devicetypeid The id of the device type that should be simulated (Xcode6+). Use 'showdevicetypes' 78 | to list devices. 79 | 80 | -l, --log=log The path where log of the app running in the Simulator will be redirected to 81 | 82 | -s, --setenv=setenv environment variables to pass in as key value pairs 83 | 84 | -v, --verbose Enable verbose output 85 | 86 | -x, --exit Exit after startup 87 | 88 | --debug=debug Debug level output 89 | ``` 90 | 91 | _See code: [src/commands/launch.js](https://github.com/ios-control/ios-sim/blob/v9.0.0/src/commands/launch.js)_ 92 | 93 | ## `ios-sim showdevicetypes` 94 | 95 | List the available device types 96 | 97 | ``` 98 | USAGE 99 | $ ios-sim showdevicetypes 100 | 101 | OPTIONS 102 | -l, --log=log The path where log of the app running in the Simulator will be redirected to 103 | -v, --verbose Enable verbose output 104 | -x, --exit Exit after startup 105 | --debug=debug Debug level output 106 | ``` 107 | 108 | _See code: [src/commands/showdevicetypes.js](https://github.com/ios-control/ios-sim/blob/v9.0.0/src/commands/showdevicetypes.js)_ 109 | 110 | ## `ios-sim showsdks` 111 | 112 | List the available iOS SDK versions 113 | 114 | ``` 115 | USAGE 116 | $ ios-sim showsdks 117 | 118 | OPTIONS 119 | -l, --log=log The path where log of the app running in the Simulator will be redirected to 120 | -v, --verbose Enable verbose output 121 | -x, --exit Exit after startup 122 | --debug=debug Debug level output 123 | ``` 124 | 125 | _See code: [src/commands/showsdks.js](https://github.com/ios-control/ios-sim/blob/v9.0.0/src/commands/showsdks.js)_ 126 | 127 | ## `ios-sim start` 128 | 129 | Launch the iOS Simulator without an app 130 | 131 | ``` 132 | USAGE 133 | $ ios-sim start 134 | 135 | OPTIONS 136 | -d, --devicetypeid=devicetypeid The id of the device type that should be simulated (Xcode6+). Use 'showdevicetypes' 137 | to list devices. 138 | 139 | -l, --log=log The path where log of the app running in the Simulator will be redirected to 140 | 141 | -v, --verbose Enable verbose output 142 | 143 | -x, --exit Exit after startup 144 | 145 | --debug=debug Debug level output 146 | ``` 147 | 148 | _See code: [src/commands/start.js](https://github.com/ios-control/ios-sim/blob/v9.0.0/src/commands/start.js)_ 149 | 150 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | // babel.config.js 2 | module.exports = { 3 | presets: [ 4 | [ 5 | '@babel/preset-env', 6 | { 7 | targets: { 8 | node: 'current' 9 | } 10 | } 11 | ] 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /bin/ios-sim: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /* 4 | Copyright 2018 Adobe. All rights reserved. 5 | This file is licensed to you under the Apache License, Version 2.0 (the "License"); 6 | you may not use this file except in compliance with the License. You may obtain a copy 7 | of the License at http://www.apache.org/licenses/LICENSE-2.0 8 | Unless required by applicable law or agreed to in writing, software distributed under 9 | the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS 10 | OF ANY KIND, either express or implied. See the License for the specific language 11 | governing permissions and limitations under the License. 12 | */ 13 | 14 | require('@oclif/command').run() 15 | .catch(require('@oclif/errors/handle')) 16 | -------------------------------------------------------------------------------- /bin/ios-sim.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | rem Copyright 2018 Adobe. All rights reserved. 4 | rem This file is licensed to you under the Apache License, Version 2.0 (the "License"); 5 | rem you may not use this file except in compliance with the License. You may obtain a copy 6 | rem of the License at http://www.apache.org/licenses/LICENSE-2.0 7 | rem 8 | rem Unless required by applicable law or agreed to in writing, software distributed under 9 | rem the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS 10 | rem OF ANY KIND, either express or implied. See the License for the specific language 11 | rem governing permissions and limitations under the License. 12 | 13 | node "%~dp0\run" %* 14 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./src/index') 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ios-sim", 3 | "version": "9.0.0", 4 | "preferGlobal": true, 5 | "description": "launch iOS apps into the iOS Simulator from the command line (Xcode 8.0+)", 6 | "main": "main.js", 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/ios-control/ios-sim" 10 | }, 11 | "engines": { 12 | "node": ">=8" 13 | }, 14 | "keywords": [ 15 | "ios-sim", 16 | "iOS Simulator" 17 | ], 18 | "bin": { 19 | "ios-sim": "./bin/ios-sim" 20 | }, 21 | "bugs": { 22 | "url": "https://github.com/ios-control/ios-sim/issues" 23 | }, 24 | "author": "Shazron Abdullah", 25 | "license": "Apache-2.0", 26 | "files": [ 27 | "/oclif.manifest.json", 28 | "/src", 29 | "/bin" 30 | ], 31 | "oclif": { 32 | "commands": "./src/commands", 33 | "bin": "ios-sim", 34 | "devPlugins": [ 35 | "@oclif/plugin-help" 36 | ] 37 | }, 38 | "dependencies": { 39 | "@oclif/command": "^1.5.18", 40 | "@oclif/config": "^1.13.3", 41 | "@oclif/errors": "^1.2.2", 42 | "@oclif/plugin-help": "^2.2.1", 43 | "bplist-parser": "^0.2.0", 44 | "debug": "^4.1.1", 45 | "nopt": "^4.0.1", 46 | "plist": "^3.0.1", 47 | "simctl": "^2.0.0" 48 | }, 49 | "devDependencies": { 50 | "@babel/compat-data": "^7.21.4", 51 | "@babel/core": "^7.5.5", 52 | "@babel/preset-env": "^7.5.5", 53 | "@babel/runtime": "^7.5.5", 54 | "@oclif/dev-cli": "^1.22.2", 55 | "@oclif/test": "^1.2.5", 56 | "acorn": "^7.0.0", 57 | "babel-jest": "^24.9.0", 58 | "eol": "^0.9.1", 59 | "eslint": "8", 60 | "eslint-config-oclif": "^4", 61 | "eslint-config-standard": "^17", 62 | "eslint-plugin-jest": "^27", 63 | "eslint-plugin-node": "^11", 64 | "eslint-plugin-promise": "^6", 65 | "jest": "^29", 66 | "jest-junit": "^16", 67 | "mock-fs": "^4.10.1", 68 | "stdout-stderr": "^0.1.9" 69 | }, 70 | "scripts": { 71 | "test": "npm run unit-tests", 72 | "posttest": "npm run eslint", 73 | "unit-tests": "jest --ci", 74 | "eslint": "eslint src test", 75 | "prepack": "oclif-dev manifest && oclif-dev readme", 76 | "postpack": "rm -f oclif.manifest.json", 77 | "version": "oclif-dev readme && git add README.md" 78 | }, 79 | "jest": { 80 | "collectCoverage": true, 81 | "collectCoverageFrom": [ 82 | "src/**/*.js" 83 | ], 84 | "testPathIgnorePatterns": [ 85 | "/jest.setup.js" 86 | ], 87 | "reporters": [ 88 | "default", 89 | "jest-junit" 90 | ], 91 | "testEnvironment": "node", 92 | "setupFilesAfterEnv": [ 93 | "./test/jest.setup.js" 94 | ] 95 | }, 96 | "publishConfig": { 97 | "access": "public" 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /src/BaseCommand.js: -------------------------------------------------------------------------------- 1 | const { Command, flags } = require('@oclif/command') 2 | const debug = require('debug') 3 | 4 | class BaseCommand extends Command { 5 | async init () { 6 | const { flags } = this.parse(this.constructor) 7 | 8 | // See https://www.npmjs.com/package/debug for usage in commands 9 | if (flags.verbose) { 10 | // verbose just sets the debug filter to everything (*) 11 | debug.enable('*') 12 | } else if (flags.debug) { 13 | debug.enable(flags.debug) 14 | } 15 | } 16 | 17 | handleError (msg, err) { 18 | const { flags } = this.parse(this.constructor) 19 | 20 | msg = msg || 'unknown error' 21 | if (err) { 22 | msg = `${msg}: ${err.message}` 23 | 24 | if (flags.verbose) { 25 | debug.log(err) // for stacktrace when verbose 26 | } 27 | } 28 | return this.error(msg) 29 | } 30 | } 31 | 32 | BaseCommand.flags = { 33 | debug: flags.string({ 34 | description: 'Debug level output' 35 | }), 36 | verbose: flags.boolean({ 37 | char: 'v', 38 | description: 'Enable verbose output' 39 | }), 40 | exit: flags.boolean({ 41 | char: 'x', 42 | description: 'Exit after startup' 43 | }), 44 | log: flags.string({ 45 | char: 'l', 46 | description: 'The path where log of the app running in the Simulator will be redirected to' 47 | }) 48 | } 49 | 50 | module.exports = BaseCommand 51 | -------------------------------------------------------------------------------- /src/commands/install.js: -------------------------------------------------------------------------------- 1 | const BaseCommand = require('../BaseCommand') 2 | const { getDeviceFromDeviceTypeId } = require('../helpers') 3 | const { flags } = require('@oclif/command') 4 | const fs = require('fs') 5 | const path = require('path') 6 | const bplist = require('bplist-parser') 7 | const simctl = require('simctl') 8 | 9 | class InstallCommand extends BaseCommand { 10 | async run () { 11 | // lib.install(app_path, args.devicetypeid, args.log, args.exit) 12 | const { args, flags } = this.parse(InstallCommand) 13 | 14 | const info_plist_path = path.join(args.applicationPath, 'Info.plist') 15 | if (!fs.existsSync(info_plist_path)) { 16 | this.handleError(`${info_plist_path} file not found.`) 17 | } 18 | 19 | bplist.parseFile(info_plist_path, function (err, obj) { 20 | if (err) { 21 | throw err 22 | } 23 | 24 | // get the deviceid from --devicetypeid 25 | // --devicetypeid is a string in the form "devicetype, runtime_version" (optional: runtime_version) 26 | const device = getDeviceFromDeviceTypeId(flags.devicetypeid) 27 | 28 | // so now we have the deviceid, we can proceed 29 | simctl.extensions.start(device.id) 30 | simctl.install(device.id, args.applicationPath) 31 | 32 | simctl.extensions.log(device.id, flags.log) 33 | if (flags.log) { 34 | this.log(`logPath: ${path.resolve(flags.log)}`) 35 | } 36 | if (flags.exit) { 37 | process.exit(0) 38 | } 39 | }) 40 | } 41 | } 42 | 43 | InstallCommand.args = [ 44 | { 45 | name: 'applicationPath', 46 | required: true, 47 | description: 'the path to the application to launch' 48 | } 49 | ] 50 | 51 | InstallCommand.description = 'Install the application at the specified path to the iOS Simulator without launching the app' 52 | 53 | InstallCommand.flags = { 54 | ...BaseCommand.flags, 55 | devicetypeid: flags.string({ 56 | char: 'd', 57 | description: 'The id of the device type that should be simulated (Xcode6+). Use \'showdevicetypes\' to list devices.' 58 | }) 59 | } 60 | 61 | module.exports = InstallCommand 62 | -------------------------------------------------------------------------------- /src/commands/launch.js: -------------------------------------------------------------------------------- 1 | const BaseCommand = require('../BaseCommand') 2 | const { parseEnvironmentVariables, withInjectedEnvironmentVariablesToProcess, getDeviceFromDeviceTypeId } = require('../helpers') 3 | const { flags } = require('@oclif/command') 4 | const path = require('path') 5 | const fs = require('fs') 6 | const bplist = require('bplist-parser') 7 | const plist = require('plist') 8 | const simctl = require('simctl') 9 | 10 | class LaunchCommand extends BaseCommand { 11 | async run () { 12 | const { args, flags } = this.parse(LaunchCommand) 13 | 14 | const wait_for_debugger = false 15 | const info_plist_path = path.join(args.applicationPath, 'Info.plist') 16 | let app_identifier 17 | 18 | if (!fs.existsSync(info_plist_path)) { 19 | this.handleError(`${info_plist_path} file not found.`) 20 | } 21 | 22 | bplist.parseFile(info_plist_path, function (err, obj) { 23 | if (err) { 24 | // try to see if a regular plist parser will work 25 | obj = plist.parse(fs.readFileSync(info_plist_path, 'utf8')) 26 | if (obj) { 27 | app_identifier = obj.CFBundleIdentifier 28 | } else { 29 | throw err 30 | } 31 | } else { 32 | app_identifier = obj[0].CFBundleIdentifier 33 | } 34 | 35 | const flagArgs = flags.args || [] 36 | const setenv = flags.setenv || [] 37 | 38 | const environmentVariables = parseEnvironmentVariables(setenv) 39 | 40 | withInjectedEnvironmentVariablesToProcess(process, environmentVariables, function () { 41 | // get the deviceid from --devicetypeid 42 | // --devicetypeid is a string in the form "devicetype, runtime_version" (optional: runtime_version) 43 | const device = getDeviceFromDeviceTypeId(flags.devicetypeid) 44 | 45 | // so now we have the deviceid, we can proceed 46 | simctl.extensions.start(device.id) 47 | simctl.install(device.id, args.applicationPath) 48 | simctl.launch(wait_for_debugger, device.id, app_identifier, flagArgs) 49 | simctl.extensions.log(device.id, flags.log) 50 | if (flags.log) { 51 | this.log(`logPath: ${path.resolve(flags.log)}`) 52 | } 53 | if (flags.exit) { 54 | process.exit(0) 55 | } 56 | }) 57 | }) 58 | } 59 | } 60 | 61 | LaunchCommand.args = [ 62 | { 63 | name: 'applicationPath', 64 | required: true, 65 | description: 'the path to the application to launch' 66 | } 67 | ] 68 | 69 | LaunchCommand.description = 'Launch the application at the specified path in the iOS Simulator' 70 | 71 | LaunchCommand.flags = { 72 | ...BaseCommand.flags, 73 | devicetypeid: flags.string({ 74 | char: 'd', 75 | description: 'The id of the device type that should be simulated (Xcode6+). Use \'showdevicetypes\' to list devices.' 76 | }), 77 | setenv: flags.string({ 78 | multiple: true, 79 | char: 's', 80 | description: 'environment variables to pass in as key value pairs' 81 | }), 82 | args: flags.string({ 83 | multiple: true, 84 | char: 'a', 85 | description: 'arguments to pass in to the launched app' 86 | }) 87 | } 88 | 89 | module.exports = LaunchCommand 90 | -------------------------------------------------------------------------------- /src/commands/showdevicetypes.js: -------------------------------------------------------------------------------- 1 | const BaseCommand = require('../BaseCommand') 2 | const { getDeviceTypes } = require('../helpers') 3 | const debug = require('debug')('ios-sim:showdevicetypes') 4 | const os = require('node:os') 5 | 6 | class ShowDeviceTypesCommand extends BaseCommand { 7 | async run () { 8 | const deviceTypes = getDeviceTypes() 9 | debug('DEVICETYPES', deviceTypes) 10 | 11 | this.log(await this.output(deviceTypes)) 12 | return deviceTypes 13 | } 14 | 15 | async output (devicetypes) { 16 | if (!devicetypes) { 17 | devicetypes = getDeviceTypes() 18 | } 19 | 20 | return devicetypes.join(os.EOL) 21 | } 22 | } 23 | 24 | ShowDeviceTypesCommand.description = 'List the available device types' 25 | 26 | ShowDeviceTypesCommand.flags = { 27 | ...BaseCommand.flags 28 | } 29 | 30 | module.exports = ShowDeviceTypesCommand 31 | -------------------------------------------------------------------------------- /src/commands/showsdks.js: -------------------------------------------------------------------------------- 1 | const BaseCommand = require('../BaseCommand') 2 | const simctl = require('simctl') 3 | const os = require('node:os') 4 | 5 | class ShowSdksCommand extends BaseCommand { 6 | async run () { 7 | const options = { silent: true, runtimes: true } 8 | const list = simctl.list(options).json 9 | 10 | this.log(await this.output(list.runtimes)) 11 | return list.runtimes 12 | } 13 | 14 | async output (runtimes) { 15 | if (!runtimes) { 16 | const options = { silent: true, runtimes: true } 17 | const list = simctl.list(options).json 18 | runtimes = list.runtimes 19 | } 20 | 21 | let output = `Simulator SDK Roots:${os.EOL}` 22 | runtimes.forEach(function (runtime) { 23 | if ((runtime.availability ? (runtime.availability === '(available)') : runtime.isAvailable)) { 24 | output += `"${runtime.name}" (${runtime.buildversion})${os.EOL}` 25 | output += `\t(unknown)${os.EOL}` 26 | } 27 | }) 28 | 29 | return output 30 | } 31 | } 32 | 33 | ShowSdksCommand.description = 'List the available iOS SDK versions' 34 | 35 | ShowSdksCommand.flags = { 36 | ...BaseCommand.flags 37 | } 38 | 39 | module.exports = ShowSdksCommand 40 | -------------------------------------------------------------------------------- /src/commands/start.js: -------------------------------------------------------------------------------- 1 | const BaseCommand = require('../BaseCommand') 2 | const { flags } = require('@oclif/command') 3 | const { getDeviceFromDeviceTypeId } = require('../helpers') 4 | const simctl = require('simctl') 5 | 6 | class StartCommand extends BaseCommand { 7 | async run () { 8 | const { flags } = this.parse(StartCommand) 9 | 10 | const device = getDeviceFromDeviceTypeId(flags.devicetypeid) 11 | simctl.extensions.start(device.id) 12 | } 13 | } 14 | 15 | StartCommand.description = 'Launch the iOS Simulator without an app' 16 | 17 | StartCommand.flags = { 18 | ...BaseCommand.flags, 19 | devicetypeid: flags.string({ 20 | char: 'd', 21 | description: 'The id of the device type that should be simulated (Xcode6+). Use \'showdevicetypes\' to list devices.' 22 | }) 23 | } 24 | 25 | module.exports = StartCommand 26 | -------------------------------------------------------------------------------- /src/helpers.js: -------------------------------------------------------------------------------- 1 | const simctl = require('simctl') 2 | 3 | function fixSimCtlList (list) { 4 | // Xcode 9 `xcrun simctl list devicetypes` have obfuscated names for 2017 iPhones and Apple Watches. 5 | const deviceTypeNameMap = { 6 | 'iPhone2017-A': 'iPhone 8', 7 | 'iPhone2017-B': 'iPhone 8 Plus', 8 | 'iPhone2017-C': 'iPhone X', 9 | 'Watch2017 - 38mm': 'Apple Watch Series 3 - 38mm', 10 | 'Watch2017 - 42mm': 'Apple Watch Series 3 - 42mm' 11 | } 12 | list.devicetypes = fixNameKey(list.devicetypes, deviceTypeNameMap) 13 | 14 | // `iPad Pro` in iOS 9.3 has mapped to `iPad Pro (9.7 inch)` 15 | // `Apple TV 1080p` has mapped to `Apple TV` 16 | const deviceNameMap = { 17 | 'Apple TV 1080p': 'Apple TV', 18 | 'iPad Pro': 'iPad Pro (9.7-inch)' 19 | } 20 | Object.keys(list.devices).forEach(function (key) { 21 | list.devices[key] = fixNameKey(list.devices[key], deviceNameMap) 22 | }) 23 | 24 | return list 25 | } 26 | 27 | function getDeviceTypes (druntimes) { 28 | const options = { silent: true } 29 | let list = simctl.list(options).json 30 | list = fixSimCtlList(list) 31 | 32 | if (!druntimes) { 33 | druntimes = findRuntimesGroupByDeviceProperty(list, 'name', true, { lowerCase: true }) 34 | } 35 | const name_id_map = {} 36 | 37 | list.devicetypes.forEach(function (device) { 38 | name_id_map[filterDeviceName(device.name).toLowerCase()] = device.identifier 39 | }) 40 | 41 | list = [] 42 | const remove = function (devicename, runtime) { 43 | // remove "iOS" prefix in runtime, remove prefix "com.apple.CoreSimulator.SimDeviceType." in id 44 | const deviceName = name_id_map[devicename].replace(/^com.apple.CoreSimulator.SimDeviceType./, '') 45 | const runtimeName = runtime.replace(/^iOS /, '') 46 | list.push(`${deviceName}, ${runtimeName}`) 47 | } 48 | 49 | const cur = function (devicename) { 50 | return function (runtime) { 51 | remove(devicename, runtime) 52 | } 53 | } 54 | 55 | for (const deviceName in druntimes) { 56 | const runtimes = druntimes[deviceName] 57 | const dname = filterDeviceName(deviceName).toLowerCase() 58 | 59 | if (!(dname in name_id_map)) { 60 | continue 61 | } 62 | 63 | runtimes.forEach(cur(dname)) 64 | } 65 | return list 66 | } 67 | 68 | function fixNameKey (array, mapping) { 69 | if (!array || !mapping) { 70 | return array 71 | } 72 | 73 | return array.map(function (elem) { 74 | const name = mapping[elem.name] 75 | if (name) { 76 | elem.name = name 77 | } 78 | return elem 79 | }) 80 | } 81 | 82 | // replace hyphens in iPad Pro name which differ in 'Device Types' and 'Devices' 83 | function filterDeviceName (deviceName) { 84 | // replace hyphens in iPad Pro name which differ in 'Device Types' and 'Devices' 85 | if (/^iPad Pro/i.test(deviceName)) { 86 | return deviceName.replace(/-/g, ' ').trim() 87 | } 88 | // replace ʀ in iPhone Xʀ 89 | if (deviceName.indexOf('ʀ') > -1) { 90 | return deviceName.replace('ʀ', 'R') 91 | } 92 | return deviceName 93 | } 94 | 95 | function findRuntimesGroupByDeviceProperty (list, deviceProperty, availableOnly, options = {}) { 96 | /* 97 | // Example result: 98 | { 99 | "iPhone 6" : [ "iOS 8.2", "iOS 8.3"], 100 | "iPhone 6 Plus" : [ "iOS 8.2", "iOS 8.3"] 101 | } 102 | */ 103 | 104 | const runtimes = {} 105 | const available_runtimes = {} 106 | 107 | list.runtimes.forEach(function (runtime) { 108 | // runtime.name should already be normalized, 'identifier' key has the namespaced name 109 | available_runtimes[runtime.name] = (runtime.availability ? (runtime.availability === '(available)') : runtime.isAvailable) 110 | }) 111 | 112 | Object.keys(list.devices).forEach(function (deviceGroup) { 113 | list.devices[deviceGroup].forEach(function (device) { 114 | // deviceGroup has not been normalized, it can either be the namespaced name, or the 115 | // human readable name. We normalize it 116 | const normalizedRuntimeName = fixRuntimeName(deviceGroup) 117 | 118 | let devicePropertyValue = device[deviceProperty] 119 | 120 | if (options.lowerCase) { 121 | devicePropertyValue = devicePropertyValue.toLowerCase() 122 | } 123 | if (!runtimes[devicePropertyValue]) { 124 | runtimes[devicePropertyValue] = [] 125 | } 126 | 127 | if (availableOnly) { 128 | if (available_runtimes[normalizedRuntimeName]) { 129 | runtimes[devicePropertyValue].push(normalizedRuntimeName) 130 | } 131 | } else { 132 | runtimes[devicePropertyValue].push(normalizedRuntimeName) 133 | } 134 | }) 135 | }) 136 | 137 | return runtimes 138 | } 139 | 140 | // Parses array of KEY=Value strings into map of strings 141 | // If fixsymctl == true, updates variables for correct usage with simctl 142 | function parseEnvironmentVariables (envVariables, fixsymctl) { 143 | envVariables = envVariables || [] 144 | fixsymctl = typeof fixsymctl !== 'undefined' ? fixsymctl : true 145 | 146 | const envMap = {} 147 | envVariables.forEach(function (variable) { 148 | const envPair = variable.split('=', 2) 149 | if (envPair.length === 2) { 150 | let key = envPair[0] 151 | const value = envPair[1] 152 | if (fixsymctl) { 153 | key = 'SIMCTL_CHILD_' + key 154 | } 155 | envMap[key] = value 156 | } 157 | }) 158 | return envMap 159 | } 160 | 161 | // Injects specified environment variables to the process and then runs action 162 | // returns environment variables back to original state after action completes 163 | function withInjectedEnvironmentVariablesToProcess (process, envVariables, action) { 164 | const oldVariables = Object.assign({}, process.env) 165 | 166 | // Inject additional environment variables to process 167 | for (const key in envVariables) { 168 | const value = envVariables[key] 169 | process.env[key] = value 170 | } 171 | 172 | action() 173 | 174 | // restore old envs 175 | process.env = oldVariables 176 | } 177 | 178 | function getDeviceFromDeviceTypeId (devicetypeid) { 179 | /* 180 | // Example result: 181 | { 182 | name : 'iPhone 6', 183 | id : 'A1193D97-F5EE-468D-9DBA-786F403766E6', 184 | runtime : 'iOS 8.3' 185 | } 186 | */ 187 | 188 | // the object to return 189 | const ret_obj = { 190 | name: null, 191 | id: null, 192 | runtime: null 193 | } 194 | 195 | const options = { silent: true } 196 | let list = simctl.list(options).json 197 | list = fixSimCtlList(list) 198 | 199 | let arr = [] 200 | if (devicetypeid) { 201 | arr = devicetypeid.split(',') 202 | } 203 | 204 | // get the devicetype from --devicetypeid 205 | // --devicetypeid is a string in the form "devicetype, runtime_version" (optional: runtime_version) 206 | let devicetype = null 207 | if (arr.length < 1) { 208 | const dv = findFirstAvailableDevice(list) 209 | console.error(`--devicetypeid was not specified, using first available device: ${dv.name}`) 210 | return dv 211 | } else { 212 | devicetype = arr[0].trim() 213 | if (arr.length > 1) { 214 | ret_obj.runtime = arr[1].trim() 215 | } 216 | } 217 | 218 | // check whether devicetype has the "com.apple.CoreSimulator.SimDeviceType." prefix, if not, add it 219 | const prefix = 'com.apple.CoreSimulator.SimDeviceType.' 220 | if (devicetype.indexOf(prefix) !== 0) { 221 | devicetype = prefix + devicetype 222 | } 223 | 224 | // now find the devicename from the devicetype 225 | const devicename_found = list.devicetypes.some(function (deviceGroup) { 226 | if (deviceGroup.identifier === devicetype) { 227 | ret_obj.name = deviceGroup.name 228 | return true 229 | } 230 | 231 | return false 232 | }) 233 | 234 | // device name not found, exit 235 | if (!devicename_found) { 236 | throw new Error(`Device type "${devicetype}" could not be found.`) 237 | } 238 | 239 | // if runtime_version was not specified, we use a default. Use first available that has the device 240 | if (!ret_obj.runtime) { 241 | ret_obj.runtime = findAvailableRuntime(list, ret_obj.name) 242 | } 243 | 244 | // prepend iOS to runtime version, if necessary 245 | if (ret_obj.runtime.indexOf('OS') === -1) { 246 | ret_obj.runtime = `iOS ${ret_obj.runtime}` 247 | } 248 | 249 | // now find the deviceid (by runtime and devicename) 250 | const deviceid_found = Object.keys(list.devices).some(function (deviceGroup) { 251 | // deviceGroup has not been normalized, it can either be the namespaced name, or the 252 | // human readable name. We normalize it 253 | const normalizedRuntimeName = fixRuntimeName(deviceGroup) 254 | if (normalizedRuntimeName === ret_obj.runtime) { 255 | return list.devices[deviceGroup].some(function (device) { 256 | if (filterDeviceName(device.name).toLowerCase() === filterDeviceName(ret_obj.name).toLowerCase()) { 257 | ret_obj.id = device.udid 258 | return true 259 | } 260 | return false 261 | }) 262 | } 263 | return false 264 | }) 265 | 266 | if (!deviceid_found) { 267 | throw new Error( 268 | `Device id for device name "${ret_obj.name}" and runtime "${ret_obj.runtime}" could not be found, or is not available.` 269 | ) 270 | } 271 | 272 | return ret_obj 273 | } 274 | 275 | function findAvailableRuntime (list, devicename) { 276 | const device_name = devicename.toLowerCase() 277 | 278 | const all_druntimes = findRuntimesGroupByDeviceProperty(list, 'name', true, { lowerCase: true }) 279 | const druntime = all_druntimes[filterDeviceName(device_name)] || all_druntimes[device_name] 280 | const runtime_found = druntime && druntime.length > 0 281 | 282 | if (!runtime_found) { 283 | throw new Error(`No available runtimes could be found for "${devicename}".`) 284 | } 285 | 286 | // return most modern runtime 287 | return druntime.sort().pop() 288 | } 289 | 290 | function findFirstAvailableDevice (list) { 291 | /* 292 | // Example result: 293 | { 294 | name : 'iPhone 6', 295 | id : 'A1193D97-F5EE-468D-9DBA-786F403766E6', 296 | runtime : 'iOS 8.3' 297 | } 298 | */ 299 | 300 | // the object to return 301 | let ret_obj = { 302 | name: null, 303 | id: null, 304 | runtime: null 305 | } 306 | 307 | const available_runtimes = {} 308 | 309 | list.runtimes.forEach(function (runtime) { 310 | // runtime.name should already be normalized, 'identifier' key has the namespaced name 311 | available_runtimes[runtime.name] = (runtime.availability ? (runtime.availability === '(available)') : runtime.isAvailable) 312 | }) 313 | 314 | Object.keys(list.devices).some(function (deviceGroup) { 315 | return list.devices[deviceGroup].some(function (device) { 316 | // deviceGroup has not been normalized, it can either be the namespaced name, or the 317 | // human readable name. We normalize it 318 | const normalizedRuntimeName = fixRuntimeName(deviceGroup) 319 | if (available_runtimes[normalizedRuntimeName]) { 320 | ret_obj = { 321 | name: device.name, 322 | id: device.udid, 323 | runtime: normalizedRuntimeName 324 | } 325 | return true 326 | } 327 | return false 328 | }) 329 | }) 330 | 331 | return ret_obj 332 | } 333 | 334 | function fixRuntimeName (runtimeName) { 335 | // looking for format 'com.apple.CoreSimulator.SimRuntime.iOS-12-0' 336 | const pattern = /^com\.apple\.CoreSimulator\.SimRuntime\.(([a-zA-Z0-9]+)-(\S+))$/i 337 | const match = pattern.exec(runtimeName) 338 | 339 | if (match) { 340 | const [, , os, version] = match 341 | // all or nothing -- os, version will always have a value for match 342 | return `${os} ${version.replace('-', '.')}` 343 | } 344 | 345 | return runtimeName 346 | } 347 | 348 | module.exports = { 349 | getDeviceTypes, 350 | parseEnvironmentVariables, 351 | withInjectedEnvironmentVariablesToProcess, 352 | getDeviceFromDeviceTypeId, 353 | findFirstAvailableDevice, 354 | __internal: { 355 | findRuntimesGroupByDeviceProperty, 356 | fixNameKey, 357 | fixRuntimeName, 358 | findAvailableRuntime, 359 | getDeviceFromDeviceTypeId 360 | } 361 | } 362 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | const ShowDeviceTypesCommand = require('./commands/showdevicetypes') 2 | const ShowSdksCommand = require('./commands/showsdks') 3 | const InstallCommand = require('./commands/install') 4 | const LaunchCommand = require('./commands/launch') 5 | const StartCommand = require('./commands/start') 6 | const LegacyFunctions = require('./index.legacy') 7 | 8 | module.exports = { 9 | ...LegacyFunctions, 10 | // see above legacy functions for usage 11 | ShowDeviceTypesCommand, 12 | ShowSdksCommand, 13 | InstallCommand, 14 | LaunchCommand, 15 | StartCommand 16 | } 17 | -------------------------------------------------------------------------------- /src/index.legacy.js: -------------------------------------------------------------------------------- 1 | const ShowDeviceTypesCommand = require('./commands/showdevicetypes') 2 | const ShowSdksCommand = require('./commands/showsdks') 3 | const InstallCommand = require('./commands/install') 4 | const LaunchCommand = require('./commands/launch') 5 | const StartCommand = require('./commands/start') 6 | 7 | function deprecatedMessage (old, nnew) { 8 | console.warn(`ios-sim.${old} is deprecated, use ${nnew} instead.`) 9 | } 10 | 11 | module.exports = { 12 | 13 | getdevicetypes: () => { // legacy for backwards compatibility 14 | deprecatedMessage('getdevicetypes', 'ShowDeviceTypesCommand') 15 | return ShowDeviceTypesCommand.run([]) 16 | }, 17 | 18 | showdevicetypes: () => { // legacy for backwards compatibility 19 | deprecatedMessage('showdevicetypes', 'ShowDeviceTypesCommand') 20 | return new ShowDeviceTypesCommand().output() 21 | }, 22 | 23 | showsdks: () => { // legacy for backwards compatibility 24 | deprecatedMessage('showsdks', 'ShowSdksCommand') 25 | return new ShowSdksCommand().output() 26 | }, 27 | 28 | install: (app_path, devicetypeid, log, exit) => { // legacy for backwards compatibility 29 | deprecatedMessage('install', 'InstallCommand') 30 | const argv = [app_path, '--devicetypeid', devicetypeid] 31 | if (log) { 32 | argv.push(...['--log', log]) 33 | } 34 | if (exit) { 35 | argv.push('--exit') 36 | } 37 | return InstallCommand.run(argv) 38 | }, 39 | 40 | launch: (app_path, devicetypeid, log, exit, setenv, args) => { // legacy for backwards compatibility 41 | deprecatedMessage('launch', 'LaunchCommand') 42 | const argv = [app_path, '--devicetypeid', devicetypeid] 43 | if (log) { 44 | argv.push(...['--log', log]) 45 | } 46 | if (exit) { 47 | argv.push('--exit') 48 | } 49 | if (setenv) { 50 | argv.push(...['--setenv', setenv]) 51 | } 52 | if (args) { 53 | argv.push(...['--args', args]) 54 | } 55 | 56 | return LaunchCommand.run(argv) 57 | }, 58 | 59 | start: (devicetypeid) => { // legacy for backwards compatibility 60 | deprecatedMessage('start', 'StartCommand') 61 | const argv = ['--devicetypeid', devicetypeid] 62 | 63 | return StartCommand.run(argv) 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /test/BaseCommand.test.js: -------------------------------------------------------------------------------- 1 | const TheCommand = require('../src/BaseCommand') 2 | const { Command } = require('@oclif/command') 3 | 4 | test('exports', async () => { 5 | expect(typeof TheCommand).toEqual('function') 6 | expect(TheCommand.prototype).toBeInstanceOf(Command) 7 | }) 8 | 9 | test('description', async () => { 10 | expect(TheCommand.description).not.toBeDefined() 11 | }) 12 | 13 | test('aliases', async () => { 14 | expect(TheCommand.aliases).toEqual([]) 15 | }) 16 | 17 | test('flags', async () => { 18 | expect(Object.keys(TheCommand.flags)).toEqual(['debug', 'verbose', 'exit', 'log']) 19 | }) 20 | 21 | test('args', async () => { 22 | expect(TheCommand.args).toBeUndefined() 23 | }) 24 | 25 | describe('instance methods', () => { 26 | let command 27 | 28 | beforeEach(() => { 29 | command = new TheCommand([]) 30 | }) 31 | 32 | describe('init', () => { 33 | test('is a function', async () => { 34 | expect(command.init).toBeInstanceOf(Function) 35 | }) 36 | 37 | test('verbose flag', async () => { 38 | const debug = require('debug') 39 | const spy = jest.spyOn(debug, 'enable').mockReturnValue() 40 | 41 | command.argv = ['--verbose'] 42 | return command.init().then(() => { 43 | expect(spy).toHaveBeenCalledWith('*') 44 | spy.mockClear() 45 | }) 46 | }) 47 | 48 | test('debug flag', async () => { 49 | const debug = require('debug') 50 | const spy = jest.spyOn(debug, 'enable').mockReturnValue() 51 | 52 | command.argv = ['--debug', 'foo,bar'] 53 | return command.init().then(() => { 54 | expect(spy).toHaveBeenCalledWith('foo,bar') 55 | spy.mockClear() 56 | }) 57 | }) 58 | 59 | test('init no flag', async () => { 60 | const debug = require('debug') 61 | const spy = jest.spyOn(debug, 'enable').mockReturnValue() 62 | 63 | command.argv = [] 64 | return command.init().then(() => { 65 | expect(spy).not.toHaveBeenCalled() 66 | spy.mockClear() 67 | }) 68 | }) 69 | }) 70 | 71 | describe('handleError', () => { 72 | test('is a function', async () => { 73 | expect(command.handleError).toBeInstanceOf(Function) 74 | }) 75 | 76 | test('calls error, --verbose', () => { 77 | const debug = require('debug') 78 | const spy = jest.spyOn(debug, 'log').mockImplementation(() => {}) 79 | 80 | command.error = jest.fn() 81 | command.argv = ['--verbose'] 82 | command.handleError('msg', new Error('an error')) 83 | expect(command.error).toHaveBeenCalledWith('msg: an error') 84 | expect(spy).toHaveBeenCalled() 85 | 86 | spy.mockRestore() 87 | }) 88 | 89 | test('calls error', () => { 90 | const debug = require('debug') 91 | const spy = jest.spyOn(debug, 'log').mockImplementation(() => {}) 92 | 93 | command.error = jest.fn() 94 | command.argv = [] 95 | command.handleError('msg', new Error('an error')) 96 | expect(command.error).toHaveBeenCalledWith('msg: an error') 97 | expect(spy).not.toHaveBeenCalled() 98 | 99 | spy.mockRestore() 100 | }) 101 | 102 | test('optional error object', () => { 103 | command.error = jest.fn() 104 | command.handleError('msg') 105 | expect(command.error).toHaveBeenCalledWith('msg') 106 | }) 107 | 108 | test('with no arguments', () => { 109 | command.error = jest.fn() 110 | command.handleError() 111 | expect(command.error).toHaveBeenCalledWith('unknown error') 112 | }) 113 | }) 114 | }) 115 | -------------------------------------------------------------------------------- /test/commands/install.test.js: -------------------------------------------------------------------------------- 1 | test.skip('do something', function () { 2 | expect(this).toEqual('TODO: install.test.js') 3 | }) 4 | -------------------------------------------------------------------------------- /test/commands/launch.test.js: -------------------------------------------------------------------------------- 1 | test.skip('do something', function () { 2 | expect(this).toEqual('TODO: launch.test.js') 3 | }) 4 | -------------------------------------------------------------------------------- /test/commands/showdevicetypes.test.js: -------------------------------------------------------------------------------- 1 | const TheCommand = require('../../src/commands/showdevicetypes') 2 | const { stdout } = require('stdout-stderr') 3 | const os = require('node:os') 4 | const simctl = require('simctl') 5 | 6 | jest.mock('simctl') 7 | 8 | describe('showdevicetypes', () => { 9 | let command 10 | beforeEach(() => { 11 | command = new TheCommand([]) 12 | }) 13 | 14 | test('run', function () { 15 | const json = fixtureJson('simctl-list.json') 16 | simctl.list = jest.fn(() => { 17 | return { 18 | json 19 | } 20 | }) 21 | 22 | return command.run().then((result) => { 23 | expect(stdout.output).toMatchFixture('showdevicetypes.txt') 24 | expect(result instanceof Array).toBeTruthy() 25 | expect(result.length).toEqual(79) 26 | }) 27 | }) 28 | 29 | test('output', function () { 30 | const json = fixtureJson('simctl-list.json') 31 | simctl.list = jest.fn(() => { 32 | return { 33 | json 34 | } 35 | }) 36 | 37 | return command.output().then((result) => { 38 | // the command run log adds an extra newline, so to match the fixture we add a newline (see `run` test) 39 | expect(result + os.EOL).toMatchFixture('showdevicetypes.txt') 40 | }) 41 | }) 42 | 43 | // see https://github.com/ios-control/ios-sim/issues/234 44 | test('device key in the form of com.apple.CoreSimulator.SimRuntime.XXXX', function () { 45 | const json = fixtureJson('issue-234/simctl-list.json') 46 | simctl.list = jest.fn(() => { 47 | return { 48 | json 49 | } 50 | }) 51 | 52 | return command.run().then((result) => { 53 | expect(stdout.output).toMatchFixture('issue-234/showdevicetypes.txt') 54 | }) 55 | }) 56 | 57 | // see https://github.com/ios-control/ios-sim/issues/262 58 | test('new isAvailable property', function () { 59 | const json = fixtureJson('issue-262/simctl-list.json') 60 | simctl.list = jest.fn(() => { 61 | return { 62 | json 63 | } 64 | }) 65 | 66 | return command.run().then((result) => { 67 | expect(stdout.output).toMatchFixture('issue-262/showdevicetypes.txt') 68 | }) 69 | }) 70 | }) 71 | -------------------------------------------------------------------------------- /test/commands/showsdks.test.js: -------------------------------------------------------------------------------- 1 | const TheCommand = require('../../src/commands/showsdks') 2 | const { stdout } = require('stdout-stderr') 3 | const simctl = require('simctl') 4 | const os = require('node:os') 5 | 6 | jest.mock('simctl') 7 | 8 | describe('showsdks', () => { 9 | let command 10 | beforeEach(() => { 11 | command = new TheCommand([]) 12 | }) 13 | 14 | test('run', function () { 15 | const json = fixtureJson('simctl-list.json') 16 | simctl.list = jest.fn(() => { 17 | return { 18 | json 19 | } 20 | }) 21 | 22 | return command.run().then((result) => { 23 | expect(result).toMatchObject(json.runtimes) 24 | expect(stdout.output).toMatchFixture('showsdks.txt') 25 | }) 26 | }) 27 | 28 | // see https://github.com/ios-control/ios-sim/issues/262 29 | test('run (coverage for new isAvailable property in runtimes)', function () { 30 | const json = fixtureJson('issue-262/simctl-list.json') 31 | simctl.list = jest.fn(() => { 32 | return { 33 | json 34 | } 35 | }) 36 | 37 | return command.run().then((result) => { 38 | expect(result).toMatchObject(json.runtimes) 39 | expect(stdout.output).toMatchFixture('issue-262/showsdks.txt') 40 | }) 41 | }) 42 | 43 | test('output', function () { 44 | const json = fixtureJson('simctl-list.json') 45 | simctl.list = jest.fn(() => { 46 | return { 47 | json 48 | } 49 | }) 50 | 51 | return command.output().then((result) => { 52 | // the command run log adds an extra newline, so to match the fixture we add a newline (see `run` test) 53 | expect(result + os.EOL).toMatchFixture('showsdks.txt') 54 | }) 55 | }) 56 | }) 57 | -------------------------------------------------------------------------------- /test/commands/start.test.js: -------------------------------------------------------------------------------- 1 | const TheCommand = require('../../src/commands/start') 2 | 3 | jest.mock('simctl') 4 | const simctl = require('simctl') 5 | 6 | let command 7 | beforeEach(() => { 8 | command = new TheCommand([]) 9 | }) 10 | 11 | test('start run', function () { 12 | const json = fixtureJson('simctl-list.json') 13 | const deviceType = 'com.apple.CoreSimulator.SimDeviceType.iPhone-SE,iOS 12.1' 14 | const availableDevice = json.devices['iOS 12.1'] 15 | .find(({ isAvailable, name }) => isAvailable && name === 'iPhone SE') 16 | 17 | simctl.list = jest.fn(() => { 18 | return { 19 | json 20 | } 21 | }) 22 | simctl.extensions = { start: jest.fn() } 23 | 24 | command.argv = ['--devicetypeid', deviceType] 25 | return command.run().then((_) => { 26 | expect(simctl.extensions.start).toHaveBeenCalledWith(availableDevice.udid) 27 | }) 28 | }) 29 | -------------------------------------------------------------------------------- /test/fixtures/issue-234/showdevicetypes.txt: -------------------------------------------------------------------------------- 1 | Apple-TV-1080p, tvOS 12.1 2 | Apple-TV-4K-4K, tvOS 12.1 3 | Apple-TV-4K-1080p, tvOS 12.1 4 | iPhone-5s, 12.1 5 | iPhone-5s, 12.0 6 | iPhone-6, 12.1 7 | iPhone-6, 12.0 8 | iPhone-6-Plus, 12.1 9 | iPhone-6-Plus, 12.0 10 | iPhone-6s, 12.1 11 | iPhone-6s, 12.0 12 | iPhone-6s-Plus, 12.1 13 | iPhone-6s-Plus, 12.0 14 | iPhone-7, 12.1 15 | iPhone-7, 12.0 16 | iPhone-7-Plus, 12.1 17 | iPhone-7-Plus, 12.1 18 | iPhone-7-Plus, 12.0 19 | iPhone-8, 12.1 20 | iPhone-8, 12.0 21 | iPhone-8-Plus, 12.1 22 | iPhone-8-Plus, 12.0 23 | iPhone-SE, 12.1 24 | iPhone-SE, 12.0 25 | iPhone-X, 12.1 26 | iPhone-X, 12.0 27 | iPhone-XS, 12.1 28 | iPhone-XS, 12.0 29 | iPhone-XS-Max, 12.1 30 | iPhone-XS-Max, 12.0 31 | iPhone-XR, 12.1 32 | iPhone-XR, 12.0 33 | iPad-Air, 12.1 34 | iPad-Air, 12.0 35 | iPad-Air-2, 12.1 36 | iPad-Air-2, 12.0 37 | iPad--5th-generation-, 12.1 38 | iPad--5th-generation-, 12.0 39 | iPad-Pro--9-7-inch-, 12.1 40 | iPad-Pro--9-7-inch-, 12.0 41 | iPad-Pro, 12.1 42 | iPad-Pro, 12.0 43 | iPad-Pro--12-9-inch---2nd-generation-, 12.1 44 | iPad-Pro--12-9-inch---2nd-generation-, 12.0 45 | iPad-Pro--10-5-inch-, 12.1 46 | iPad-Pro--10-5-inch-, 12.0 47 | iPad--6th-generation-, 12.1 48 | iPad--6th-generation-, 12.0 49 | iPad-Pro--11-inch-, 12.1 50 | iPad-Pro--12-9-inch---3rd-generation-, 12.1 51 | Apple-Watch-Series-2-38mm, watchOS 5.1 52 | Apple-Watch-Series-2-42mm, watchOS 5.1 53 | Apple-Watch-Series-3-38mm, watchOS 5.1 54 | Apple-Watch-Series-3-42mm, watchOS 5.1 55 | Apple-Watch-Series-4-40mm, watchOS 5.1 56 | Apple-Watch-Series-4-44mm, watchOS 5.1 57 | -------------------------------------------------------------------------------- /test/fixtures/issue-234/simctl-list.json: -------------------------------------------------------------------------------- 1 | { 2 | "devicetypes" : [ 3 | { 4 | "name" : "iPhone 4s", 5 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 4s.simdevicetype", 6 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-4s" 7 | }, 8 | { 9 | "name" : "iPhone 5", 10 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 5.simdevicetype", 11 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-5" 12 | }, 13 | { 14 | "name" : "iPhone 5s", 15 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 5s.simdevicetype", 16 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-5s" 17 | }, 18 | { 19 | "name" : "iPhone 6", 20 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 6.simdevicetype", 21 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6" 22 | }, 23 | { 24 | "name" : "iPhone 6 Plus", 25 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 6 Plus.simdevicetype", 26 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6-Plus" 27 | }, 28 | { 29 | "name" : "iPhone 6s", 30 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 6s.simdevicetype", 31 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6s" 32 | }, 33 | { 34 | "name" : "iPhone 6s Plus", 35 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 6s Plus.simdevicetype", 36 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6s-Plus" 37 | }, 38 | { 39 | "name" : "iPhone 7", 40 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 7.simdevicetype", 41 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-7" 42 | }, 43 | { 44 | "name" : "iPhone 7 Plus", 45 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 7 Plus.simdevicetype", 46 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus" 47 | }, 48 | { 49 | "name" : "iPhone 8", 50 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 8.simdevicetype", 51 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8" 52 | }, 53 | { 54 | "name" : "iPhone 8 Plus", 55 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 8 Plus.simdevicetype", 56 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus" 57 | }, 58 | { 59 | "name" : "iPhone SE", 60 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone SE.simdevicetype", 61 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-SE" 62 | }, 63 | { 64 | "name" : "iPhone X", 65 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone X.simdevicetype", 66 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-X" 67 | }, 68 | { 69 | "name" : "iPhone Xs", 70 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone Xs.simdevicetype", 71 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-XS" 72 | }, 73 | { 74 | "name" : "iPhone Xs Max", 75 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone Xs Max.simdevicetype", 76 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-XS-Max" 77 | }, 78 | { 79 | "name" : "iPhone Xʀ", 80 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone Xʀ.simdevicetype", 81 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-XR" 82 | }, 83 | { 84 | "name" : "iPad 2", 85 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad 2.simdevicetype", 86 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-2" 87 | }, 88 | { 89 | "name" : "iPad Retina", 90 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad Retina.simdevicetype", 91 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Retina" 92 | }, 93 | { 94 | "name" : "iPad Air", 95 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad Air.simdevicetype", 96 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air" 97 | }, 98 | { 99 | "name" : "iPad Air 2", 100 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad Air 2.simdevicetype", 101 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air-2" 102 | }, 103 | { 104 | "name" : "iPad (5th generation)", 105 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad (5th generation).simdevicetype", 106 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad--5th-generation-" 107 | }, 108 | { 109 | "name" : "iPad Pro (9.7-inch)", 110 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad Pro (9.7-inch).simdevicetype", 111 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-" 112 | }, 113 | { 114 | "name" : "iPad Pro (12.9-inch)", 115 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad Pro (12.9-inch).simdevicetype", 116 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro" 117 | }, 118 | { 119 | "name" : "iPad Pro (12.9-inch) (2nd generation)", 120 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad Pro (12.9-inch) (2nd generation).simdevicetype", 121 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---2nd-generation-" 122 | }, 123 | { 124 | "name" : "iPad Pro (10.5-inch)", 125 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad Pro (10.5-inch).simdevicetype", 126 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--10-5-inch-" 127 | }, 128 | { 129 | "name" : "iPad (6th generation)", 130 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad (6th generation).simdevicetype", 131 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad--6th-generation-" 132 | }, 133 | { 134 | "name" : "iPad Pro (11-inch)", 135 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad Pro (11-inch).simdevicetype", 136 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--11-inch-" 137 | }, 138 | { 139 | "name" : "iPad Pro (12.9-inch) (3rd generation)", 140 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad Pro (12.9-inch) (3rd generation).simdevicetype", 141 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---3rd-generation-" 142 | }, 143 | { 144 | "name" : "Apple TV", 145 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/AppleTVOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple TV.simdevicetype", 146 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p" 147 | }, 148 | { 149 | "name" : "Apple TV 4K", 150 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/AppleTVOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple TV 4K.simdevicetype", 151 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-4K" 152 | }, 153 | { 154 | "name" : "Apple TV 4K (at 1080p)", 155 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/AppleTVOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple TV 4K (at 1080p).simdevicetype", 156 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-1080p" 157 | }, 158 | { 159 | "name" : "Apple Watch - 38mm", 160 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/WatchOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple Watch - 38mm.simdevicetype", 161 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-38mm" 162 | }, 163 | { 164 | "name" : "Apple Watch - 42mm", 165 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/WatchOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple Watch - 42mm.simdevicetype", 166 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-42mm" 167 | }, 168 | { 169 | "name" : "Apple Watch Series 2 - 38mm", 170 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/WatchOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple Watch Series 2 - 38mm.simdevicetype", 171 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-2-38mm" 172 | }, 173 | { 174 | "name" : "Apple Watch Series 2 - 42mm", 175 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/WatchOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple Watch Series 2 - 42mm.simdevicetype", 176 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-2-42mm" 177 | }, 178 | { 179 | "name" : "Apple Watch Series 3 - 38mm", 180 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/WatchOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple Watch Series 3 - 38mm.simdevicetype", 181 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-3-38mm" 182 | }, 183 | { 184 | "name" : "Apple Watch Series 3 - 42mm", 185 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/WatchOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple Watch Series 3 - 42mm.simdevicetype", 186 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-3-42mm" 187 | }, 188 | { 189 | "name" : "Apple Watch Series 4 - 40mm", 190 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/WatchOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple Watch Series 4 - 40mm.simdevicetype", 191 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-4-40mm" 192 | }, 193 | { 194 | "name" : "Apple Watch Series 4 - 44mm", 195 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/WatchOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple Watch Series 4 - 44mm.simdevicetype", 196 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-4-44mm" 197 | } 198 | ], 199 | "runtimes" : [ 200 | { 201 | "bundlePath" : "\/Library\/Developer\/CoreSimulator\/Profiles\/Runtimes\/iOS 12.0.simruntime", 202 | "availabilityError" : "", 203 | "buildversion" : "16A366", 204 | "availability" : "(available)", 205 | "isAvailable" : true, 206 | "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-12-0", 207 | "version" : "12.0", 208 | "name" : "iOS 12.0" 209 | }, 210 | { 211 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/Runtimes\/iOS.simruntime", 212 | "availabilityError" : "", 213 | "buildversion" : "16B91", 214 | "availability" : "(available)", 215 | "isAvailable" : true, 216 | "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-12-1", 217 | "version" : "12.1", 218 | "name" : "iOS 12.1" 219 | }, 220 | { 221 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/AppleTVOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/Runtimes\/tvOS.simruntime", 222 | "availabilityError" : "", 223 | "buildversion" : "16J602", 224 | "availability" : "(available)", 225 | "isAvailable" : true, 226 | "identifier" : "com.apple.CoreSimulator.SimRuntime.tvOS-12-1", 227 | "version" : "12.1", 228 | "name" : "tvOS 12.1" 229 | }, 230 | { 231 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/WatchOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/Runtimes\/watchOS.simruntime", 232 | "availabilityError" : "", 233 | "buildversion" : "16R591", 234 | "availability" : "(available)", 235 | "isAvailable" : true, 236 | "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-5-1", 237 | "version" : "5.1", 238 | "name" : "watchOS 5.1" 239 | } 240 | ], 241 | "devices" : { 242 | "com.apple.CoreSimulator.SimRuntime.tvOS-12-1" : [ 243 | { 244 | "availability" : "(available)", 245 | "state" : "Shutdown", 246 | "isAvailable" : true, 247 | "name" : "Apple TV", 248 | "udid" : "F84259E7-A420-48B4-9526-B9967E4221EF", 249 | "availabilityError" : "" 250 | }, 251 | { 252 | "availability" : "(available)", 253 | "state" : "Shutdown", 254 | "isAvailable" : true, 255 | "name" : "Apple TV 4K", 256 | "udid" : "A8B59851-3432-49AE-8FF4-8D25FA84B095", 257 | "availabilityError" : "" 258 | }, 259 | { 260 | "availability" : "(available)", 261 | "state" : "Shutdown", 262 | "isAvailable" : true, 263 | "name" : "Apple TV 4K (at 1080p)", 264 | "udid" : "84AE9F24-985E-4AFC-9C3E-E08D03425F21", 265 | "availabilityError" : "" 266 | } 267 | ], 268 | "com.apple.CoreSimulator.SimRuntime.iOS-12-1" : [ 269 | { 270 | "availability" : "(available)", 271 | "state" : "Shutdown", 272 | "isAvailable" : true, 273 | "name" : "iPhone 5s", 274 | "udid" : "75267DC6-2139-4747-90FD-1FFB3B5B5736", 275 | "availabilityError" : "" 276 | }, 277 | { 278 | "availability" : "(available)", 279 | "state" : "Shutdown", 280 | "isAvailable" : true, 281 | "name" : "iPhone 6", 282 | "udid" : "462CEC8E-58E4-4C77-9635-BB71225022F4", 283 | "availabilityError" : "" 284 | }, 285 | { 286 | "availability" : "(available)", 287 | "state" : "Shutdown", 288 | "isAvailable" : true, 289 | "name" : "iPhone 6 Plus", 290 | "udid" : "D7926C6A-F811-4F9C-B429-414BE21A7822", 291 | "availabilityError" : "" 292 | }, 293 | { 294 | "availability" : "(available)", 295 | "state" : "Shutdown", 296 | "isAvailable" : true, 297 | "name" : "iPhone 6s", 298 | "udid" : "0DB9BF85-B9DA-4E7A-808F-D6AB1316AB64", 299 | "availabilityError" : "" 300 | }, 301 | { 302 | "availability" : "(available)", 303 | "state" : "Shutdown", 304 | "isAvailable" : true, 305 | "name" : "iPhone 6s Plus", 306 | "udid" : "FD4E97CD-E464-456C-AAAB-0E4F8AB19C28", 307 | "availabilityError" : "" 308 | }, 309 | { 310 | "availability" : "(available)", 311 | "state" : "Shutdown", 312 | "isAvailable" : true, 313 | "name" : "iPhone 7", 314 | "udid" : "893B6BBC-ACE7-4E8D-893F-38EF202AFD45", 315 | "availabilityError" : "" 316 | }, 317 | { 318 | "availability" : "(available)", 319 | "state" : "Shutdown", 320 | "isAvailable" : true, 321 | "name" : "iPhone 7 Plus", 322 | "udid" : "54E65022-DE81-40FF-BC92-3F298F544C1B", 323 | "availabilityError" : "" 324 | }, 325 | { 326 | "availability" : "(available)", 327 | "state" : "Shutdown", 328 | "isAvailable" : true, 329 | "name" : "iPhone 7 Plus", 330 | "udid" : "F3CEB432-697B-4DC3-9718-875E616E5E6F", 331 | "availabilityError" : "" 332 | }, 333 | { 334 | "availability" : "(available)", 335 | "state" : "Booted", 336 | "isAvailable" : true, 337 | "name" : "iPhone 8", 338 | "udid" : "050A28E9-C4ED-44FC-918C-1285D1AFA79D", 339 | "availabilityError" : "" 340 | }, 341 | { 342 | "availability" : "(available)", 343 | "state" : "Shutdown", 344 | "isAvailable" : true, 345 | "name" : "iPhone 8 Plus", 346 | "udid" : "A2FC72EE-4678-4E7C-B9D9-CD4A7911608C", 347 | "availabilityError" : "" 348 | }, 349 | { 350 | "availability" : "(available)", 351 | "state" : "Shutdown", 352 | "isAvailable" : true, 353 | "name" : "iPhone SE", 354 | "udid" : "0E8B2D25-EB9C-4F31-A4BB-E5EAC2EC6895", 355 | "availabilityError" : "" 356 | }, 357 | { 358 | "availability" : "(available)", 359 | "state" : "Shutdown", 360 | "isAvailable" : true, 361 | "name" : "iPhone X", 362 | "udid" : "567926E1-9BF6-4184-8212-DAAD6793CC81", 363 | "availabilityError" : "" 364 | }, 365 | { 366 | "availability" : "(available)", 367 | "state" : "Shutdown", 368 | "isAvailable" : true, 369 | "name" : "iPhone XS", 370 | "udid" : "9FDBB1BD-03C7-47FA-95B1-1EE79EBD4BB7", 371 | "availabilityError" : "" 372 | }, 373 | { 374 | "availability" : "(available)", 375 | "state" : "Shutdown", 376 | "isAvailable" : true, 377 | "name" : "iPhone XS Max", 378 | "udid" : "87366927-DEB5-4DA4-860C-877BDC8B1361", 379 | "availabilityError" : "" 380 | }, 381 | { 382 | "availability" : "(available)", 383 | "state" : "Shutdown", 384 | "isAvailable" : true, 385 | "name" : "iPhone XR", 386 | "udid" : "75E2C49E-D486-47AF-991E-045EC8B389B3", 387 | "availabilityError" : "" 388 | }, 389 | { 390 | "availability" : "(available)", 391 | "state" : "Shutdown", 392 | "isAvailable" : true, 393 | "name" : "iPad Air", 394 | "udid" : "CA7BE22E-8312-4D60-87EB-5B96EAFEDA48", 395 | "availabilityError" : "" 396 | }, 397 | { 398 | "availability" : "(available)", 399 | "state" : "Shutdown", 400 | "isAvailable" : true, 401 | "name" : "iPad Air 2", 402 | "udid" : "0CB9A6D4-1863-4E8B-ADE2-14AEE041F108", 403 | "availabilityError" : "" 404 | }, 405 | { 406 | "availability" : "(available)", 407 | "state" : "Shutdown", 408 | "isAvailable" : true, 409 | "name" : "iPad (5th generation)", 410 | "udid" : "7601594D-3C73-4AF8-8816-BD8A65F48536", 411 | "availabilityError" : "" 412 | }, 413 | { 414 | "availability" : "(available)", 415 | "state" : "Shutdown", 416 | "isAvailable" : true, 417 | "name" : "iPad Pro (9.7-inch)", 418 | "udid" : "FE075246-01EE-47F1-B44B-E99EFD933239", 419 | "availabilityError" : "" 420 | }, 421 | { 422 | "availability" : "(available)", 423 | "state" : "Shutdown", 424 | "isAvailable" : true, 425 | "name" : "iPad Pro (12.9-inch)", 426 | "udid" : "9D70D562-CF6E-455D-8501-49A6943B4267", 427 | "availabilityError" : "" 428 | }, 429 | { 430 | "availability" : "(available)", 431 | "state" : "Shutdown", 432 | "isAvailable" : true, 433 | "name" : "iPad Pro (12.9-inch) (2nd generation)", 434 | "udid" : "42A990D0-F6DD-46C7-88F3-BEDF5E2A3DBC", 435 | "availabilityError" : "" 436 | }, 437 | { 438 | "availability" : "(available)", 439 | "state" : "Shutdown", 440 | "isAvailable" : true, 441 | "name" : "iPad Pro (10.5-inch)", 442 | "udid" : "4C813E21-D183-4CD5-8B47-7B219E3A8630", 443 | "availabilityError" : "" 444 | }, 445 | { 446 | "availability" : "(available)", 447 | "state" : "Shutdown", 448 | "isAvailable" : true, 449 | "name" : "iPad (6th generation)", 450 | "udid" : "9E9E0126-1540-489B-B81C-000D166C0317", 451 | "availabilityError" : "" 452 | }, 453 | { 454 | "availability" : "(available)", 455 | "state" : "Shutdown", 456 | "isAvailable" : true, 457 | "name" : "iPad Pro (11-inch)", 458 | "udid" : "423EB5DF-E70C-4E59-B577-DCABF6EA5ADB", 459 | "availabilityError" : "" 460 | }, 461 | { 462 | "availability" : "(available)", 463 | "state" : "Shutdown", 464 | "isAvailable" : true, 465 | "name" : "iPad Pro (12.9-inch) (3rd generation)", 466 | "udid" : "78B67FBF-C18A-409C-914F-1DC88730D2F4", 467 | "availabilityError" : "" 468 | } 469 | ], 470 | "com.apple.CoreSimulator.SimRuntime.iOS-12-0" : [ 471 | { 472 | "availability" : "(available)", 473 | "state" : "Shutdown", 474 | "isAvailable" : true, 475 | "name" : "iPhone 5s", 476 | "udid" : "6EBE7D24-FBAE-4F00-99B1-DA18C9F02AFF", 477 | "availabilityError" : "" 478 | }, 479 | { 480 | "availability" : "(available)", 481 | "state" : "Shutdown", 482 | "isAvailable" : true, 483 | "name" : "iPhone 6", 484 | "udid" : "1133CD93-E562-49C7-930D-D28C8E669FE9", 485 | "availabilityError" : "" 486 | }, 487 | { 488 | "availability" : "(available)", 489 | "state" : "Shutdown", 490 | "isAvailable" : true, 491 | "name" : "iPhone 6 Plus", 492 | "udid" : "D32EDFC8-A13B-43FE-B96E-13D4410DFABA", 493 | "availabilityError" : "" 494 | }, 495 | { 496 | "availability" : "(available)", 497 | "state" : "Shutdown", 498 | "isAvailable" : true, 499 | "name" : "iPhone 6s", 500 | "udid" : "F27BD034-138F-4DE7-A879-611B4D3DB16C", 501 | "availabilityError" : "" 502 | }, 503 | { 504 | "availability" : "(available)", 505 | "state" : "Shutdown", 506 | "isAvailable" : true, 507 | "name" : "iPhone 6s Plus", 508 | "udid" : "DDE0D99E-E2D9-4BD0-95A5-7BE1549626E7", 509 | "availabilityError" : "" 510 | }, 511 | { 512 | "availability" : "(available)", 513 | "state" : "Shutdown", 514 | "isAvailable" : true, 515 | "name" : "iPhone 7", 516 | "udid" : "E039F865-C02F-4874-8648-FA3EA65A58DF", 517 | "availabilityError" : "" 518 | }, 519 | { 520 | "availability" : "(available)", 521 | "state" : "Shutdown", 522 | "isAvailable" : true, 523 | "name" : "iPhone 7 Plus", 524 | "udid" : "0FF7FE8A-4F05-4017-B688-12B8BE6DD26C", 525 | "availabilityError" : "" 526 | }, 527 | { 528 | "availability" : "(available)", 529 | "state" : "Shutdown", 530 | "isAvailable" : true, 531 | "name" : "iPhone 8", 532 | "udid" : "1848BDB5-B63F-4B6A-8AD0-7527224FC024", 533 | "availabilityError" : "" 534 | }, 535 | { 536 | "availability" : "(available)", 537 | "state" : "Shutdown", 538 | "isAvailable" : true, 539 | "name" : "iPhone 8 Plus", 540 | "udid" : "3D8498DD-C5D5-4350-A389-B895A80B9EEB", 541 | "availabilityError" : "" 542 | }, 543 | { 544 | "availability" : "(available)", 545 | "state" : "Shutdown", 546 | "isAvailable" : true, 547 | "name" : "iPhone SE", 548 | "udid" : "CFF56CB9-41CE-431C-A1D8-FD411AD049FA", 549 | "availabilityError" : "" 550 | }, 551 | { 552 | "availability" : "(available)", 553 | "state" : "Shutdown", 554 | "isAvailable" : true, 555 | "name" : "iPhone X", 556 | "udid" : "CE17D56A-D16E-4170-AEAD-2BD9FBCD1AAE", 557 | "availabilityError" : "" 558 | }, 559 | { 560 | "availability" : "(available)", 561 | "state" : "Shutdown", 562 | "isAvailable" : true, 563 | "name" : "iPhone XS", 564 | "udid" : "82061FD7-6BC2-4A70-BEBF-D8A79440A307", 565 | "availabilityError" : "" 566 | }, 567 | { 568 | "availability" : "(available)", 569 | "state" : "Shutdown", 570 | "isAvailable" : true, 571 | "name" : "iPhone XS Max", 572 | "udid" : "33C01C56-A250-4314-AFCE-13D10B31BC45", 573 | "availabilityError" : "" 574 | }, 575 | { 576 | "availability" : "(available)", 577 | "state" : "Shutdown", 578 | "isAvailable" : true, 579 | "name" : "iPhone XR", 580 | "udid" : "6BB4656D-A35A-4785-81AE-D98ABD588D45", 581 | "availabilityError" : "" 582 | }, 583 | { 584 | "availability" : "(available)", 585 | "state" : "Shutdown", 586 | "isAvailable" : true, 587 | "name" : "iPad Air", 588 | "udid" : "6044BF37-1BB7-4910-9593-C43B8B622C77", 589 | "availabilityError" : "" 590 | }, 591 | { 592 | "availability" : "(available)", 593 | "state" : "Shutdown", 594 | "isAvailable" : true, 595 | "name" : "iPad Air 2", 596 | "udid" : "227871A0-426C-49FC-B1D5-5D7BD20A5F94", 597 | "availabilityError" : "" 598 | }, 599 | { 600 | "availability" : "(available)", 601 | "state" : "Shutdown", 602 | "isAvailable" : true, 603 | "name" : "iPad (5th generation)", 604 | "udid" : "1F9862AF-3BA6-4300-B419-F572EAD52913", 605 | "availabilityError" : "" 606 | }, 607 | { 608 | "availability" : "(available)", 609 | "state" : "Shutdown", 610 | "isAvailable" : true, 611 | "name" : "iPad Pro (9.7-inch)", 612 | "udid" : "BEE64FF3-61B3-4AD2-868B-79C4561551BF", 613 | "availabilityError" : "" 614 | }, 615 | { 616 | "availability" : "(available)", 617 | "state" : "Shutdown", 618 | "isAvailable" : true, 619 | "name" : "iPad Pro (12.9-inch)", 620 | "udid" : "B05E5E59-EF18-4D2E-9B19-8E3A6F01811E", 621 | "availabilityError" : "" 622 | }, 623 | { 624 | "availability" : "(available)", 625 | "state" : "Shutdown", 626 | "isAvailable" : true, 627 | "name" : "iPad Pro (12.9-inch) (2nd generation)", 628 | "udid" : "C9D02916-B873-436B-BF56-C80D29461E2F", 629 | "availabilityError" : "" 630 | }, 631 | { 632 | "availability" : "(available)", 633 | "state" : "Shutdown", 634 | "isAvailable" : true, 635 | "name" : "iPad Pro (10.5-inch)", 636 | "udid" : "5DDC0D71-AA3C-4EC8-A66E-B049B8538C3B", 637 | "availabilityError" : "" 638 | }, 639 | { 640 | "availability" : "(available)", 641 | "state" : "Shutdown", 642 | "isAvailable" : true, 643 | "name" : "iPad (6th generation)", 644 | "udid" : "55229153-A9A4-4D2F-9372-7D20237515EC", 645 | "availabilityError" : "" 646 | } 647 | ], 648 | "com.apple.CoreSimulator.SimRuntime.watchOS-5-1" : [ 649 | { 650 | "availability" : "(available)", 651 | "state" : "Shutdown", 652 | "isAvailable" : true, 653 | "name" : "Apple Watch Series 2 - 38mm", 654 | "udid" : "E82239F3-A70D-41A6-8A6F-59FB012A6A77", 655 | "availabilityError" : "" 656 | }, 657 | { 658 | "availability" : "(available)", 659 | "state" : "Shutdown", 660 | "isAvailable" : true, 661 | "name" : "Apple Watch Series 2 - 42mm", 662 | "udid" : "188C0467-5152-4254-A2F1-226D8AD1EE95", 663 | "availabilityError" : "" 664 | }, 665 | { 666 | "availability" : "(available)", 667 | "state" : "Shutdown", 668 | "isAvailable" : true, 669 | "name" : "Apple Watch Series 3 - 38mm", 670 | "udid" : "C2250674-E255-4B63-A084-781B921B4344", 671 | "availabilityError" : "" 672 | }, 673 | { 674 | "availability" : "(available)", 675 | "state" : "Shutdown", 676 | "isAvailable" : true, 677 | "name" : "Apple Watch Series 3 - 42mm", 678 | "udid" : "EACD2B61-1DEC-4D20-A808-353BA17527E1", 679 | "availabilityError" : "" 680 | }, 681 | { 682 | "availability" : "(available)", 683 | "state" : "Shutdown", 684 | "isAvailable" : true, 685 | "name" : "Apple Watch Series 4 - 40mm", 686 | "udid" : "AC35D48D-ED84-4B46-8A55-177698E7807C", 687 | "availabilityError" : "" 688 | }, 689 | { 690 | "availability" : "(available)", 691 | "state" : "Shutdown", 692 | "isAvailable" : true, 693 | "name" : "Apple Watch Series 4 - 44mm", 694 | "udid" : "50710B83-73D0-43D8-BBAC-F135D7E16174", 695 | "availabilityError" : "" 696 | } 697 | ] 698 | }, 699 | "pairs" : { 700 | "7D84C211-814D-4555-A48D-21F7025EEB2D" : { 701 | "watch" : { 702 | "name" : "Apple Watch Series 4 - 44mm", 703 | "udid" : "50710B83-73D0-43D8-BBAC-F135D7E16174", 704 | "state" : "Shutdown" 705 | }, 706 | "phone" : { 707 | "name" : "iPhone XS Max", 708 | "udid" : "87366927-DEB5-4DA4-860C-877BDC8B1361", 709 | "state" : "Shutdown" 710 | }, 711 | "state" : "(active, disconnected)" 712 | }, 713 | "04217631-A70F-4328-82F2-BB5F8E6498D0" : { 714 | "watch" : { 715 | "name" : "Apple Watch Series 4 - 40mm", 716 | "udid" : "AC35D48D-ED84-4B46-8A55-177698E7807C", 717 | "state" : "Shutdown" 718 | }, 719 | "phone" : { 720 | "name" : "iPhone XS", 721 | "udid" : "9FDBB1BD-03C7-47FA-95B1-1EE79EBD4BB7", 722 | "state" : "Shutdown" 723 | }, 724 | "state" : "(active, disconnected)" 725 | } 726 | } 727 | } 728 | -------------------------------------------------------------------------------- /test/fixtures/issue-262/showdevicetypes.txt: -------------------------------------------------------------------------------- 1 | iPhone-5, 10.3 2 | iPhone-5s, 10.3 3 | iPhone-6-Plus, 10.3 4 | iPhone-6, 10.3 5 | iPhone-6s, 10.3 6 | iPhone-6s-Plus, 10.3 7 | iPad-Air, 10.3 8 | iPad-Air-2, 10.3 9 | iPad-Pro--9-7-inch-, 13.3 10 | Apple-TV-1080p, tvOS 10.2 11 | Apple-TV-1080p, tvOS 13.3 12 | Apple-TV-4K-4K, tvOS 13.3 13 | Apple-TV-4K-1080p, tvOS 13.3 14 | Apple-Watch-38mm, watchOS 3.2 15 | Apple-Watch-42mm, watchOS 3.2 16 | Apple-Watch-Series-2-38mm, watchOS 3.2 17 | Apple-Watch-Series-2-42mm, watchOS 3.2 18 | Apple-Watch-Series-4-40mm, watchOS 6.1 19 | Apple-Watch-Series-4-44mm, watchOS 6.1 20 | iPhone-SE, 10.3 21 | iPhone-7, 10.3 22 | iPhone-7-Plus, 10.3 23 | iPad-Pro--9-7-inch-, 10.3 24 | iPad-Pro, 10.3 25 | iPad--5th-generation-, 10.3 26 | iPad-Pro--12-9-inch---2nd-generation-, 10.3 27 | iPad-Pro--10-5-inch-, 10.3 28 | iPhone-8, 13.3 29 | iPhone-8-Plus, 13.3 30 | Apple-Watch-Series-5-40mm, watchOS 6.1 31 | Apple-Watch-Series-5-44mm, watchOS 6.1 32 | iPhone-11, 13.3 33 | iPhone-11-Pro, 13.3 34 | iPhone-11-Pro-Max, 13.3 35 | iPad--7th-generation-, 13.3 36 | iPad-Pro--11-inch-, 13.3 37 | iPad-Pro--12-9-inch---3rd-generation-, 13.3 38 | iPad-Air--3rd-generation-, 13.3 39 | -------------------------------------------------------------------------------- /test/fixtures/issue-262/showsdks.txt: -------------------------------------------------------------------------------- 1 | Simulator SDK Roots: 2 | "iOS 10.3" (14E8301) 3 | (unknown) 4 | "iOS 13.3" (17C45) 5 | (unknown) 6 | "tvOS 10.2" (14W260) 7 | (unknown) 8 | "tvOS 13.3" (17K446) 9 | (unknown) 10 | "watchOS 3.2" (14V243) 11 | (unknown) 12 | "watchOS 6.1" (17S445) 13 | (unknown) 14 | 15 | -------------------------------------------------------------------------------- /test/fixtures/showdevicetypes.txt: -------------------------------------------------------------------------------- 1 | Apple-TV-1080p, tvOS 12.1 2 | Apple-TV-4K-4K, tvOS 12.1 3 | Apple-TV-4K-1080p, tvOS 12.1 4 | Apple-Watch-Series-2-38mm, watchOS 5.1 5 | Apple-Watch-Series-2-42mm, watchOS 5.1 6 | Apple-Watch-Series-3-38mm, watchOS 5.1 7 | Apple-Watch-Series-3-42mm, watchOS 5.1 8 | Apple-Watch-Series-4-40mm, watchOS 5.1 9 | Apple-Watch-Series-4-44mm, watchOS 5.1 10 | iPhone-5, 10.3 11 | iPhone-5, 9.3 12 | iPhone-5s, 10.3 13 | iPhone-5s, 12.1 14 | iPhone-5s, 9.3 15 | iPhone-5s, 11.4 16 | iPhone-6, 10.3 17 | iPhone-6, 12.1 18 | iPhone-6, 9.3 19 | iPhone-6, 11.4 20 | iPhone-6-Plus, 10.3 21 | iPhone-6-Plus, 12.1 22 | iPhone-6-Plus, 9.3 23 | iPhone-6-Plus, 11.4 24 | iPhone-6s, 10.3 25 | iPhone-6s, 12.1 26 | iPhone-6s, 9.3 27 | iPhone-6s, 11.4 28 | iPhone-6s-Plus, 10.3 29 | iPhone-6s-Plus, 12.1 30 | iPhone-6s-Plus, 9.3 31 | iPhone-6s-Plus, 11.4 32 | iPhone-7, 10.3 33 | iPhone-7, 12.1 34 | iPhone-7, 11.4 35 | iPhone-7-Plus, 10.3 36 | iPhone-7-Plus, 12.1 37 | iPhone-7-Plus, 11.4 38 | iPhone-SE, 10.3 39 | iPhone-SE, 12.1 40 | iPhone-SE, 11.4 41 | iPad-Air, 10.3 42 | iPad-Air, 12.1 43 | iPad-Air, 9.3 44 | iPad-Air, 11.4 45 | iPad-Air-2, 10.3 46 | iPad-Air-2, 12.1 47 | iPad-Air-2, 9.3 48 | iPad-Air-2, 11.4 49 | iPad--5th-generation-, 10.3 50 | iPad--5th-generation-, 12.1 51 | iPad--5th-generation-, 11.4 52 | iPad-Pro--9-7-inch-, 10.3 53 | iPad-Pro, 10.3 54 | iPad-Pro--12-9-inch---2nd-generation-, 10.3 55 | iPad-Pro--12-9-inch---2nd-generation-, 12.1 56 | iPad-Pro--12-9-inch---2nd-generation-, 11.4 57 | iPad-Pro--10-5-inch-, 10.3 58 | iPad-Pro--10-5-inch-, 12.1 59 | iPad-Pro--10-5-inch-, 11.4 60 | iPad-Retina, 9.3 61 | iPhone-8, 12.1 62 | iPhone-8, 11.4 63 | iPhone-8-Plus, 12.1 64 | iPhone-8-Plus, 11.4 65 | iPhone-X, 12.1 66 | iPhone-X, 11.4 67 | iPad-Pro--9-7-inch-, 12.1 68 | iPad-Pro--9-7-inch-, 9.3 69 | iPad-Pro--9-7-inch-, 11.4 70 | iPad-Pro, 12.1 71 | iPad-Pro, 11.4 72 | iPad--6th-generation-, 12.1 73 | iPhone-XS, 12.1 74 | iPhone-XS-Max, 12.1 75 | iPhone-XR, 12.1 76 | iPad-Pro--11-inch-, 12.1 77 | iPad-Pro--12-9-inch---3rd-generation-, 12.1 78 | iPhone-4s, 9.3 79 | iPad-2, 9.3 80 | -------------------------------------------------------------------------------- /test/fixtures/showsdks.txt: -------------------------------------------------------------------------------- 1 | Simulator SDK Roots: 2 | "iOS 9.3" (13E233) 3 | (unknown) 4 | "iOS 10.3" (14E8301) 5 | (unknown) 6 | "iOS 11.4" (15F79) 7 | (unknown) 8 | "iOS 12.1" (16B91) 9 | (unknown) 10 | "tvOS 12.1" (16J602) 11 | (unknown) 12 | "watchOS 5.1" (16R591) 13 | (unknown) 14 | 15 | -------------------------------------------------------------------------------- /test/fixtures/simctl-list.json: -------------------------------------------------------------------------------- 1 | { 2 | "devicetypes" : [ 3 | { 4 | "name" : "iPhone 4s", 5 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 4s.simdevicetype", 6 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-4s" 7 | }, 8 | { 9 | "name" : "iPhone 5", 10 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 5.simdevicetype", 11 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-5" 12 | }, 13 | { 14 | "name" : "iPhone 5s", 15 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 5s.simdevicetype", 16 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-5s" 17 | }, 18 | { 19 | "name" : "iPhone 6", 20 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 6.simdevicetype", 21 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6" 22 | }, 23 | { 24 | "name" : "iPhone 6 Plus", 25 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 6 Plus.simdevicetype", 26 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6-Plus" 27 | }, 28 | { 29 | "name" : "iPhone 6s", 30 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 6s.simdevicetype", 31 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6s" 32 | }, 33 | { 34 | "name" : "iPhone 6s Plus", 35 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 6s Plus.simdevicetype", 36 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6s-Plus" 37 | }, 38 | { 39 | "name" : "iPhone 7", 40 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 7.simdevicetype", 41 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-7" 42 | }, 43 | { 44 | "name" : "iPhone 7 Plus", 45 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 7 Plus.simdevicetype", 46 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus" 47 | }, 48 | { 49 | "name" : "iPhone 8", 50 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 8.simdevicetype", 51 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8" 52 | }, 53 | { 54 | "name" : "iPhone 8 Plus", 55 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone 8 Plus.simdevicetype", 56 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus" 57 | }, 58 | { 59 | "name" : "iPhone SE", 60 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone SE.simdevicetype", 61 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-SE" 62 | }, 63 | { 64 | "name" : "iPhone X", 65 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone X.simdevicetype", 66 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-X" 67 | }, 68 | { 69 | "name" : "iPhone Xs", 70 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone Xs.simdevicetype", 71 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-XS" 72 | }, 73 | { 74 | "name" : "iPhone Xs Max", 75 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone Xs Max.simdevicetype", 76 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-XS-Max" 77 | }, 78 | { 79 | "name" : "iPhone Xʀ", 80 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPhone Xʀ.simdevicetype", 81 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-XR" 82 | }, 83 | { 84 | "name" : "iPad 2", 85 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad 2.simdevicetype", 86 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-2" 87 | }, 88 | { 89 | "name" : "iPad Retina", 90 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad Retina.simdevicetype", 91 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Retina" 92 | }, 93 | { 94 | "name" : "iPad Air", 95 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad Air.simdevicetype", 96 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air" 97 | }, 98 | { 99 | "name" : "iPad Air 2", 100 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad Air 2.simdevicetype", 101 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air-2" 102 | }, 103 | { 104 | "name" : "iPad (5th generation)", 105 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad (5th generation).simdevicetype", 106 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad--5th-generation-" 107 | }, 108 | { 109 | "name" : "iPad Pro (9.7-inch)", 110 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad Pro (9.7-inch).simdevicetype", 111 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-" 112 | }, 113 | { 114 | "name" : "iPad Pro (12.9-inch)", 115 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad Pro (12.9-inch).simdevicetype", 116 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro" 117 | }, 118 | { 119 | "name" : "iPad Pro (12.9-inch) (2nd generation)", 120 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad Pro (12.9-inch) (2nd generation).simdevicetype", 121 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---2nd-generation-" 122 | }, 123 | { 124 | "name" : "iPad Pro (10.5-inch)", 125 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad Pro (10.5-inch).simdevicetype", 126 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--10-5-inch-" 127 | }, 128 | { 129 | "name" : "iPad (6th generation)", 130 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad (6th generation).simdevicetype", 131 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad--6th-generation-" 132 | }, 133 | { 134 | "name" : "iPad Pro (11-inch)", 135 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad Pro (11-inch).simdevicetype", 136 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--11-inch-" 137 | }, 138 | { 139 | "name" : "iPad Pro (12.9-inch) (3rd generation)", 140 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/iPad Pro (12.9-inch) (3rd generation).simdevicetype", 141 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---3rd-generation-" 142 | }, 143 | { 144 | "name" : "Apple TV", 145 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/AppleTVOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple TV.simdevicetype", 146 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p" 147 | }, 148 | { 149 | "name" : "Apple TV 4K", 150 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/AppleTVOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple TV 4K.simdevicetype", 151 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-4K" 152 | }, 153 | { 154 | "name" : "Apple TV 4K (at 1080p)", 155 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/AppleTVOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple TV 4K (at 1080p).simdevicetype", 156 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-1080p" 157 | }, 158 | { 159 | "name" : "Apple Watch - 38mm", 160 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/WatchOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple Watch - 38mm.simdevicetype", 161 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-38mm" 162 | }, 163 | { 164 | "name" : "Apple Watch - 42mm", 165 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/WatchOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple Watch - 42mm.simdevicetype", 166 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-42mm" 167 | }, 168 | { 169 | "name" : "Apple Watch Series 2 - 38mm", 170 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/WatchOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple Watch Series 2 - 38mm.simdevicetype", 171 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-2-38mm" 172 | }, 173 | { 174 | "name" : "Apple Watch Series 2 - 42mm", 175 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/WatchOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple Watch Series 2 - 42mm.simdevicetype", 176 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-2-42mm" 177 | }, 178 | { 179 | "name" : "Apple Watch Series 3 - 38mm", 180 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/WatchOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple Watch Series 3 - 38mm.simdevicetype", 181 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-3-38mm" 182 | }, 183 | { 184 | "name" : "Apple Watch Series 3 - 42mm", 185 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/WatchOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple Watch Series 3 - 42mm.simdevicetype", 186 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-3-42mm" 187 | }, 188 | { 189 | "name" : "Apple Watch Series 4 - 40mm", 190 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/WatchOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple Watch Series 4 - 40mm.simdevicetype", 191 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-4-40mm" 192 | }, 193 | { 194 | "name" : "Apple Watch Series 4 - 44mm", 195 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/WatchOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/DeviceTypes\/Apple Watch Series 4 - 44mm.simdevicetype", 196 | "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-4-44mm" 197 | } 198 | ], 199 | "runtimes" : [ 200 | { 201 | "bundlePath" : "\/Library\/Developer\/CoreSimulator\/Profiles\/Runtimes\/iOS 9.0.simruntime", 202 | "availabilityError" : "", 203 | "buildversion" : "13E230", 204 | "availability" : "(not available)", 205 | "isAvailable" : false, 206 | "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-9-0", 207 | "version" : "9.0", 208 | "name" : "iOS 9.0" 209 | }, 210 | { 211 | "bundlePath" : "\/Library\/Developer\/CoreSimulator\/Profiles\/Runtimes\/iOS 9.3.simruntime", 212 | "availabilityError" : "", 213 | "buildversion" : "13E233", 214 | "availability" : "(available)", 215 | "isAvailable" : true, 216 | "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-9-3", 217 | "version" : "9.3", 218 | "name" : "iOS 9.3" 219 | }, 220 | { 221 | "bundlePath" : "\/Library\/Developer\/CoreSimulator\/Profiles\/Runtimes\/iOS 10.3.simruntime", 222 | "availabilityError" : "", 223 | "buildversion" : "14E8301", 224 | "availability" : "(available)", 225 | "isAvailable" : true, 226 | "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-10-3", 227 | "version" : "10.3.1", 228 | "name" : "iOS 10.3" 229 | }, 230 | { 231 | "bundlePath" : "\/Library\/Developer\/CoreSimulator\/Profiles\/Runtimes\/iOS 11.4.simruntime", 232 | "availabilityError" : "", 233 | "buildversion" : "15F79", 234 | "availability" : "(available)", 235 | "isAvailable" : true, 236 | "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-11-4", 237 | "version" : "11.4", 238 | "name" : "iOS 11.4" 239 | }, 240 | { 241 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/Runtimes\/iOS.simruntime", 242 | "availabilityError" : "", 243 | "buildversion" : "16B91", 244 | "availability" : "(available)", 245 | "isAvailable" : true, 246 | "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-12-1", 247 | "version" : "12.1", 248 | "name" : "iOS 12.1" 249 | }, 250 | { 251 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/AppleTVOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/Runtimes\/tvOS.simruntime", 252 | "availabilityError" : "", 253 | "buildversion" : "16J602", 254 | "availability" : "(available)", 255 | "isAvailable" : true, 256 | "identifier" : "com.apple.CoreSimulator.SimRuntime.tvOS-12-1", 257 | "version" : "12.1", 258 | "name" : "tvOS 12.1" 259 | }, 260 | { 261 | "bundlePath" : "\/Applications\/Xcode.app\/Contents\/Developer\/Platforms\/WatchOS.platform\/Developer\/Library\/CoreSimulator\/Profiles\/Runtimes\/watchOS.simruntime", 262 | "availabilityError" : "", 263 | "buildversion" : "16R591", 264 | "availability" : "(available)", 265 | "isAvailable" : true, 266 | "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-5-1", 267 | "version" : "5.1", 268 | "name" : "watchOS 5.1" 269 | } 270 | ], 271 | "devices" : { 272 | "com.apple.CoreSimulator.SimRuntime.tvOS-12-0" : [ 273 | { 274 | "availability" : "(unavailable, runtime profile not found)", 275 | "state" : "Shutdown", 276 | "isAvailable" : false, 277 | "name" : "Apple TV", 278 | "udid" : "1D3EB04B-F950-4509-8C62-9938BB2459B2", 279 | "availabilityError" : "runtime profile not found" 280 | }, 281 | { 282 | "availability" : "(unavailable, runtime profile not found)", 283 | "state" : "Shutdown", 284 | "isAvailable" : false, 285 | "name" : "Apple TV 4K", 286 | "udid" : "081E0804-2687-43F3-ACA0-0300C17A1DC1", 287 | "availabilityError" : "runtime profile not found" 288 | }, 289 | { 290 | "availability" : "(unavailable, runtime profile not found)", 291 | "state" : "Shutdown", 292 | "isAvailable" : false, 293 | "name" : "Apple TV 4K (at 1080p)", 294 | "udid" : "50059D12-8C17-45A9-969E-01FD553F54CA", 295 | "availabilityError" : "runtime profile not found" 296 | } 297 | ], 298 | "watchOS 5.1" : [ 299 | { 300 | "availability" : "(available)", 301 | "state" : "Shutdown", 302 | "isAvailable" : true, 303 | "name" : "Apple Watch Series 2 - 38mm", 304 | "udid" : "0CB7F7A1-A837-4809-8951-B724D6496462", 305 | "availabilityError" : "" 306 | }, 307 | { 308 | "availability" : "(available)", 309 | "state" : "Shutdown", 310 | "isAvailable" : true, 311 | "name" : "Apple Watch Series 2 - 42mm", 312 | "udid" : "FE10698F-42EA-45CD-8792-2A6515B482C8", 313 | "availabilityError" : "" 314 | }, 315 | { 316 | "availability" : "(available)", 317 | "state" : "Shutdown", 318 | "isAvailable" : true, 319 | "name" : "Apple Watch Series 3 - 38mm", 320 | "udid" : "FB78B291-C6D9-4564-BFD5-048F167644C3", 321 | "availabilityError" : "" 322 | }, 323 | { 324 | "availability" : "(available)", 325 | "state" : "Shutdown", 326 | "isAvailable" : true, 327 | "name" : "Apple Watch Series 3 - 42mm", 328 | "udid" : "73EDD741-85FE-4453-86FA-BDA3D566BF9A", 329 | "availabilityError" : "" 330 | }, 331 | { 332 | "availability" : "(available)", 333 | "state" : "Shutdown", 334 | "isAvailable" : true, 335 | "name" : "Apple Watch Series 4 - 40mm", 336 | "udid" : "C0D4D44E-CCF2-459A-AFD7-39EB96FC37FD", 337 | "availabilityError" : "" 338 | }, 339 | { 340 | "availability" : "(available)", 341 | "state" : "Shutdown", 342 | "isAvailable" : true, 343 | "name" : "Apple Watch Series 4 - 44mm", 344 | "udid" : "935B8DCE-A933-413E-A053-C225779D9C27", 345 | "availabilityError" : "" 346 | } 347 | ], 348 | "com.apple.CoreSimulator.SimRuntime.watchOS-3-1" : [ 349 | { 350 | "availability" : "(unavailable, runtime profile not found)", 351 | "state" : "Shutdown", 352 | "isAvailable" : false, 353 | "name" : "Apple Watch - 38mm", 354 | "udid" : "CB4EEEA0-522A-46A3-B651-7BB1DDB78BAA", 355 | "availabilityError" : "runtime profile not found" 356 | }, 357 | { 358 | "availability" : "(unavailable, runtime profile not found)", 359 | "state" : "Shutdown", 360 | "isAvailable" : false, 361 | "name" : "Apple Watch - 42mm", 362 | "udid" : "E1BF737C-76B5-410D-B1D6-86653A5D185B", 363 | "availabilityError" : "runtime profile not found" 364 | }, 365 | { 366 | "availability" : "(unavailable, runtime profile not found)", 367 | "state" : "Shutdown", 368 | "isAvailable" : false, 369 | "name" : "Apple Watch Series 2 - 38mm", 370 | "udid" : "A089A64E-A83A-4E03-97AC-4065C2767F4F", 371 | "availabilityError" : "runtime profile not found" 372 | }, 373 | { 374 | "availability" : "(unavailable, runtime profile not found)", 375 | "state" : "Shutdown", 376 | "isAvailable" : false, 377 | "name" : "Apple Watch Series 2 - 42mm", 378 | "udid" : "9A7C0B24-071F-4FEF-8D78-F109D51E5EA0", 379 | "availabilityError" : "runtime profile not found" 380 | } 381 | ], 382 | "tvOS 12.1" : [ 383 | { 384 | "availability" : "(available)", 385 | "state" : "Shutdown", 386 | "isAvailable" : true, 387 | "name" : "Apple TV", 388 | "udid" : "D6AAC580-55B8-4D2C-841B-F84EFE940681", 389 | "availabilityError" : "" 390 | }, 391 | { 392 | "availability" : "(available)", 393 | "state" : "Shutdown", 394 | "isAvailable" : true, 395 | "name" : "Apple TV 4K", 396 | "udid" : "DFC5017C-826D-48D2-A9C9-18EB87891FF3", 397 | "availabilityError" : "" 398 | }, 399 | { 400 | "availability" : "(available)", 401 | "state" : "Shutdown", 402 | "isAvailable" : true, 403 | "name" : "Apple TV 4K (at 1080p)", 404 | "udid" : "1A98D4A3-29C2-4998-AEDC-3E651FECCC27", 405 | "availabilityError" : "" 406 | } 407 | ], 408 | "iOS 10.3" : [ 409 | { 410 | "availability" : "(available)", 411 | "state" : "Shutdown", 412 | "isAvailable" : true, 413 | "name" : "iPhone 5", 414 | "udid" : "310D3B96-24D4-4610-ADA8-25667AB53B18", 415 | "availabilityError" : "" 416 | }, 417 | { 418 | "availability" : "(available)", 419 | "state" : "Shutdown", 420 | "isAvailable" : true, 421 | "name" : "iPhone 5s", 422 | "udid" : "8A172233-647B-4259-85E8-D0A796D5BF5E", 423 | "availabilityError" : "" 424 | }, 425 | { 426 | "availability" : "(available)", 427 | "state" : "Shutdown", 428 | "isAvailable" : true, 429 | "name" : "iPhone 6", 430 | "udid" : "CE0124DB-7DF9-4311-B686-6DAACC5CF4E5", 431 | "availabilityError" : "" 432 | }, 433 | { 434 | "availability" : "(available)", 435 | "state" : "Shutdown", 436 | "isAvailable" : true, 437 | "name" : "iPhone 6 Plus", 438 | "udid" : "B2C52237-9652-4AA5-8CF3-CAC2AFA5E8AA", 439 | "availabilityError" : "" 440 | }, 441 | { 442 | "availability" : "(available)", 443 | "state" : "Shutdown", 444 | "isAvailable" : true, 445 | "name" : "iPhone 6s", 446 | "udid" : "D649BEC5-2F44-43ED-90D3-0CEA1505B3AA", 447 | "availabilityError" : "" 448 | }, 449 | { 450 | "availability" : "(available)", 451 | "state" : "Shutdown", 452 | "isAvailable" : true, 453 | "name" : "iPhone 6s Plus", 454 | "udid" : "B817B81F-D7AF-486F-85A6-F7151788F163", 455 | "availabilityError" : "" 456 | }, 457 | { 458 | "availability" : "(available)", 459 | "state" : "Shutdown", 460 | "isAvailable" : true, 461 | "name" : "iPhone 7", 462 | "udid" : "739FFF90-F2EF-488A-A88A-B3AADA8831DE", 463 | "availabilityError" : "" 464 | }, 465 | { 466 | "availability" : "(available)", 467 | "state" : "Shutdown", 468 | "isAvailable" : true, 469 | "name" : "iPhone 7 Plus", 470 | "udid" : "4F79A21C-D3A4-432F-A655-BE7966B5C605", 471 | "availabilityError" : "" 472 | }, 473 | { 474 | "availability" : "(available)", 475 | "state" : "Shutdown", 476 | "isAvailable" : true, 477 | "name" : "iPhone SE", 478 | "udid" : "C310CF39-B994-4323-8063-DF7F995F822C", 479 | "availabilityError" : "" 480 | }, 481 | { 482 | "availability" : "(available)", 483 | "state" : "Shutdown", 484 | "isAvailable" : true, 485 | "name" : "iPad Air", 486 | "udid" : "5EFAC0B6-0583-48EA-BDC6-E80FBFF76116", 487 | "availabilityError" : "" 488 | }, 489 | { 490 | "availability" : "(available)", 491 | "state" : "Shutdown", 492 | "isAvailable" : true, 493 | "name" : "iPad Air 2", 494 | "udid" : "C5227DFA-FE4F-4517-95D1-066C8AE65307", 495 | "availabilityError" : "" 496 | }, 497 | { 498 | "availability" : "(available)", 499 | "state" : "Shutdown", 500 | "isAvailable" : true, 501 | "name" : "iPad (5th generation)", 502 | "udid" : "3AA7F800-67C7-4630-B094-812A214999D1", 503 | "availabilityError" : "" 504 | }, 505 | { 506 | "availability" : "(available)", 507 | "state" : "Shutdown", 508 | "isAvailable" : true, 509 | "name" : "iPad Pro (9.7 inch)", 510 | "udid" : "45AB7B33-CC85-4C25-B6E9-EB861126ABAF", 511 | "availabilityError" : "" 512 | }, 513 | { 514 | "availability" : "(available)", 515 | "state" : "Shutdown", 516 | "isAvailable" : true, 517 | "name" : "iPad Pro (12.9 inch)", 518 | "udid" : "DB13CD84-BAB6-48AA-B402-D0A6B8CEF347", 519 | "availabilityError" : "" 520 | }, 521 | { 522 | "availability" : "(available)", 523 | "state" : "Shutdown", 524 | "isAvailable" : true, 525 | "name" : "iPad Pro (12.9-inch) (2nd generation)", 526 | "udid" : "58BA162B-89A9-4C06-8587-90221DA02373", 527 | "availabilityError" : "" 528 | }, 529 | { 530 | "availability" : "(available)", 531 | "state" : "Shutdown", 532 | "isAvailable" : true, 533 | "name" : "iPad Pro (10.5-inch)", 534 | "udid" : "A1495169-8F95-4748-993B-6B6706998B02", 535 | "availabilityError" : "" 536 | } 537 | ], 538 | "com.apple.CoreSimulator.SimRuntime.watchOS-4-3" : [ 539 | { 540 | "availability" : "(unavailable, runtime profile not found)", 541 | "state" : "Shutdown", 542 | "isAvailable" : false, 543 | "name" : "Apple Watch - 38mm", 544 | "udid" : "C9538480-B8B1-4306-B1BE-3BD61803CC46", 545 | "availabilityError" : "runtime profile not found" 546 | }, 547 | { 548 | "availability" : "(unavailable, runtime profile not found)", 549 | "state" : "Shutdown", 550 | "isAvailable" : false, 551 | "name" : "Apple Watch - 42mm", 552 | "udid" : "A4A98386-B63C-4859-AB9A-7BAA54E23A1C", 553 | "availabilityError" : "runtime profile not found" 554 | }, 555 | { 556 | "availability" : "(unavailable, runtime profile not found)", 557 | "state" : "Shutdown", 558 | "isAvailable" : false, 559 | "name" : "Apple Watch Series 2 - 38mm", 560 | "udid" : "94B8369F-EADC-41EC-A67F-E5C49B197892", 561 | "availabilityError" : "runtime profile not found" 562 | }, 563 | { 564 | "availability" : "(unavailable, runtime profile not found)", 565 | "state" : "Shutdown", 566 | "isAvailable" : false, 567 | "name" : "Apple Watch Series 2 - 42mm", 568 | "udid" : "2120D7B5-F478-4821-A727-2F4E037AE59C", 569 | "availabilityError" : "runtime profile not found" 570 | }, 571 | { 572 | "availability" : "(unavailable, runtime profile not found)", 573 | "state" : "Shutdown", 574 | "isAvailable" : false, 575 | "name" : "Apple Watch Series 3 - 38mm", 576 | "udid" : "9611F480-2E75-4CEB-894A-368E4D146978", 577 | "availabilityError" : "runtime profile not found" 578 | }, 579 | { 580 | "availability" : "(unavailable, runtime profile not found)", 581 | "state" : "Shutdown", 582 | "isAvailable" : false, 583 | "name" : "Apple Watch Series 3 - 42mm", 584 | "udid" : "D0586D44-2D12-4D99-BF83-1FBAC0D1E1EA", 585 | "availabilityError" : "runtime profile not found" 586 | } 587 | ], 588 | "com.apple.CoreSimulator.SimRuntime.watchOS-4-0" : [ 589 | { 590 | "availability" : "(unavailable, runtime profile not found)", 591 | "state" : "Shutdown", 592 | "isAvailable" : false, 593 | "name" : "Apple Watch - 38mm", 594 | "udid" : "3F9314D4-1BEB-49F9-B752-F4945498019B", 595 | "availabilityError" : "runtime profile not found" 596 | }, 597 | { 598 | "availability" : "(unavailable, runtime profile not found)", 599 | "state" : "Shutdown", 600 | "isAvailable" : false, 601 | "name" : "Apple Watch - 42mm", 602 | "udid" : "0FD51B8F-B2A9-4893-A3AB-8F99140D18BC", 603 | "availabilityError" : "runtime profile not found" 604 | }, 605 | { 606 | "availability" : "(unavailable, runtime profile not found)", 607 | "state" : "Shutdown", 608 | "isAvailable" : false, 609 | "name" : "Apple Watch Series 2 - 38mm", 610 | "udid" : "6621CC54-C40D-4B3A-B3D6-3B1451CE5C6C", 611 | "availabilityError" : "runtime profile not found" 612 | }, 613 | { 614 | "availability" : "(unavailable, runtime profile not found)", 615 | "state" : "Shutdown", 616 | "isAvailable" : false, 617 | "name" : "Apple Watch Series 2 - 42mm", 618 | "udid" : "FAAC4B0F-A273-4E71-A193-D6098AE3D0B1", 619 | "availabilityError" : "runtime profile not found" 620 | }, 621 | { 622 | "availability" : "(unavailable, runtime profile not found)", 623 | "state" : "Shutdown", 624 | "isAvailable" : false, 625 | "name" : "Apple Watch Series 3 - 38mm", 626 | "udid" : "87B41F2F-6659-45C0-98EB-1145BBFEAF4D", 627 | "availabilityError" : "runtime profile not found" 628 | }, 629 | { 630 | "availability" : "(unavailable, runtime profile not found)", 631 | "state" : "Shutdown", 632 | "isAvailable" : false, 633 | "name" : "Apple Watch Series 3 - 42mm", 634 | "udid" : "6D98E9CE-C4C6-4D93-B5D1-9F6F99323B10", 635 | "availabilityError" : "runtime profile not found" 636 | } 637 | ], 638 | "com.apple.CoreSimulator.SimRuntime.iOS-10-2" : [ 639 | { 640 | "availability" : "(unavailable, runtime profile not found)", 641 | "state" : "Shutdown", 642 | "isAvailable" : false, 643 | "name" : "iPhone 5", 644 | "udid" : "93CE90F5-8834-4153-81E0-FC26F6F704AA", 645 | "availabilityError" : "runtime profile not found" 646 | }, 647 | { 648 | "availability" : "(unavailable, runtime profile not found)", 649 | "state" : "Shutdown", 650 | "isAvailable" : false, 651 | "name" : "iPhone 5s", 652 | "udid" : "D1B033B9-ABC6-4842-886C-7DB8FAC6089C", 653 | "availabilityError" : "runtime profile not found" 654 | }, 655 | { 656 | "availability" : "(unavailable, runtime profile not found)", 657 | "state" : "Shutdown", 658 | "isAvailable" : false, 659 | "name" : "iPhone 6", 660 | "udid" : "8A28FD8A-3A1E-41E0-B714-42D4A0D85F40", 661 | "availabilityError" : "runtime profile not found" 662 | }, 663 | { 664 | "availability" : "(unavailable, runtime profile not found)", 665 | "state" : "Shutdown", 666 | "isAvailable" : false, 667 | "name" : "iPhone 6 Plus", 668 | "udid" : "D420BF01-19F6-4241-B434-D0ADE9AF5C0B", 669 | "availabilityError" : "runtime profile not found" 670 | }, 671 | { 672 | "availability" : "(unavailable, runtime profile not found)", 673 | "state" : "Shutdown", 674 | "isAvailable" : false, 675 | "name" : "iPhone 6s", 676 | "udid" : "0AF827DF-F8A5-4745-BDB7-91B0868FAFD9", 677 | "availabilityError" : "runtime profile not found" 678 | }, 679 | { 680 | "availability" : "(unavailable, runtime profile not found)", 681 | "state" : "Shutdown", 682 | "isAvailable" : false, 683 | "name" : "iPhone 6s Plus", 684 | "udid" : "B9FC4934-0534-49D8-B05A-7E0B827CFE2E", 685 | "availabilityError" : "runtime profile not found" 686 | }, 687 | { 688 | "availability" : "(unavailable, runtime profile not found)", 689 | "state" : "Shutdown", 690 | "isAvailable" : false, 691 | "name" : "iPhone 7", 692 | "udid" : "E7FF4BC9-016D-444C-A11C-00F17447B5C0", 693 | "availabilityError" : "runtime profile not found" 694 | }, 695 | { 696 | "availability" : "(unavailable, runtime profile not found)", 697 | "state" : "Shutdown", 698 | "isAvailable" : false, 699 | "name" : "iPhone 7 Plus", 700 | "udid" : "930EE33E-3688-4FD2-997A-41D5B2E8D2AD", 701 | "availabilityError" : "runtime profile not found" 702 | }, 703 | { 704 | "availability" : "(unavailable, runtime profile not found)", 705 | "state" : "Shutdown", 706 | "isAvailable" : false, 707 | "name" : "iPhone SE", 708 | "udid" : "ACF622CF-3958-4B21-A7F5-04C4DF7171A4", 709 | "availabilityError" : "runtime profile not found" 710 | }, 711 | { 712 | "availability" : "(unavailable, runtime profile not found)", 713 | "state" : "Shutdown", 714 | "isAvailable" : false, 715 | "name" : "iPad Retina", 716 | "udid" : "B4D33871-C253-4DD9-A7EB-4B0C49FD0AF9", 717 | "availabilityError" : "runtime profile not found" 718 | }, 719 | { 720 | "availability" : "(unavailable, runtime profile not found)", 721 | "state" : "Shutdown", 722 | "isAvailable" : false, 723 | "name" : "iPad Air", 724 | "udid" : "C0CAC3C1-E319-43B7-9269-25CAF0EC74A1", 725 | "availabilityError" : "runtime profile not found" 726 | }, 727 | { 728 | "availability" : "(unavailable, runtime profile not found)", 729 | "state" : "Shutdown", 730 | "isAvailable" : false, 731 | "name" : "iPad Air 2", 732 | "udid" : "3C7A3B8E-9368-44D4-808E-00E6113E50CE", 733 | "availabilityError" : "runtime profile not found" 734 | }, 735 | { 736 | "availability" : "(unavailable, runtime profile not found)", 737 | "state" : "Shutdown", 738 | "isAvailable" : false, 739 | "name" : "iPad Pro (9.7 inch)", 740 | "udid" : "B597EE0E-26E2-404B-9F3A-9551170D547E", 741 | "availabilityError" : "runtime profile not found" 742 | }, 743 | { 744 | "availability" : "(unavailable, runtime profile not found)", 745 | "state" : "Shutdown", 746 | "isAvailable" : false, 747 | "name" : "iPad Pro (12.9 inch)", 748 | "udid" : "220DD398-99B3-4840-A4F3-80480801FC79", 749 | "availabilityError" : "runtime profile not found" 750 | } 751 | ], 752 | "com.apple.CoreSimulator.SimRuntime.iOS-11-3" : [ 753 | { 754 | "availability" : "(unavailable, runtime profile not found)", 755 | "state" : "Shutdown", 756 | "isAvailable" : false, 757 | "name" : "iPhone 5s", 758 | "udid" : "B5509A1E-A44A-4317-9D9A-5D2ED2479DE1", 759 | "availabilityError" : "runtime profile not found" 760 | }, 761 | { 762 | "availability" : "(unavailable, runtime profile not found)", 763 | "state" : "Shutdown", 764 | "isAvailable" : false, 765 | "name" : "iPhone 6", 766 | "udid" : "C67B950F-36ED-499E-886B-11BE8FA473EF", 767 | "availabilityError" : "runtime profile not found" 768 | }, 769 | { 770 | "availability" : "(unavailable, runtime profile not found)", 771 | "state" : "Shutdown", 772 | "isAvailable" : false, 773 | "name" : "iPhone 6 Plus", 774 | "udid" : "524B7E36-6E9D-45B2-A5EA-63BC339BD8C6", 775 | "availabilityError" : "runtime profile not found" 776 | }, 777 | { 778 | "availability" : "(unavailable, runtime profile not found)", 779 | "state" : "Shutdown", 780 | "isAvailable" : false, 781 | "name" : "iPhone 6s", 782 | "udid" : "52BB0D93-0381-4674-8050-3A54C7935B5F", 783 | "availabilityError" : "runtime profile not found" 784 | }, 785 | { 786 | "availability" : "(unavailable, runtime profile not found)", 787 | "state" : "Shutdown", 788 | "isAvailable" : false, 789 | "name" : "iPhone 6s Plus", 790 | "udid" : "27EE3470-F976-4975-BA02-646A15EE31C8", 791 | "availabilityError" : "runtime profile not found" 792 | }, 793 | { 794 | "availability" : "(unavailable, runtime profile not found)", 795 | "state" : "Creating", 796 | "isAvailable" : false, 797 | "name" : "iPhone 7", 798 | "udid" : "7B1F9432-3E56-4EC5-992D-8F6FF14F4F4E", 799 | "availabilityError" : "runtime profile not found" 800 | }, 801 | { 802 | "availability" : "(unavailable, runtime profile not found)", 803 | "state" : "Creating", 804 | "isAvailable" : false, 805 | "name" : "iPhone 7 Plus", 806 | "udid" : "C58E4CC0-B3C6-4DB5-9E2A-66C4AD0754AF", 807 | "availabilityError" : "runtime profile not found" 808 | }, 809 | { 810 | "availability" : "(unavailable, runtime profile not found)", 811 | "state" : "Creating", 812 | "isAvailable" : false, 813 | "name" : "iPhone 8", 814 | "udid" : "85D9D9AE-2749-4169-A3DB-94FC9C8EC8F4", 815 | "availabilityError" : "runtime profile not found" 816 | }, 817 | { 818 | "availability" : "(unavailable, runtime profile not found)", 819 | "state" : "Creating", 820 | "isAvailable" : false, 821 | "name" : "iPhone 8 Plus", 822 | "udid" : "EF4C8F12-AE1A-4F92-A16C-11AB189AEB56", 823 | "availabilityError" : "runtime profile not found" 824 | }, 825 | { 826 | "availability" : "(unavailable, runtime profile not found)", 827 | "state" : "Shutdown", 828 | "isAvailable" : false, 829 | "name" : "iPhone SE", 830 | "udid" : "F5CA1927-D7D7-4ACA-ACB7-D02168E3E850", 831 | "availabilityError" : "runtime profile not found" 832 | }, 833 | { 834 | "availability" : "(unavailable, runtime profile not found)", 835 | "state" : "Shutdown", 836 | "isAvailable" : false, 837 | "name" : "iPhone X", 838 | "udid" : "251B939B-15BA-4C6C-AF23-3E81821DF491", 839 | "availabilityError" : "runtime profile not found" 840 | }, 841 | { 842 | "availability" : "(unavailable, runtime profile not found)", 843 | "state" : "Shutdown", 844 | "isAvailable" : false, 845 | "name" : "iPad Air", 846 | "udid" : "5C5A9A1E-AF8A-4F9B-AB6D-B6B14AC95915", 847 | "availabilityError" : "runtime profile not found" 848 | }, 849 | { 850 | "availability" : "(unavailable, runtime profile not found)", 851 | "state" : "Shutdown", 852 | "isAvailable" : false, 853 | "name" : "iPad Air 2", 854 | "udid" : "8B55AF36-334C-4BFE-B208-890D5FAE3B26", 855 | "availabilityError" : "runtime profile not found" 856 | }, 857 | { 858 | "availability" : "(unavailable, runtime profile not found)", 859 | "state" : "Shutdown", 860 | "isAvailable" : false, 861 | "name" : "iPad (5th generation)", 862 | "udid" : "ABC3946C-FCED-413D-944A-832377FD75C7", 863 | "availabilityError" : "runtime profile not found" 864 | }, 865 | { 866 | "availability" : "(unavailable, runtime profile not found)", 867 | "state" : "Shutdown", 868 | "isAvailable" : false, 869 | "name" : "iPad Pro (9.7-inch)", 870 | "udid" : "443E7E08-6339-4AD3-826F-990BC5D2A949", 871 | "availabilityError" : "runtime profile not found" 872 | }, 873 | { 874 | "availability" : "(unavailable, runtime profile not found)", 875 | "state" : "Shutdown", 876 | "isAvailable" : false, 877 | "name" : "iPad Pro (12.9-inch)", 878 | "udid" : "8C523B14-CB9B-4C8B-81B6-C40A073CA002", 879 | "availabilityError" : "runtime profile not found" 880 | }, 881 | { 882 | "availability" : "(unavailable, runtime profile not found)", 883 | "state" : "Shutdown", 884 | "isAvailable" : false, 885 | "name" : "iPad Pro (12.9-inch) (2nd generation)", 886 | "udid" : "846D734B-8CA2-4E77-B2EE-3C21BDD4AFE2", 887 | "availabilityError" : "runtime profile not found" 888 | }, 889 | { 890 | "availability" : "(unavailable, runtime profile not found)", 891 | "state" : "Shutdown", 892 | "isAvailable" : false, 893 | "name" : "iPad Pro (10.5-inch)", 894 | "udid" : "FEE4C73A-4BAB-4BC0-8968-9490E6E591F3", 895 | "availabilityError" : "runtime profile not found" 896 | } 897 | ], 898 | "com.apple.CoreSimulator.SimRuntime.iOS-11-1" : [ 899 | { 900 | "availability" : "(unavailable, runtime profile not found)", 901 | "state" : "Shutdown", 902 | "isAvailable" : false, 903 | "name" : "iPhone 5s", 904 | "udid" : "3AAE5416-18A2-47B0-9C74-9A08E13261EA", 905 | "availabilityError" : "runtime profile not found" 906 | }, 907 | { 908 | "availability" : "(unavailable, runtime profile not found)", 909 | "state" : "Shutdown", 910 | "isAvailable" : false, 911 | "name" : "iPhone 6", 912 | "udid" : "D70E9715-2C0D-4B52-B31D-B45DF45ECB73", 913 | "availabilityError" : "runtime profile not found" 914 | }, 915 | { 916 | "availability" : "(unavailable, runtime profile not found)", 917 | "state" : "Shutdown", 918 | "isAvailable" : false, 919 | "name" : "iPhone 6 Plus", 920 | "udid" : "7F976C82-9224-4C5A-977E-71DE77239D09", 921 | "availabilityError" : "runtime profile not found" 922 | }, 923 | { 924 | "availability" : "(unavailable, runtime profile not found)", 925 | "state" : "Shutdown", 926 | "isAvailable" : false, 927 | "name" : "iPhone 6s", 928 | "udid" : "100310CA-B380-4648-83B2-79071386FEA6", 929 | "availabilityError" : "runtime profile not found" 930 | }, 931 | { 932 | "availability" : "(unavailable, runtime profile not found)", 933 | "state" : "Shutdown", 934 | "isAvailable" : false, 935 | "name" : "iPhone 6s Plus", 936 | "udid" : "18B404DF-0F8C-4A8D-980C-0F436F64B44A", 937 | "availabilityError" : "runtime profile not found" 938 | }, 939 | { 940 | "availability" : "(unavailable, runtime profile not found)", 941 | "state" : "Shutdown", 942 | "isAvailable" : false, 943 | "name" : "iPhone 7", 944 | "udid" : "B099B1DD-E5D8-415D-9E2A-46DBC2949210", 945 | "availabilityError" : "runtime profile not found" 946 | }, 947 | { 948 | "availability" : "(unavailable, runtime profile not found)", 949 | "state" : "Shutdown", 950 | "isAvailable" : false, 951 | "name" : "iPhone 7 Plus", 952 | "udid" : "B46DFDFD-91DC-4D80-880D-EA080102BA3E", 953 | "availabilityError" : "runtime profile not found" 954 | }, 955 | { 956 | "availability" : "(unavailable, runtime profile not found)", 957 | "state" : "Shutdown", 958 | "isAvailable" : false, 959 | "name" : "iPhone 8", 960 | "udid" : "5FD29EFA-E062-43D2-A333-194ABFF78904", 961 | "availabilityError" : "runtime profile not found" 962 | }, 963 | { 964 | "availability" : "(unavailable, runtime profile not found)", 965 | "state" : "Shutdown", 966 | "isAvailable" : false, 967 | "name" : "iPhone 8 Plus", 968 | "udid" : "92773818-E4C7-45A5-BEC0-7BD4D6077F7B", 969 | "availabilityError" : "runtime profile not found" 970 | }, 971 | { 972 | "availability" : "(unavailable, runtime profile not found)", 973 | "state" : "Shutdown", 974 | "isAvailable" : false, 975 | "name" : "iPhone SE", 976 | "udid" : "BD4D1FD0-6713-476C-8ECC-9845D38E0E58", 977 | "availabilityError" : "runtime profile not found" 978 | }, 979 | { 980 | "availability" : "(unavailable, runtime profile not found)", 981 | "state" : "Shutdown", 982 | "isAvailable" : false, 983 | "name" : "iPhone X", 984 | "udid" : "1217BB50-9CD6-42EC-8871-EB8D538F6349", 985 | "availabilityError" : "runtime profile not found" 986 | }, 987 | { 988 | "availability" : "(unavailable, runtime profile not found)", 989 | "state" : "Shutdown", 990 | "isAvailable" : false, 991 | "name" : "iPad Air", 992 | "udid" : "496BEA4E-4129-49EE-8B54-0682C7BA8273", 993 | "availabilityError" : "runtime profile not found" 994 | }, 995 | { 996 | "availability" : "(unavailable, runtime profile not found)", 997 | "state" : "Shutdown", 998 | "isAvailable" : false, 999 | "name" : "iPad Air 2", 1000 | "udid" : "8190A3E9-F95E-4DDD-9DB6-2D46EB24B1E8", 1001 | "availabilityError" : "runtime profile not found" 1002 | }, 1003 | { 1004 | "availability" : "(unavailable, runtime profile not found)", 1005 | "state" : "Shutdown", 1006 | "isAvailable" : false, 1007 | "name" : "iPad (5th generation)", 1008 | "udid" : "2B876B8E-B3B3-4261-BFE6-488A636FDDF7", 1009 | "availabilityError" : "runtime profile not found" 1010 | }, 1011 | { 1012 | "availability" : "(unavailable, runtime profile not found)", 1013 | "state" : "Shutdown", 1014 | "isAvailable" : false, 1015 | "name" : "iPad Pro (9.7-inch)", 1016 | "udid" : "45C736CF-A6BC-4EA8-9CA9-6203B9005B26", 1017 | "availabilityError" : "runtime profile not found" 1018 | }, 1019 | { 1020 | "availability" : "(unavailable, runtime profile not found)", 1021 | "state" : "Shutdown", 1022 | "isAvailable" : false, 1023 | "name" : "iPad Pro (12.9-inch)", 1024 | "udid" : "A19B7E14-3D7C-4F9A-BBCE-B4D146D970D2", 1025 | "availabilityError" : "runtime profile not found" 1026 | }, 1027 | { 1028 | "availability" : "(unavailable, runtime profile not found)", 1029 | "state" : "Shutdown", 1030 | "isAvailable" : false, 1031 | "name" : "iPad Pro (12.9-inch) (2nd generation)", 1032 | "udid" : "3E61A946-02BC-4A24-8FF4-683B59ACBB52", 1033 | "availabilityError" : "runtime profile not found" 1034 | }, 1035 | { 1036 | "availability" : "(unavailable, runtime profile not found)", 1037 | "state" : "Shutdown", 1038 | "isAvailable" : false, 1039 | "name" : "iPad Pro (10.5-inch)", 1040 | "udid" : "FCC5FCC7-BAFC-4EE5-8C3B-B7DF4A37FDA1", 1041 | "availabilityError" : "runtime profile not found" 1042 | } 1043 | ], 1044 | "com.apple.CoreSimulator.SimRuntime.iOS-11-0" : [ 1045 | { 1046 | "availability" : "(unavailable, runtime profile not found)", 1047 | "state" : "Shutdown", 1048 | "isAvailable" : false, 1049 | "name" : "iPhone 5s", 1050 | "udid" : "90EDD7FB-282F-4902-83C0-954F683FB58C", 1051 | "availabilityError" : "runtime profile not found" 1052 | }, 1053 | { 1054 | "availability" : "(unavailable, runtime profile not found)", 1055 | "state" : "Shutdown", 1056 | "isAvailable" : false, 1057 | "name" : "iPhone 6", 1058 | "udid" : "CEFCEEB3-F16E-418F-A8D9-8BDDE22E376B", 1059 | "availabilityError" : "runtime profile not found" 1060 | }, 1061 | { 1062 | "availability" : "(unavailable, runtime profile not found)", 1063 | "state" : "Shutdown", 1064 | "isAvailable" : false, 1065 | "name" : "iPhone 6 Plus", 1066 | "udid" : "62F9F7BA-9529-468A-A9C1-31304514A305", 1067 | "availabilityError" : "runtime profile not found" 1068 | }, 1069 | { 1070 | "availability" : "(unavailable, runtime profile not found)", 1071 | "state" : "Shutdown", 1072 | "isAvailable" : false, 1073 | "name" : "iPhone 6s", 1074 | "udid" : "E47312EF-4A77-46D9-ADC1-C60563BBD462", 1075 | "availabilityError" : "runtime profile not found" 1076 | }, 1077 | { 1078 | "availability" : "(unavailable, runtime profile not found)", 1079 | "state" : "Shutdown", 1080 | "isAvailable" : false, 1081 | "name" : "iPhone 6s Plus", 1082 | "udid" : "3BCF226B-216F-41FB-8BD1-42E1B3D35E96", 1083 | "availabilityError" : "runtime profile not found" 1084 | }, 1085 | { 1086 | "availability" : "(unavailable, runtime profile not found)", 1087 | "state" : "Shutdown", 1088 | "isAvailable" : false, 1089 | "name" : "iPhone 7", 1090 | "udid" : "6278DDAB-E66E-4DC1-BBC2-55340A86077B", 1091 | "availabilityError" : "runtime profile not found" 1092 | }, 1093 | { 1094 | "availability" : "(unavailable, runtime profile not found)", 1095 | "state" : "Shutdown", 1096 | "isAvailable" : false, 1097 | "name" : "iPhone 7 Plus", 1098 | "udid" : "2514D029-A2DF-423A-803D-63F602AF3F6B", 1099 | "availabilityError" : "runtime profile not found" 1100 | }, 1101 | { 1102 | "availability" : "(unavailable, runtime profile not found)", 1103 | "state" : "Shutdown", 1104 | "isAvailable" : false, 1105 | "name" : "iPhone 8", 1106 | "udid" : "6D2E801D-D065-4955-86B7-4AC2F34B8362", 1107 | "availabilityError" : "runtime profile not found" 1108 | }, 1109 | { 1110 | "availability" : "(unavailable, runtime profile not found)", 1111 | "state" : "Shutdown", 1112 | "isAvailable" : false, 1113 | "name" : "iPhone 8 Plus", 1114 | "udid" : "4758B760-7B58-4305-AA96-719D81597C9E", 1115 | "availabilityError" : "runtime profile not found" 1116 | }, 1117 | { 1118 | "availability" : "(unavailable, runtime profile not found)", 1119 | "state" : "Shutdown", 1120 | "isAvailable" : false, 1121 | "name" : "iPhone SE", 1122 | "udid" : "E1AF56B8-FF00-4349-BA96-38B7132A7F02", 1123 | "availabilityError" : "runtime profile not found" 1124 | }, 1125 | { 1126 | "availability" : "(unavailable, runtime profile not found)", 1127 | "state" : "Shutdown", 1128 | "isAvailable" : false, 1129 | "name" : "iPhone X", 1130 | "udid" : "7AEDA190-B14C-4078-A3B7-E863EEB97A70", 1131 | "availabilityError" : "runtime profile not found" 1132 | }, 1133 | { 1134 | "availability" : "(unavailable, runtime profile not found)", 1135 | "state" : "Shutdown", 1136 | "isAvailable" : false, 1137 | "name" : "iPad Air", 1138 | "udid" : "1D906B96-4834-47FC-A7F9-AC8AEAC312A6", 1139 | "availabilityError" : "runtime profile not found" 1140 | }, 1141 | { 1142 | "availability" : "(unavailable, runtime profile not found)", 1143 | "state" : "Shutdown", 1144 | "isAvailable" : false, 1145 | "name" : "iPad Air 2", 1146 | "udid" : "008AE630-3481-4AAB-8D4F-A13A64417C7A", 1147 | "availabilityError" : "runtime profile not found" 1148 | }, 1149 | { 1150 | "availability" : "(unavailable, runtime profile not found)", 1151 | "state" : "Shutdown", 1152 | "isAvailable" : false, 1153 | "name" : "iPad (5th generation)", 1154 | "udid" : "E0691C07-BD74-43D1-AC51-050B43912BCD", 1155 | "availabilityError" : "runtime profile not found" 1156 | }, 1157 | { 1158 | "availability" : "(unavailable, runtime profile not found)", 1159 | "state" : "Shutdown", 1160 | "isAvailable" : false, 1161 | "name" : "iPad Pro (9.7 inch)", 1162 | "udid" : "F70A11BD-C120-452E-8C39-D80FB3581A5D", 1163 | "availabilityError" : "runtime profile not found" 1164 | }, 1165 | { 1166 | "availability" : "(unavailable, runtime profile not found)", 1167 | "state" : "Shutdown", 1168 | "isAvailable" : false, 1169 | "name" : "iPad Pro (12.9 inch)", 1170 | "udid" : "649AA16D-CACF-41D0-9B7E-0C28865F4104", 1171 | "availabilityError" : "runtime profile not found" 1172 | }, 1173 | { 1174 | "availability" : "(unavailable, runtime profile not found)", 1175 | "state" : "Shutdown", 1176 | "isAvailable" : false, 1177 | "name" : "iPad Pro (12.9-inch) (2nd generation)", 1178 | "udid" : "CECC5304-4CF2-4D3E-9AA8-EF4F4B09795E", 1179 | "availabilityError" : "runtime profile not found" 1180 | }, 1181 | { 1182 | "availability" : "(unavailable, runtime profile not found)", 1183 | "state" : "Shutdown", 1184 | "isAvailable" : false, 1185 | "name" : "iPad Pro (10.5-inch)", 1186 | "udid" : "8B7A6405-B969-4FFB-800F-1DA09F88DFF1", 1187 | "availabilityError" : "runtime profile not found" 1188 | } 1189 | ], 1190 | "com.apple.CoreSimulator.SimRuntime.iOS-12-0" : [ 1191 | { 1192 | "availability" : "(unavailable, runtime profile not found)", 1193 | "state" : "Shutdown", 1194 | "isAvailable" : false, 1195 | "name" : "iPhone 5s", 1196 | "udid" : "B98136C1-4D24-4FA7-928A-58338F4C5BA3", 1197 | "availabilityError" : "runtime profile not found" 1198 | }, 1199 | { 1200 | "availability" : "(unavailable, runtime profile not found)", 1201 | "state" : "Shutdown", 1202 | "isAvailable" : false, 1203 | "name" : "iPhone 6", 1204 | "udid" : "E9C206BC-316A-4C79-9B2D-9F298F1F5C3C", 1205 | "availabilityError" : "runtime profile not found" 1206 | }, 1207 | { 1208 | "availability" : "(unavailable, runtime profile not found)", 1209 | "state" : "Shutdown", 1210 | "isAvailable" : false, 1211 | "name" : "iPhone 6 Plus", 1212 | "udid" : "5F37A3BA-3B54-4ACC-A134-4DF1E302A425", 1213 | "availabilityError" : "runtime profile not found" 1214 | }, 1215 | { 1216 | "availability" : "(unavailable, runtime profile not found)", 1217 | "state" : "Shutdown", 1218 | "isAvailable" : false, 1219 | "name" : "iPhone 6s", 1220 | "udid" : "52F274A1-CD64-4910-B81C-164CDAD5B230", 1221 | "availabilityError" : "runtime profile not found" 1222 | }, 1223 | { 1224 | "availability" : "(unavailable, runtime profile not found)", 1225 | "state" : "Shutdown", 1226 | "isAvailable" : false, 1227 | "name" : "iPhone 6s Plus", 1228 | "udid" : "70A5A1D1-7E21-4F2A-8C49-6B78C8E15128", 1229 | "availabilityError" : "runtime profile not found" 1230 | }, 1231 | { 1232 | "availability" : "(unavailable, runtime profile not found)", 1233 | "state" : "Shutdown", 1234 | "isAvailable" : false, 1235 | "name" : "iPhone 7", 1236 | "udid" : "55A13DF4-3DCB-4C70-BB34-8FAA0E677E6F", 1237 | "availabilityError" : "runtime profile not found" 1238 | }, 1239 | { 1240 | "availability" : "(unavailable, runtime profile not found)", 1241 | "state" : "Shutdown", 1242 | "isAvailable" : false, 1243 | "name" : "iPhone 7 Plus", 1244 | "udid" : "78D86A58-BE70-41D1-8011-48511E31AE90", 1245 | "availabilityError" : "runtime profile not found" 1246 | }, 1247 | { 1248 | "availability" : "(unavailable, runtime profile not found)", 1249 | "state" : "Shutdown", 1250 | "isAvailable" : false, 1251 | "name" : "iPhone 8", 1252 | "udid" : "737C5482-0173-4170-97F0-2833EE8A6C08", 1253 | "availabilityError" : "runtime profile not found" 1254 | }, 1255 | { 1256 | "availability" : "(unavailable, runtime profile not found)", 1257 | "state" : "Shutdown", 1258 | "isAvailable" : false, 1259 | "name" : "iPhone 8 Plus", 1260 | "udid" : "C9607C41-9323-4E0A-9E95-26522304A203", 1261 | "availabilityError" : "runtime profile not found" 1262 | }, 1263 | { 1264 | "availability" : "(unavailable, runtime profile not found)", 1265 | "state" : "Shutdown", 1266 | "isAvailable" : false, 1267 | "name" : "iPhone SE", 1268 | "udid" : "3FBFB37B-EC73-4198-901A-8A8123D4569E", 1269 | "availabilityError" : "runtime profile not found" 1270 | }, 1271 | { 1272 | "availability" : "(unavailable, runtime profile not found)", 1273 | "state" : "Shutdown", 1274 | "isAvailable" : false, 1275 | "name" : "iPhone X", 1276 | "udid" : "EFCBBBD8-1D2D-4429-B7F9-CB7AE39AA596", 1277 | "availabilityError" : "runtime profile not found" 1278 | }, 1279 | { 1280 | "availability" : "(unavailable, runtime profile not found)", 1281 | "state" : "Shutdown", 1282 | "isAvailable" : false, 1283 | "name" : "iPad Air", 1284 | "udid" : "A02EA3C8-2FFA-40B7-BB6B-6B446BEF87D7", 1285 | "availabilityError" : "runtime profile not found" 1286 | }, 1287 | { 1288 | "availability" : "(unavailable, runtime profile not found)", 1289 | "state" : "Shutdown", 1290 | "isAvailable" : false, 1291 | "name" : "iPad Air 2", 1292 | "udid" : "86E0A027-8DEB-410F-BC2E-142A328DAD63", 1293 | "availabilityError" : "runtime profile not found" 1294 | }, 1295 | { 1296 | "availability" : "(unavailable, runtime profile not found)", 1297 | "state" : "Shutdown", 1298 | "isAvailable" : false, 1299 | "name" : "iPad (5th generation)", 1300 | "udid" : "C1C2A974-ECC1-431D-A5ED-FE65A894B254", 1301 | "availabilityError" : "runtime profile not found" 1302 | }, 1303 | { 1304 | "availability" : "(unavailable, runtime profile not found)", 1305 | "state" : "Shutdown", 1306 | "isAvailable" : false, 1307 | "name" : "iPad Pro (9.7-inch)", 1308 | "udid" : "7C317FBD-E1BC-4D9E-B7EF-D9E1B5BE3985", 1309 | "availabilityError" : "runtime profile not found" 1310 | }, 1311 | { 1312 | "availability" : "(unavailable, runtime profile not found)", 1313 | "state" : "Shutdown", 1314 | "isAvailable" : false, 1315 | "name" : "iPad Pro (12.9-inch)", 1316 | "udid" : "109C7AE8-F0C9-495A-842C-62561987A931", 1317 | "availabilityError" : "runtime profile not found" 1318 | }, 1319 | { 1320 | "availability" : "(unavailable, runtime profile not found)", 1321 | "state" : "Shutdown", 1322 | "isAvailable" : false, 1323 | "name" : "iPad Pro (12.9-inch) (2nd generation)", 1324 | "udid" : "42392A87-0C14-4A74-9510-0F22FB66865E", 1325 | "availabilityError" : "runtime profile not found" 1326 | }, 1327 | { 1328 | "availability" : "(unavailable, runtime profile not found)", 1329 | "state" : "Shutdown", 1330 | "isAvailable" : false, 1331 | "name" : "iPad Pro (10.5-inch)", 1332 | "udid" : "A82DAB7E-C07E-432D-842A-B35068B67EC4", 1333 | "availabilityError" : "runtime profile not found" 1334 | }, 1335 | { 1336 | "availability" : "(unavailable, runtime profile not found)", 1337 | "state" : "Shutdown", 1338 | "isAvailable" : false, 1339 | "name" : "iPad (6th generation)", 1340 | "udid" : "AFB7893D-2AAA-4002-85FA-10F4077C9859", 1341 | "availabilityError" : "runtime profile not found" 1342 | } 1343 | ], 1344 | "com.apple.CoreSimulator.SimRuntime.tvOS-11-4" : [ 1345 | { 1346 | "availability" : "(unavailable, runtime profile not found)", 1347 | "state" : "Shutdown", 1348 | "isAvailable" : false, 1349 | "name" : "Apple TV", 1350 | "udid" : "02C1B811-1D39-422F-BDE7-0BDAB2EC6501", 1351 | "availabilityError" : "runtime profile not found" 1352 | }, 1353 | { 1354 | "availability" : "(unavailable, runtime profile not found)", 1355 | "state" : "Shutdown", 1356 | "isAvailable" : false, 1357 | "name" : "Apple TV 4K", 1358 | "udid" : "81414175-0390-40B2-85D3-E29C4D2CA570", 1359 | "availabilityError" : "runtime profile not found" 1360 | }, 1361 | { 1362 | "availability" : "(unavailable, runtime profile not found)", 1363 | "state" : "Shutdown", 1364 | "isAvailable" : false, 1365 | "name" : "Apple TV 4K (at 1080p)", 1366 | "udid" : "1305E85B-7680-4430-B6FD-961C409A2B1B", 1367 | "availabilityError" : "runtime profile not found" 1368 | } 1369 | ], 1370 | "com.apple.CoreSimulator.SimRuntime.tvOS-10-2" : [ 1371 | { 1372 | "availability" : "(unavailable, runtime profile not found)", 1373 | "state" : "Shutdown", 1374 | "isAvailable" : false, 1375 | "name" : "Apple TV 1080p", 1376 | "udid" : "D2BE66BC-F5F7-49E8-A152-EACC8FE3EBA4", 1377 | "availabilityError" : "runtime profile not found" 1378 | } 1379 | ], 1380 | "iOS 12.1" : [ 1381 | { 1382 | "availability" : "(available)", 1383 | "state" : "Shutdown", 1384 | "isAvailable" : true, 1385 | "name" : "iPhone 5s", 1386 | "udid" : "E8EC19ED-E22A-4605-84C6-D181C9D50342", 1387 | "availabilityError" : "" 1388 | }, 1389 | { 1390 | "availability" : "(available)", 1391 | "state" : "Shutdown", 1392 | "isAvailable" : true, 1393 | "name" : "iPhone 6", 1394 | "udid" : "0192FC05-8014-447B-91A6-0DE652FBDEAE", 1395 | "availabilityError" : "" 1396 | }, 1397 | { 1398 | "availability" : "(available)", 1399 | "state" : "Shutdown", 1400 | "isAvailable" : true, 1401 | "name" : "iPhone 6 Plus", 1402 | "udid" : "5972980A-B6BF-4157-A05D-872E6CA1103E", 1403 | "availabilityError" : "" 1404 | }, 1405 | { 1406 | "availability" : "(available)", 1407 | "state" : "Shutdown", 1408 | "isAvailable" : true, 1409 | "name" : "iPhone 6s", 1410 | "udid" : "9446A2F8-DC08-44C1-A39C-76C4E0D8CDFB", 1411 | "availabilityError" : "" 1412 | }, 1413 | { 1414 | "availability" : "(available)", 1415 | "state" : "Shutdown", 1416 | "isAvailable" : true, 1417 | "name" : "iPhone 6s Plus", 1418 | "udid" : "D4FC8B93-A81E-4FBC-860B-508E60D2A12D", 1419 | "availabilityError" : "" 1420 | }, 1421 | { 1422 | "availability" : "(available)", 1423 | "state" : "Shutdown", 1424 | "isAvailable" : true, 1425 | "name" : "iPhone 7", 1426 | "udid" : "DC9064F6-5230-4CE1-9BA0-49E69E468A92", 1427 | "availabilityError" : "" 1428 | }, 1429 | { 1430 | "availability" : "(available)", 1431 | "state" : "Shutdown", 1432 | "isAvailable" : true, 1433 | "name" : "iPhone 7 Plus", 1434 | "udid" : "70CE21C9-28C4-4B8A-862A-64855A4541FB", 1435 | "availabilityError" : "" 1436 | }, 1437 | { 1438 | "availability" : "(available)", 1439 | "state" : "Shutdown", 1440 | "isAvailable" : true, 1441 | "name" : "iPhone 8", 1442 | "udid" : "6778C738-4DBC-48F5-A846-9ED4EAF59A71", 1443 | "availabilityError" : "" 1444 | }, 1445 | { 1446 | "availability" : "(available)", 1447 | "state" : "Shutdown", 1448 | "isAvailable" : true, 1449 | "name" : "iPhone 8 Plus", 1450 | "udid" : "2205E9C2-F936-465A-A1CC-6DD2F39C7B94", 1451 | "availabilityError" : "" 1452 | }, 1453 | { 1454 | "availability" : "(available)", 1455 | "state" : "Shutdown", 1456 | "isAvailable" : true, 1457 | "name" : "iPhone SE", 1458 | "udid" : "E59371AA-3EE7-4A21-8A5C-BF2FA1296A2A", 1459 | "availabilityError" : "" 1460 | }, 1461 | { 1462 | "availability" : "(available)", 1463 | "state" : "Shutdown", 1464 | "isAvailable" : true, 1465 | "name" : "iPhone X", 1466 | "udid" : "BAC3ADB2-66B2-41C0-AF0D-8D4D58E2E88A", 1467 | "availabilityError" : "" 1468 | }, 1469 | { 1470 | "availability" : "(available)", 1471 | "state" : "Shutdown", 1472 | "isAvailable" : true, 1473 | "name" : "iPhone XS", 1474 | "udid" : "B9102A44-5FBE-4E4E-8BDC-1D49C75A73A2", 1475 | "availabilityError" : "" 1476 | }, 1477 | { 1478 | "availability" : "(available)", 1479 | "state" : "Shutdown", 1480 | "isAvailable" : true, 1481 | "name" : "iPhone XS Max", 1482 | "udid" : "A2966FCA-5122-48C5-A022-F5A1B5032247", 1483 | "availabilityError" : "" 1484 | }, 1485 | { 1486 | "availability" : "(available)", 1487 | "state" : "Shutdown", 1488 | "isAvailable" : true, 1489 | "name" : "iPhone XR", 1490 | "udid" : "AD023491-B8D8-4B5E-A9C4-CCBE03F0C073", 1491 | "availabilityError" : "" 1492 | }, 1493 | { 1494 | "availability" : "(available)", 1495 | "state" : "Shutdown", 1496 | "isAvailable" : true, 1497 | "name" : "iPad Air", 1498 | "udid" : "9220519A-15F8-448B-B74F-978099021104", 1499 | "availabilityError" : "" 1500 | }, 1501 | { 1502 | "availability" : "(available)", 1503 | "state" : "Shutdown", 1504 | "isAvailable" : true, 1505 | "name" : "iPad Air 2", 1506 | "udid" : "F46C3368-0363-4469-9E91-E4177342C605", 1507 | "availabilityError" : "" 1508 | }, 1509 | { 1510 | "availability" : "(available)", 1511 | "state" : "Shutdown", 1512 | "isAvailable" : true, 1513 | "name" : "iPad (5th generation)", 1514 | "udid" : "CDA78104-F19E-4A32-9037-1FD270168AAE", 1515 | "availabilityError" : "" 1516 | }, 1517 | { 1518 | "availability" : "(available)", 1519 | "state" : "Shutdown", 1520 | "isAvailable" : true, 1521 | "name" : "iPad Pro (9.7-inch)", 1522 | "udid" : "C25B77F7-A1D9-4852-8180-6E4A3EDE9C5F", 1523 | "availabilityError" : "" 1524 | }, 1525 | { 1526 | "availability" : "(available)", 1527 | "state" : "Shutdown", 1528 | "isAvailable" : true, 1529 | "name" : "iPad Pro (12.9-inch)", 1530 | "udid" : "F16AD7CC-ADD9-4EA3-89D7-678656B7BDB1", 1531 | "availabilityError" : "" 1532 | }, 1533 | { 1534 | "availability" : "(available)", 1535 | "state" : "Shutdown", 1536 | "isAvailable" : true, 1537 | "name" : "iPad Pro (12.9-inch) (2nd generation)", 1538 | "udid" : "18F3B533-EC48-4F7A-8814-F94FEC7B288A", 1539 | "availabilityError" : "" 1540 | }, 1541 | { 1542 | "availability" : "(available)", 1543 | "state" : "Shutdown", 1544 | "isAvailable" : true, 1545 | "name" : "iPad Pro (10.5-inch)", 1546 | "udid" : "19375895-F182-4D96-88E2-98179120F3CE", 1547 | "availabilityError" : "" 1548 | }, 1549 | { 1550 | "availability" : "(available)", 1551 | "state" : "Shutdown", 1552 | "isAvailable" : true, 1553 | "name" : "iPad (6th generation)", 1554 | "udid" : "0E9AD69F-C33E-400E-B550-86DF0A5E445B", 1555 | "availabilityError" : "" 1556 | }, 1557 | { 1558 | "availability" : "(available)", 1559 | "state" : "Shutdown", 1560 | "isAvailable" : true, 1561 | "name" : "iPad Pro (11-inch)", 1562 | "udid" : "3337AF03-57B5-495B-A68F-C6B8D2253E8D", 1563 | "availabilityError" : "" 1564 | }, 1565 | { 1566 | "availability" : "(available)", 1567 | "state" : "Shutdown", 1568 | "isAvailable" : true, 1569 | "name" : "iPad Pro (12.9-inch) (3rd generation)", 1570 | "udid" : "AFA7AAFA-32D1-4C30-8373-2BAFB86FA84C", 1571 | "availabilityError" : "" 1572 | } 1573 | ], 1574 | "com.apple.CoreSimulator.SimRuntime.tvOS-11-3" : [ 1575 | { 1576 | "availability" : "(unavailable, runtime profile not found)", 1577 | "state" : "Shutdown", 1578 | "isAvailable" : false, 1579 | "name" : "Apple TV", 1580 | "udid" : "328941EE-50EC-4361-985A-2D165423AD41", 1581 | "availabilityError" : "runtime profile not found" 1582 | }, 1583 | { 1584 | "availability" : "(unavailable, runtime profile not found)", 1585 | "state" : "Shutdown", 1586 | "isAvailable" : false, 1587 | "name" : "Apple TV 4K", 1588 | "udid" : "849AFB11-B3DB-4C88-9017-331630ACD385", 1589 | "availabilityError" : "runtime profile not found" 1590 | }, 1591 | { 1592 | "availability" : "(unavailable, runtime profile not found)", 1593 | "state" : "Shutdown", 1594 | "isAvailable" : false, 1595 | "name" : "Apple TV 4K (at 1080p)", 1596 | "udid" : "65664596-8C96-47BB-B7BB-7DDFFAE72F8C", 1597 | "availabilityError" : "runtime profile not found" 1598 | } 1599 | ], 1600 | "com.apple.CoreSimulator.SimRuntime.tvOS-10-1" : [ 1601 | { 1602 | "availability" : "(unavailable, runtime profile not found)", 1603 | "state" : "Shutdown", 1604 | "isAvailable" : false, 1605 | "name" : "Apple TV 1080p", 1606 | "udid" : "94187B12-9791-4163-86E4-C632392AE715", 1607 | "availabilityError" : "runtime profile not found" 1608 | } 1609 | ], 1610 | "com.apple.CoreSimulator.SimRuntime.watchOS-3-2" : [ 1611 | { 1612 | "availability" : "(unavailable, runtime profile not found)", 1613 | "state" : "Shutdown", 1614 | "isAvailable" : false, 1615 | "name" : "Apple Watch - 38mm", 1616 | "udid" : "934C236B-1651-4FE5-A0CB-D8408ED73F26", 1617 | "availabilityError" : "runtime profile not found" 1618 | }, 1619 | { 1620 | "availability" : "(unavailable, runtime profile not found)", 1621 | "state" : "Shutdown", 1622 | "isAvailable" : false, 1623 | "name" : "Apple Watch - 42mm", 1624 | "udid" : "4C69478B-F0BA-47EE-BE03-7EBDC046A821", 1625 | "availabilityError" : "runtime profile not found" 1626 | }, 1627 | { 1628 | "availability" : "(unavailable, runtime profile not found)", 1629 | "state" : "Shutdown", 1630 | "isAvailable" : false, 1631 | "name" : "Apple Watch Series 2 - 38mm", 1632 | "udid" : "D505C680-CDAE-41F8-8570-EDB731D5BC7E", 1633 | "availabilityError" : "runtime profile not found" 1634 | }, 1635 | { 1636 | "availability" : "(unavailable, runtime profile not found)", 1637 | "state" : "Shutdown", 1638 | "isAvailable" : false, 1639 | "name" : "Apple Watch Series 2 - 42mm", 1640 | "udid" : "BF47F600-1651-44F1-BF85-F30015257135", 1641 | "availabilityError" : "runtime profile not found" 1642 | } 1643 | ], 1644 | "com.apple.CoreSimulator.SimRuntime.tvOS-11-1" : [ 1645 | { 1646 | "availability" : "(unavailable, runtime profile not found)", 1647 | "state" : "Shutdown", 1648 | "isAvailable" : false, 1649 | "name" : "Apple TV", 1650 | "udid" : "2F4A4A3D-27CC-48D9-A54F-7603908CB8DA", 1651 | "availabilityError" : "runtime profile not found" 1652 | }, 1653 | { 1654 | "availability" : "(unavailable, runtime profile not found)", 1655 | "state" : "Shutdown", 1656 | "isAvailable" : false, 1657 | "name" : "Apple TV 4K", 1658 | "udid" : "2C6C003F-FC34-442E-A4D4-511CAAEC83F2", 1659 | "availabilityError" : "runtime profile not found" 1660 | }, 1661 | { 1662 | "availability" : "(unavailable, runtime profile not found)", 1663 | "state" : "Shutdown", 1664 | "isAvailable" : false, 1665 | "name" : "Apple TV 4K (at 1080p)", 1666 | "udid" : "FB7745D5-549E-414C-9E52-D307F8AAFD5B", 1667 | "availabilityError" : "runtime profile not found" 1668 | } 1669 | ], 1670 | "com.apple.CoreSimulator.SimRuntime.tvOS-11-0" : [ 1671 | { 1672 | "availability" : "(unavailable, runtime profile not found)", 1673 | "state" : "Shutdown", 1674 | "isAvailable" : false, 1675 | "name" : "Apple TV 1080p", 1676 | "udid" : "81186783-7F0F-460F-96AF-4BDA342D5E6A", 1677 | "availabilityError" : "runtime profile not found" 1678 | }, 1679 | { 1680 | "availability" : "(unavailable, runtime profile not found)", 1681 | "state" : "Shutdown", 1682 | "isAvailable" : false, 1683 | "name" : "Apple TV 4K", 1684 | "udid" : "F44218AA-8C91-443F-B950-3C67508DD9D5", 1685 | "availabilityError" : "runtime profile not found" 1686 | }, 1687 | { 1688 | "availability" : "(unavailable, runtime profile not found)", 1689 | "state" : "Shutdown", 1690 | "isAvailable" : false, 1691 | "name" : "Apple TV 4K (at 1080p)", 1692 | "udid" : "89FCABA7-5235-45DB-8067-F75FB591CA60", 1693 | "availabilityError" : "runtime profile not found" 1694 | } 1695 | ], 1696 | "iOS 9.3" : [ 1697 | { 1698 | "availability" : "(available)", 1699 | "state" : "Shutdown", 1700 | "isAvailable" : true, 1701 | "name" : "iPhone 4s", 1702 | "udid" : "33070AF6-7B5B-44D0-BB78-75BA7C05315E", 1703 | "availabilityError" : "" 1704 | }, 1705 | { 1706 | "availability" : "(available)", 1707 | "state" : "Shutdown", 1708 | "isAvailable" : true, 1709 | "name" : "iPhone 5", 1710 | "udid" : "6D668899-6DF4-4A89-963C-12EB96D03597", 1711 | "availabilityError" : "" 1712 | }, 1713 | { 1714 | "availability" : "(available)", 1715 | "state" : "Shutdown", 1716 | "isAvailable" : true, 1717 | "name" : "iPhone 5s", 1718 | "udid" : "B750AFE7-2D27-4979-86F5-A0B23BD1B4EC", 1719 | "availabilityError" : "" 1720 | }, 1721 | { 1722 | "availability" : "(available)", 1723 | "state" : "Booted", 1724 | "isAvailable" : true, 1725 | "name" : "iPhone 6", 1726 | "udid" : "595A086C-DA30-4B75-806E-3D8253ED6A56", 1727 | "availabilityError" : "" 1728 | }, 1729 | { 1730 | "availability" : "(available)", 1731 | "state" : "Shutdown", 1732 | "isAvailable" : true, 1733 | "name" : "iPhone 6 Plus", 1734 | "udid" : "605B7D9C-290A-4B7A-BF1F-76A2673A2B34", 1735 | "availabilityError" : "" 1736 | }, 1737 | { 1738 | "availability" : "(available)", 1739 | "state" : "Shutdown", 1740 | "isAvailable" : true, 1741 | "name" : "iPhone 6s", 1742 | "udid" : "B9E1D1F2-8BE9-475E-9E05-EF0B2D90B2B7", 1743 | "availabilityError" : "" 1744 | }, 1745 | { 1746 | "availability" : "(available)", 1747 | "state" : "Shutdown", 1748 | "isAvailable" : true, 1749 | "name" : "iPhone 6s Plus", 1750 | "udid" : "B60DF89E-E112-47FA-9E0F-246BCC5044F9", 1751 | "availabilityError" : "" 1752 | }, 1753 | { 1754 | "availability" : "(available)", 1755 | "state" : "Shutdown", 1756 | "isAvailable" : true, 1757 | "name" : "iPad 2", 1758 | "udid" : "E71F4159-F976-4984-B7E7-55C0E4B74961", 1759 | "availabilityError" : "" 1760 | }, 1761 | { 1762 | "availability" : "(available)", 1763 | "state" : "Shutdown", 1764 | "isAvailable" : true, 1765 | "name" : "iPad Retina", 1766 | "udid" : "02328537-D517-43E8-9792-C5B691848484", 1767 | "availabilityError" : "" 1768 | }, 1769 | { 1770 | "availability" : "(available)", 1771 | "state" : "Shutdown", 1772 | "isAvailable" : true, 1773 | "name" : "iPad Air", 1774 | "udid" : "1BB405F2-EBC2-420E-9D10-77F79D9C3C74", 1775 | "availabilityError" : "" 1776 | }, 1777 | { 1778 | "availability" : "(available)", 1779 | "state" : "Shutdown", 1780 | "isAvailable" : true, 1781 | "name" : "iPad Air 2", 1782 | "udid" : "B0E12BA8-7E7E-4377-8963-DEAD06915043", 1783 | "availabilityError" : "" 1784 | }, 1785 | { 1786 | "availability" : "(available)", 1787 | "state" : "Shutdown", 1788 | "isAvailable" : true, 1789 | "name" : "iPad Pro", 1790 | "udid" : "D24482EA-9607-412B-8C1F-79829772F182", 1791 | "availabilityError" : "" 1792 | } 1793 | ], 1794 | "iOS 11.4" : [ 1795 | { 1796 | "availability" : "(available)", 1797 | "state" : "Shutdown", 1798 | "isAvailable" : true, 1799 | "name" : "iPhone 5s", 1800 | "udid" : "6908145F-F7BE-4969-9A11-C2620AB377F1", 1801 | "availabilityError" : "" 1802 | }, 1803 | { 1804 | "availability" : "(available)", 1805 | "state" : "Shutdown", 1806 | "isAvailable" : true, 1807 | "name" : "iPhone 6", 1808 | "udid" : "45E99D84-1EC1-45AE-A24F-6152EF722664", 1809 | "availabilityError" : "" 1810 | }, 1811 | { 1812 | "availability" : "(available)", 1813 | "state" : "Shutdown", 1814 | "isAvailable" : true, 1815 | "name" : "iPhone 6 Plus", 1816 | "udid" : "7DC6F4AF-72D0-4E0E-8160-EAD94F2B7C6E", 1817 | "availabilityError" : "" 1818 | }, 1819 | { 1820 | "availability" : "(available)", 1821 | "state" : "Shutdown", 1822 | "isAvailable" : true, 1823 | "name" : "iPhone 6s", 1824 | "udid" : "86676BBB-B32C-4F32-8A9E-E46AFAF02F11", 1825 | "availabilityError" : "" 1826 | }, 1827 | { 1828 | "availability" : "(available)", 1829 | "state" : "Shutdown", 1830 | "isAvailable" : true, 1831 | "name" : "iPhone 6s Plus", 1832 | "udid" : "F2AEE8DA-1EE0-4CE0-A366-79D8B1D1764D", 1833 | "availabilityError" : "" 1834 | }, 1835 | { 1836 | "availability" : "(available)", 1837 | "state" : "Shutdown", 1838 | "isAvailable" : true, 1839 | "name" : "iPhone 7", 1840 | "udid" : "629AF181-7009-4CA6-B7D6-1317D71CF71C", 1841 | "availabilityError" : "" 1842 | }, 1843 | { 1844 | "availability" : "(available)", 1845 | "state" : "Shutdown", 1846 | "isAvailable" : true, 1847 | "name" : "iPhone 7 Plus", 1848 | "udid" : "7262FA25-90CA-4D29-A436-76514B07DEA0", 1849 | "availabilityError" : "" 1850 | }, 1851 | { 1852 | "availability" : "(available)", 1853 | "state" : "Shutdown", 1854 | "isAvailable" : true, 1855 | "name" : "iPhone 8", 1856 | "udid" : "204B66C8-C2D2-436A-B6E0-EA95CE2B15B4", 1857 | "availabilityError" : "" 1858 | }, 1859 | { 1860 | "availability" : "(available)", 1861 | "state" : "Shutdown", 1862 | "isAvailable" : true, 1863 | "name" : "iPhone 8 Plus", 1864 | "udid" : "72FB6F91-0417-4097-B45A-0B2906F3C85B", 1865 | "availabilityError" : "" 1866 | }, 1867 | { 1868 | "availability" : "(available)", 1869 | "state" : "Shutdown", 1870 | "isAvailable" : true, 1871 | "name" : "iPhone SE", 1872 | "udid" : "950013FA-CB27-4DCA-8B6B-955B03720655", 1873 | "availabilityError" : "" 1874 | }, 1875 | { 1876 | "availability" : "(available)", 1877 | "state" : "Shutdown", 1878 | "isAvailable" : true, 1879 | "name" : "iPhone X", 1880 | "udid" : "DC3C3E48-D66F-40C5-87AE-B92432A77DDD", 1881 | "availabilityError" : "" 1882 | }, 1883 | { 1884 | "availability" : "(available)", 1885 | "state" : "Shutdown", 1886 | "isAvailable" : true, 1887 | "name" : "iPad Air", 1888 | "udid" : "4FC85C1C-C775-4750-B119-51D129716E75", 1889 | "availabilityError" : "" 1890 | }, 1891 | { 1892 | "availability" : "(available)", 1893 | "state" : "Shutdown", 1894 | "isAvailable" : true, 1895 | "name" : "iPad Air 2", 1896 | "udid" : "6126F21B-A607-4BBF-B1AF-B2DABC071E63", 1897 | "availabilityError" : "" 1898 | }, 1899 | { 1900 | "availability" : "(available)", 1901 | "state" : "Shutdown", 1902 | "isAvailable" : true, 1903 | "name" : "iPad (5th generation)", 1904 | "udid" : "E16EBA19-9E08-4DE2-BC3E-C286FCF9E410", 1905 | "availabilityError" : "" 1906 | }, 1907 | { 1908 | "availability" : "(available)", 1909 | "state" : "Shutdown", 1910 | "isAvailable" : true, 1911 | "name" : "iPad Pro (9.7-inch)", 1912 | "udid" : "ABF09403-5528-459D-AC85-41595B993049", 1913 | "availabilityError" : "" 1914 | }, 1915 | { 1916 | "availability" : "(available)", 1917 | "state" : "Shutdown", 1918 | "isAvailable" : true, 1919 | "name" : "iPad Pro (12.9-inch)", 1920 | "udid" : "B633B34B-6886-4F1F-A06F-0E1661B5E49C", 1921 | "availabilityError" : "" 1922 | }, 1923 | { 1924 | "availability" : "(available)", 1925 | "state" : "Shutdown", 1926 | "isAvailable" : true, 1927 | "name" : "iPad Pro (12.9-inch) (2nd generation)", 1928 | "udid" : "18FFF3F9-D3E6-43E0-9D04-9A944FA7D8F1", 1929 | "availabilityError" : "" 1930 | }, 1931 | { 1932 | "availability" : "(available)", 1933 | "state" : "Shutdown", 1934 | "isAvailable" : true, 1935 | "name" : "iPad Pro (10.5-inch)", 1936 | "udid" : "C7BA5898-7007-4E50-A48F-5E4E24F238CE", 1937 | "availabilityError" : "" 1938 | } 1939 | ], 1940 | "com.apple.CoreSimulator.SimRuntime.watchOS-4-1" : [ 1941 | { 1942 | "availability" : "(unavailable, runtime profile not found)", 1943 | "state" : "Shutdown", 1944 | "isAvailable" : false, 1945 | "name" : "Apple Watch - 38mm", 1946 | "udid" : "A5F7E176-9273-43F7-8393-AC03E125BE8B", 1947 | "availabilityError" : "runtime profile not found" 1948 | }, 1949 | { 1950 | "availability" : "(unavailable, runtime profile not found)", 1951 | "state" : "Shutdown", 1952 | "isAvailable" : false, 1953 | "name" : "Apple Watch - 42mm", 1954 | "udid" : "D1D1D21A-F0DC-452D-A750-CE621FC406CD", 1955 | "availabilityError" : "runtime profile not found" 1956 | }, 1957 | { 1958 | "availability" : "(unavailable, runtime profile not found)", 1959 | "state" : "Shutdown", 1960 | "isAvailable" : false, 1961 | "name" : "Apple Watch Series 2 - 38mm", 1962 | "udid" : "9ECCAB27-B643-48A1-B9F6-7DBD1B61344A", 1963 | "availabilityError" : "runtime profile not found" 1964 | }, 1965 | { 1966 | "availability" : "(unavailable, runtime profile not found)", 1967 | "state" : "Shutdown", 1968 | "isAvailable" : false, 1969 | "name" : "Apple Watch Series 2 - 42mm", 1970 | "udid" : "35945A6D-261E-4F70-A848-00B292C012F9", 1971 | "availabilityError" : "runtime profile not found" 1972 | }, 1973 | { 1974 | "availability" : "(unavailable, runtime profile not found)", 1975 | "state" : "Shutdown", 1976 | "isAvailable" : false, 1977 | "name" : "Apple Watch Series 3 - 38mm", 1978 | "udid" : "7663D5B9-302B-4DE9-8975-C090A3ECF113", 1979 | "availabilityError" : "runtime profile not found" 1980 | }, 1981 | { 1982 | "availability" : "(unavailable, runtime profile not found)", 1983 | "state" : "Shutdown", 1984 | "isAvailable" : false, 1985 | "name" : "Apple Watch Series 3 - 42mm", 1986 | "udid" : "12319834-C977-4727-AB33-7C9326BCA687", 1987 | "availabilityError" : "runtime profile not found" 1988 | } 1989 | ], 1990 | "com.apple.CoreSimulator.SimRuntime.watchOS-5-0" : [ 1991 | { 1992 | "availability" : "(unavailable, runtime profile not found)", 1993 | "state" : "Shutdown", 1994 | "isAvailable" : false, 1995 | "name" : "Apple Watch - 38mm", 1996 | "udid" : "0E7FB27C-5D34-4972-80C3-3C394CFF8259", 1997 | "availabilityError" : "runtime profile not found" 1998 | }, 1999 | { 2000 | "availability" : "(unavailable, runtime profile not found)", 2001 | "state" : "Shutdown", 2002 | "isAvailable" : false, 2003 | "name" : "Apple Watch - 42mm", 2004 | "udid" : "2D58CD2C-1A66-4A8D-BC89-B4E511494E8D", 2005 | "availabilityError" : "runtime profile not found" 2006 | }, 2007 | { 2008 | "availability" : "(unavailable, runtime profile not found)", 2009 | "state" : "Shutdown", 2010 | "isAvailable" : false, 2011 | "name" : "Apple Watch Series 2 - 38mm", 2012 | "udid" : "B98423AE-1AF7-452A-8C59-3DEE3A7BB9E8", 2013 | "availabilityError" : "runtime profile not found" 2014 | }, 2015 | { 2016 | "availability" : "(unavailable, runtime profile not found)", 2017 | "state" : "Shutdown", 2018 | "isAvailable" : false, 2019 | "name" : "Apple Watch Series 2 - 42mm", 2020 | "udid" : "85FAE824-2D2C-417D-ABBA-7B4B7F4F793E", 2021 | "availabilityError" : "runtime profile not found" 2022 | }, 2023 | { 2024 | "availability" : "(unavailable, runtime profile not found)", 2025 | "state" : "Shutdown", 2026 | "isAvailable" : false, 2027 | "name" : "Apple Watch Series 3 - 38mm", 2028 | "udid" : "F48EDBC1-04A0-425A-9356-D606D38B6DBA", 2029 | "availabilityError" : "runtime profile not found" 2030 | }, 2031 | { 2032 | "availability" : "(unavailable, runtime profile not found)", 2033 | "state" : "Shutdown", 2034 | "isAvailable" : false, 2035 | "name" : "Apple Watch Series 3 - 42mm", 2036 | "udid" : "B7C8A79D-9DD2-4E85-B8A9-13D6D46A44C0", 2037 | "availabilityError" : "runtime profile not found" 2038 | } 2039 | ] 2040 | }, 2041 | "pairs" : { 2042 | "C482FCBE-3EA5-4726-A18E-C2289AC97181" : { 2043 | "watch" : { 2044 | "name" : "Apple Watch Series 2 - 38mm", 2045 | "udid" : "A089A64E-A83A-4E03-97AC-4065C2767F4F", 2046 | "state" : "Shutdown" 2047 | }, 2048 | "phone" : { 2049 | "name" : "iPhone 7", 2050 | "udid" : "E7FF4BC9-016D-444C-A11C-00F17447B5C0", 2051 | "state" : "Shutdown" 2052 | }, 2053 | "state" : "(unavailable)" 2054 | }, 2055 | "3CF04E41-DCB0-4DFA-B230-94767AF83754" : { 2056 | "watch" : { 2057 | "name" : "Apple Watch Series 2 - 42mm", 2058 | "udid" : "9A7C0B24-071F-4FEF-8D78-F109D51E5EA0", 2059 | "state" : "Shutdown" 2060 | }, 2061 | "phone" : { 2062 | "name" : "iPhone 7 Plus", 2063 | "udid" : "930EE33E-3688-4FD2-997A-41D5B2E8D2AD", 2064 | "state" : "Shutdown" 2065 | }, 2066 | "state" : "(unavailable)" 2067 | }, 2068 | "11518B00-90AA-40D9-A361-486AE3BBBD23" : { 2069 | "watch" : { 2070 | "name" : "Apple Watch - 38mm", 2071 | "udid" : "934C236B-1651-4FE5-A0CB-D8408ED73F26", 2072 | "state" : "Shutdown" 2073 | }, 2074 | "phone" : { 2075 | "name" : "iPhone 6s", 2076 | "udid" : "D649BEC5-2F44-43ED-90D3-0CEA1505B3AA", 2077 | "state" : "Shutdown" 2078 | }, 2079 | "state" : "(unavailable)" 2080 | }, 2081 | "4E765022-977B-46B5-878F-3F8BD1C109B8" : { 2082 | "watch" : { 2083 | "name" : "Apple Watch Series 2 - 42mm", 2084 | "udid" : "FAAC4B0F-A273-4E71-A193-D6098AE3D0B1", 2085 | "state" : "Shutdown" 2086 | }, 2087 | "phone" : { 2088 | "name" : "iPhone 7 Plus", 2089 | "udid" : "2514D029-A2DF-423A-803D-63F602AF3F6B", 2090 | "state" : "Shutdown" 2091 | }, 2092 | "state" : "(unavailable)" 2093 | }, 2094 | "F104E386-8588-4535-B1BC-9C70B1FBF827" : { 2095 | "watch" : { 2096 | "name" : "Apple Watch Series 3 - 42mm", 2097 | "udid" : "B7C8A79D-9DD2-4E85-B8A9-13D6D46A44C0", 2098 | "state" : "Shutdown" 2099 | }, 2100 | "phone" : { 2101 | "name" : "iPhone 8 Plus", 2102 | "udid" : "C9607C41-9323-4E0A-9E95-26522304A203", 2103 | "state" : "Shutdown" 2104 | }, 2105 | "state" : "(unavailable)" 2106 | }, 2107 | "ACC60596-CAF9-414E-8D6A-0EECAB8F1392" : { 2108 | "watch" : { 2109 | "name" : "Apple Watch Series 2 - 38mm", 2110 | "udid" : "6621CC54-C40D-4B3A-B3D6-3B1451CE5C6C", 2111 | "state" : "Shutdown" 2112 | }, 2113 | "phone" : { 2114 | "name" : "iPhone 7", 2115 | "udid" : "6278DDAB-E66E-4DC1-BBC2-55340A86077B", 2116 | "state" : "Shutdown" 2117 | }, 2118 | "state" : "(unavailable)" 2119 | }, 2120 | "54AEA67D-DA3C-4CCE-88F2-EB53AF9D9652" : { 2121 | "watch" : { 2122 | "name" : "Apple Watch Series 2 - 42mm", 2123 | "udid" : "BF47F600-1651-44F1-BF85-F30015257135", 2124 | "state" : "Shutdown" 2125 | }, 2126 | "phone" : { 2127 | "name" : "iPhone 7 Plus", 2128 | "udid" : "4F79A21C-D3A4-432F-A655-BE7966B5C605", 2129 | "state" : "Shutdown" 2130 | }, 2131 | "state" : "(unavailable)" 2132 | }, 2133 | "E7B45654-1DA4-4E7E-96F3-942B0F49ECE3" : { 2134 | "watch" : { 2135 | "name" : "Apple Watch Series 2 - 38mm", 2136 | "udid" : "D505C680-CDAE-41F8-8570-EDB731D5BC7E", 2137 | "state" : "Shutdown" 2138 | }, 2139 | "phone" : { 2140 | "name" : "iPhone 7", 2141 | "udid" : "739FFF90-F2EF-488A-A88A-B3AADA8831DE", 2142 | "state" : "Shutdown" 2143 | }, 2144 | "state" : "(unavailable)" 2145 | }, 2146 | "A5B2BE18-15D1-403F-A51D-B58748637816" : { 2147 | "watch" : { 2148 | "name" : "Apple Watch Series 3 - 42mm", 2149 | "udid" : "D0586D44-2D12-4D99-BF83-1FBAC0D1E1EA", 2150 | "state" : "Shutdown" 2151 | }, 2152 | "phone" : { 2153 | "name" : "iPhone 8 Plus", 2154 | "udid" : "72FB6F91-0417-4097-B45A-0B2906F3C85B", 2155 | "state" : "Shutdown" 2156 | }, 2157 | "state" : "(unavailable)" 2158 | }, 2159 | "4E6E75BA-24AF-45E4-922D-ADB26DD94E80" : { 2160 | "watch" : { 2161 | "name" : "Apple Watch Series 2 - 42mm", 2162 | "udid" : "2120D7B5-F478-4821-A727-2F4E037AE59C", 2163 | "state" : "Shutdown" 2164 | }, 2165 | "phone" : { 2166 | "name" : "iPhone 7 Plus", 2167 | "udid" : "7262FA25-90CA-4D29-A436-76514B07DEA0", 2168 | "state" : "Shutdown" 2169 | }, 2170 | "state" : "(unavailable)" 2171 | }, 2172 | "82FD0F64-CC75-4D09-A030-0F688509F904" : { 2173 | "watch" : { 2174 | "name" : "Apple Watch Series 3 - 38mm", 2175 | "udid" : "9611F480-2E75-4CEB-894A-368E4D146978", 2176 | "state" : "Shutdown" 2177 | }, 2178 | "phone" : { 2179 | "name" : "iPhone 8", 2180 | "udid" : "204B66C8-C2D2-436A-B6E0-EA95CE2B15B4", 2181 | "state" : "Shutdown" 2182 | }, 2183 | "state" : "(unavailable)" 2184 | }, 2185 | "BA2ECE7C-4CEB-4267-AE0B-7DEF8E3A4ADA" : { 2186 | "watch" : { 2187 | "name" : "Apple Watch Series 2 - 38mm", 2188 | "udid" : "94B8369F-EADC-41EC-A67F-E5C49B197892", 2189 | "state" : "Shutdown" 2190 | }, 2191 | "phone" : { 2192 | "name" : "iPhone 7", 2193 | "udid" : "629AF181-7009-4CA6-B7D6-1317D71CF71C", 2194 | "state" : "Shutdown" 2195 | }, 2196 | "state" : "(unavailable)" 2197 | }, 2198 | "D383D4FB-98AD-489D-8972-548077111E46" : { 2199 | "watch" : { 2200 | "name" : "Apple Watch - 42mm", 2201 | "udid" : "4C69478B-F0BA-47EE-BE03-7EBDC046A821", 2202 | "state" : "Shutdown" 2203 | }, 2204 | "phone" : { 2205 | "name" : "iPhone 6s Plus", 2206 | "udid" : "B817B81F-D7AF-486F-85A6-F7151788F163", 2207 | "state" : "Shutdown" 2208 | }, 2209 | "state" : "(unavailable)" 2210 | }, 2211 | "ED09E54D-6591-41A9-8A97-8762AA9A4DDC" : { 2212 | "watch" : { 2213 | "name" : "Apple Watch Series 4 - 40mm", 2214 | "udid" : "C0D4D44E-CCF2-459A-AFD7-39EB96FC37FD", 2215 | "state" : "Shutdown" 2216 | }, 2217 | "phone" : { 2218 | "name" : "iPhone XS", 2219 | "udid" : "B9102A44-5FBE-4E4E-8BDC-1D49C75A73A2", 2220 | "state" : "Shutdown" 2221 | }, 2222 | "state" : "(active, disconnected)" 2223 | }, 2224 | "DB3F4B12-F678-4E52-9732-1CAC57D2A112" : { 2225 | "watch" : { 2226 | "name" : "Apple Watch Series 2 - 38mm", 2227 | "udid" : "B98423AE-1AF7-452A-8C59-3DEE3A7BB9E8", 2228 | "state" : "Shutdown" 2229 | }, 2230 | "phone" : { 2231 | "name" : "iPhone 7", 2232 | "udid" : "55A13DF4-3DCB-4C70-BB34-8FAA0E677E6F", 2233 | "state" : "Shutdown" 2234 | }, 2235 | "state" : "(unavailable)" 2236 | }, 2237 | "5C436B84-09D4-4CDF-B0EF-7847247F0342" : { 2238 | "watch" : { 2239 | "name" : "Apple Watch - 38mm", 2240 | "udid" : "3F9314D4-1BEB-49F9-B752-F4945498019B", 2241 | "state" : "Shutdown" 2242 | }, 2243 | "phone" : { 2244 | "name" : "iPhone 6s", 2245 | "udid" : "E47312EF-4A77-46D9-ADC1-C60563BBD462", 2246 | "state" : "Shutdown" 2247 | }, 2248 | "state" : "(unavailable)" 2249 | }, 2250 | "BC506AF6-DB77-466A-9E76-DEFCC744B1D9" : { 2251 | "watch" : { 2252 | "name" : "Apple Watch Series 3 - 42mm", 2253 | "udid" : "12319834-C977-4727-AB33-7C9326BCA687", 2254 | "state" : "Shutdown" 2255 | }, 2256 | "phone" : { 2257 | "name" : "iPhone 8 Plus", 2258 | "udid" : "92773818-E4C7-45A5-BEC0-7BD4D6077F7B", 2259 | "state" : "Shutdown" 2260 | }, 2261 | "state" : "(unavailable)" 2262 | }, 2263 | "2AEB0DD4-F854-4861-8BEA-43D6CDF72B3C" : { 2264 | "watch" : { 2265 | "name" : "Apple Watch - 42mm", 2266 | "udid" : "0FD51B8F-B2A9-4893-A3AB-8F99140D18BC", 2267 | "state" : "Shutdown" 2268 | }, 2269 | "phone" : { 2270 | "name" : "iPhone 6s Plus", 2271 | "udid" : "3BCF226B-216F-41FB-8BD1-42E1B3D35E96", 2272 | "state" : "Shutdown" 2273 | }, 2274 | "state" : "(unavailable)" 2275 | }, 2276 | "09F37B5A-BE41-402C-A438-CDC970BA1C20" : { 2277 | "watch" : { 2278 | "name" : "Apple Watch Series 4 - 44mm", 2279 | "udid" : "935B8DCE-A933-413E-A053-C225779D9C27", 2280 | "state" : "Shutdown" 2281 | }, 2282 | "phone" : { 2283 | "name" : "iPhone XS Max", 2284 | "udid" : "A2966FCA-5122-48C5-A022-F5A1B5032247", 2285 | "state" : "Shutdown" 2286 | }, 2287 | "state" : "(active, disconnected)" 2288 | }, 2289 | "AF591E92-8245-4E1D-B5CD-7BD835571F8C" : { 2290 | "watch" : { 2291 | "name" : "Apple Watch Series 3 - 38mm", 2292 | "udid" : "7663D5B9-302B-4DE9-8975-C090A3ECF113", 2293 | "state" : "Shutdown" 2294 | }, 2295 | "phone" : { 2296 | "name" : "iPhone 8", 2297 | "udid" : "5FD29EFA-E062-43D2-A333-194ABFF78904", 2298 | "state" : "Shutdown" 2299 | }, 2300 | "state" : "(unavailable)" 2301 | }, 2302 | "61075970-35D3-4FB7-A427-6F0D20017456" : { 2303 | "watch" : { 2304 | "name" : "Apple Watch Series 3 - 42mm", 2305 | "udid" : "6D98E9CE-C4C6-4D93-B5D1-9F6F99323B10", 2306 | "state" : "Shutdown" 2307 | }, 2308 | "phone" : { 2309 | "name" : "iPhone 8 Plus", 2310 | "udid" : "4758B760-7B58-4305-AA96-719D81597C9E", 2311 | "state" : "Shutdown" 2312 | }, 2313 | "state" : "(unavailable)" 2314 | }, 2315 | "EA70EA8F-A19E-44DE-BF41-8FBAFCC1ADA5" : { 2316 | "watch" : { 2317 | "name" : "Apple Watch Series 2 - 38mm", 2318 | "udid" : "9ECCAB27-B643-48A1-B9F6-7DBD1B61344A", 2319 | "state" : "Shutdown" 2320 | }, 2321 | "phone" : { 2322 | "name" : "iPhone 7", 2323 | "udid" : "B099B1DD-E5D8-415D-9E2A-46DBC2949210", 2324 | "state" : "Shutdown" 2325 | }, 2326 | "state" : "(unavailable)" 2327 | }, 2328 | "0031D4BE-3606-444A-80CA-ADEF25B20FD8" : { 2329 | "watch" : { 2330 | "name" : "Apple Watch Series 2 - 42mm", 2331 | "udid" : "35945A6D-261E-4F70-A848-00B292C012F9", 2332 | "state" : "Shutdown" 2333 | }, 2334 | "phone" : { 2335 | "name" : "iPhone 7 Plus", 2336 | "udid" : "B46DFDFD-91DC-4D80-880D-EA080102BA3E", 2337 | "state" : "Shutdown" 2338 | }, 2339 | "state" : "(unavailable)" 2340 | }, 2341 | "332FB24E-238C-4786-98AA-418108A89E4B" : { 2342 | "watch" : { 2343 | "name" : "Apple Watch Series 3 - 38mm", 2344 | "udid" : "87B41F2F-6659-45C0-98EB-1145BBFEAF4D", 2345 | "state" : "Shutdown" 2346 | }, 2347 | "phone" : { 2348 | "name" : "iPhone 8", 2349 | "udid" : "6D2E801D-D065-4955-86B7-4AC2F34B8362", 2350 | "state" : "Shutdown" 2351 | }, 2352 | "state" : "(unavailable)" 2353 | }, 2354 | "1F153F93-C347-42A5-8D08-53BFB385CAA0" : { 2355 | "watch" : { 2356 | "name" : "Apple Watch Series 2 - 42mm", 2357 | "udid" : "85FAE824-2D2C-417D-ABBA-7B4B7F4F793E", 2358 | "state" : "Shutdown" 2359 | }, 2360 | "phone" : { 2361 | "name" : "iPhone 7 Plus", 2362 | "udid" : "78D86A58-BE70-41D1-8011-48511E31AE90", 2363 | "state" : "Shutdown" 2364 | }, 2365 | "state" : "(unavailable)" 2366 | }, 2367 | "ADC22ACF-DEBC-4F5D-96C1-5683F158D6B2" : { 2368 | "watch" : { 2369 | "name" : "Apple Watch Series 3 - 38mm", 2370 | "udid" : "F48EDBC1-04A0-425A-9356-D606D38B6DBA", 2371 | "state" : "Shutdown" 2372 | }, 2373 | "phone" : { 2374 | "name" : "iPhone 8", 2375 | "udid" : "737C5482-0173-4170-97F0-2833EE8A6C08", 2376 | "state" : "Shutdown" 2377 | }, 2378 | "state" : "(unavailable)" 2379 | } 2380 | } 2381 | } 2382 | -------------------------------------------------------------------------------- /test/helpers.test.js: -------------------------------------------------------------------------------- 1 | jest.mock('simctl') 2 | const simctl = require('simctl') 3 | 4 | const { findFirstAvailableDevice, getDeviceTypes, parseEnvironmentVariables, withInjectedEnvironmentVariablesToProcess, __internal } = require('../src/helpers') 5 | 6 | let json 7 | beforeAll(() => { 8 | json = fixtureJson('simctl-list.json') 9 | simctl.list = jest.fn(() => { 10 | return { 11 | json 12 | } 13 | }) 14 | }) 15 | 16 | const originalEnv = Object.assign({}, process.env) 17 | beforeEach(() => { 18 | // restore to original env 19 | process.env = originalEnv 20 | }) 21 | 22 | describe('when parsing env variables', function () { 23 | test('should return empty map on null value', function () { 24 | expect(parseEnvironmentVariables(null)).toEqual({}) 25 | }) 26 | 27 | test('should return empty map on undefined value', function () { 28 | expect(parseEnvironmentVariables(undefined)).toEqual({}) 29 | }) 30 | 31 | describe('without simctl fix', function () { 32 | test('should return valid map for valid env variable', function () { 33 | expect(parseEnvironmentVariables(['KEY=VALUE'], false)).toEqual({ KEY: 'VALUE' }) 34 | }) 35 | }) 36 | 37 | describe('with simctl fix', function () { 38 | test('should add SIMCTL_CHILD_ prefix to all keys', function () { 39 | expect(parseEnvironmentVariables(['KEY=VALUE', 'KEY2=VALUE2', 'KEY3'], true)) 40 | .toEqual( 41 | { 42 | SIMCTL_CHILD_KEY: 'VALUE', 43 | SIMCTL_CHILD_KEY2: 'VALUE2' 44 | } 45 | ) 46 | }) 47 | }) 48 | }) 49 | 50 | describe('fixRuntimeName tests', () => { 51 | test('input gibberish', () => { 52 | const result = __internal.fixRuntimeName('23tgweg24gwdgw') 53 | expect(result).toEqual('23tgweg24gwdgw') 54 | }) 55 | 56 | test('input com.apple.CoreSimulator.SimRuntime.iOS-12-0', () => { 57 | const result = __internal.fixRuntimeName('com.apple.CoreSimulator.SimRuntime.iOS-12-0') 58 | expect(result).toEqual('iOS 12.0') 59 | }) 60 | 61 | test('input com.apple.CoreSimulator.SimRuntime.tvOS-12-1', () => { 62 | const result = __internal.fixRuntimeName('com.apple.CoreSimulator.SimRuntime.tvOS-12-1') 63 | expect(result).toEqual('tvOS 12.1') 64 | }) 65 | 66 | test('input com.apple.CoreSimulator.SimRuntime.watchOS-5-1', () => { 67 | const result = __internal.fixRuntimeName('com.apple.CoreSimulator.SimRuntime.watchOS-5-1') 68 | expect(result).toEqual('watchOS 5.1') 69 | }) 70 | 71 | test('input typo "comX" - comX.apple.CoreSimulator.SimRuntime.iOS-12-0', () => { 72 | const result = __internal.fixRuntimeName('comX.apple.CoreSimulator.SimRuntime.iOS-12-0') 73 | expect(result).toEqual('comX.apple.CoreSimulator.SimRuntime.iOS-12-0') 74 | }) 75 | 76 | test('input typo "iOS 12 0" - com.apple.CoreSimulator.SimRuntime.iOS 12 0', () => { 77 | const result = __internal.fixRuntimeName('comX.apple.CoreSimulator.SimRuntime.iOS 12 0') 78 | expect(result).toEqual('comX.apple.CoreSimulator.SimRuntime.iOS 12 0') 79 | }) 80 | }) 81 | 82 | describe('findAvailableRuntime', () => { 83 | test('success', () => { 84 | const runtime = __internal.findAvailableRuntime(json, 'iPhone X') 85 | expect(runtime).toEqual('iOS 12.1') 86 | }) 87 | 88 | test('failure', () => { 89 | expect(() => __internal.findAvailableRuntime(json, 'iPhone XX')) 90 | .toThrow( 91 | 'No available runtimes could be found for "iPhone XX".' 92 | ) 93 | }) 94 | }) 95 | 96 | describe('getDeviceFromDeviceTypeId', () => { 97 | test('unknown device', () => { 98 | expect(() => __internal.getDeviceFromDeviceTypeId('unknown-device')) 99 | .toThrow( 100 | 'Device type "com.apple.CoreSimulator.SimDeviceType.unknown-device" could not be found.' 101 | ) 102 | }) 103 | 104 | test('no device', () => { 105 | const consoleSpy = jest.spyOn(console, 'error').mockResolvedValue() 106 | 107 | const device = __internal.getDeviceFromDeviceTypeId() 108 | expect(device).toMatchObject({ id: '0CB7F7A1-A837-4809-8951-B724D6496462', name: 'Apple Watch Series 2 - 38mm', runtime: 'watchOS 5.1' }) 109 | expect(consoleSpy).toHaveBeenCalledWith('--devicetypeid was not specified, using first available device: Apple Watch Series 2 - 38mm') 110 | consoleSpy.mockRestore() 111 | }) 112 | 113 | test('known device, with runtime', () => { 114 | const device = __internal.getDeviceFromDeviceTypeId('iPhone-X, 12.1') 115 | expect(device).toMatchObject({ id: 'BAC3ADB2-66B2-41C0-AF0D-8D4D58E2E88A', name: 'iPhone X', runtime: 'iOS 12.1' }) 116 | }) 117 | 118 | test('known device, with runtime (has com.apple.CoreSimulator.SimRuntime prefix)', () => { 119 | const device = __internal.getDeviceFromDeviceTypeId('iPhone-8, 11.3') 120 | expect(device).toMatchObject({ id: '85D9D9AE-2749-4169-A3DB-94FC9C8EC8F4', name: 'iPhone 8', runtime: 'iOS 11.3' }) 121 | }) 122 | 123 | test('known device, no runtime', () => { 124 | const device = __internal.getDeviceFromDeviceTypeId('com.apple.CoreSimulator.SimDeviceType.iPhone-X') 125 | expect(device).toMatchObject({ id: 'BAC3ADB2-66B2-41C0-AF0D-8D4D58E2E88A', name: 'iPhone X', runtime: 'iOS 12.1' }) 126 | }) 127 | 128 | test('known device, unknown runtime', () => { 129 | expect(() => __internal.getDeviceFromDeviceTypeId('iPhone-X, 4.1')) 130 | .toThrow( 131 | 'Device id for device name "iPhone X" and runtime "iOS 4.1" could not be found, or is not available.' 132 | ) 133 | }) 134 | }) 135 | 136 | test('withInjectedEnvironmentVariablesToProcess', () => { 137 | const action = jest.fn().mockImplementation(() => { 138 | expect(process.env.myenv1).toEqual('myvalue1') 139 | }) 140 | const envVariables = { 141 | myenv1: 'myvalue1' 142 | } 143 | withInjectedEnvironmentVariablesToProcess(process, envVariables, action) 144 | expect(process.env.myenv1).toBeUndefined() 145 | }) 146 | 147 | test('fixNameKey', () => { // coverage 148 | const arr = __internal.fixNameKey([]) 149 | expect(arr).toEqual([]) 150 | }) 151 | 152 | test('findRuntimesGroupByDeviceProperty', () => { // coverage 153 | const runtimes = __internal.findRuntimesGroupByDeviceProperty(json, 'name', false) 154 | expect(Object.keys(runtimes).length).toEqual(41) 155 | }) 156 | 157 | test('getdevicetypes', () => { // coverage 158 | const druntimes = { 159 | 'iPhone XX': ['15.6'] 160 | } 161 | 162 | const deviceTypes = getDeviceTypes(druntimes) 163 | expect(deviceTypes).toMatchObject([]) 164 | }) 165 | 166 | test('findFirstAvailableDevice', () => { 167 | let device, list 168 | 169 | list = fixtureJson('simctl-list.json') 170 | simctl.list = jest.fn(() => { 171 | return { 172 | list 173 | } 174 | }) 175 | device = { id: '0CB7F7A1-A837-4809-8951-B724D6496462', name: 'Apple Watch Series 2 - 38mm', runtime: 'watchOS 5.1' } 176 | expect(findFirstAvailableDevice(list)).toEqual(device) 177 | 178 | list = fixtureJson('issue-262/simctl-list.json') 179 | simctl.list = jest.fn(() => { 180 | return { 181 | list 182 | } 183 | }) 184 | device = { id: '622B99AE-E57D-4435-B7C8-6A0151E68C68', name: 'iPhone 5', runtime: 'iOS 10.3' } 185 | expect(findFirstAvailableDevice(list)).toEqual(device) 186 | }) 187 | -------------------------------------------------------------------------------- /test/index.legacy.test.js: -------------------------------------------------------------------------------- 1 | // legacy export tests 2 | 3 | const { ShowDeviceTypesCommand, ShowSdksCommand, InstallCommand, LaunchCommand, StartCommand } = require('../src/index') 4 | const { getdevicetypes, showdevicetypes, showsdks, install, launch, start } = require('../src/index.legacy') 5 | 6 | test('getdevicetypes function export', function () { 7 | const command = getdevicetypes 8 | const spy = jest.spyOn(ShowDeviceTypesCommand, 'run').mockReturnValue(['Device1']) 9 | const consoleSpy = jest.spyOn(console, 'warn') 10 | 11 | expect(command()).toEqual(['Device1']) 12 | expect(consoleSpy).toHaveBeenCalledWith('ios-sim.getdevicetypes is deprecated, use ShowDeviceTypesCommand instead.') 13 | expect(spy).toHaveBeenCalled() 14 | 15 | spy.mockClear() 16 | consoleSpy.mockClear() 17 | }) 18 | 19 | test('showdevicetypes function export', function () { 20 | const command = showdevicetypes 21 | const spy = jest.spyOn(ShowDeviceTypesCommand.prototype, 'output').mockReturnValue('Device2\nDevice3') 22 | const consoleSpy = jest.spyOn(console, 'warn') 23 | 24 | expect(command()).toEqual('Device2\nDevice3') 25 | expect(consoleSpy).toHaveBeenCalledWith('ios-sim.showdevicetypes is deprecated, use ShowDeviceTypesCommand instead.') 26 | expect(spy).toHaveBeenCalled() 27 | 28 | spy.mockClear() 29 | consoleSpy.mockClear() 30 | }) 31 | 32 | test('showsdks function export', function () { 33 | const command = showsdks 34 | const spy = jest.spyOn(ShowSdksCommand.prototype, 'output').mockReturnValue('Runtime1\nRuntime2') 35 | const consoleSpy = jest.spyOn(console, 'warn') 36 | 37 | expect(command()).toEqual('Runtime1\nRuntime2') 38 | expect(consoleSpy).toHaveBeenCalledWith('ios-sim.showsdks is deprecated, use ShowSdksCommand instead.') 39 | expect(spy).toHaveBeenCalled() 40 | 41 | spy.mockClear() 42 | consoleSpy.mockClear() 43 | }) 44 | 45 | test('install function export', function () { 46 | const command = install 47 | const spy = jest.spyOn(InstallCommand, 'run').mockReturnValue() 48 | const consoleSpy = jest.spyOn(console, 'warn') 49 | 50 | // arguments: app_path, devicetypeid, log, exit 51 | 52 | expect(command('/my/app_path', 'abcdefg123', '/my/log_path', true)).toBeUndefined() 53 | expect(consoleSpy).toHaveBeenCalledWith('ios-sim.install is deprecated, use InstallCommand instead.') 54 | expect(spy).toHaveBeenCalledWith(['/my/app_path', '--devicetypeid', 'abcdefg123', '--log', '/my/log_path', '--exit']) 55 | 56 | expect(command('/my/app_path', 'abcdefg123')).toBeUndefined() 57 | expect(spy).toHaveBeenCalledWith(['/my/app_path', '--devicetypeid', 'abcdefg123']) 58 | 59 | expect(spy).toHaveBeenCalledTimes(2) 60 | 61 | spy.mockClear() 62 | consoleSpy.mockClear() 63 | }) 64 | 65 | test('launch function export', function () { 66 | const command = launch 67 | const spy = jest.spyOn(LaunchCommand, 'run').mockReturnValue() 68 | const consoleSpy = jest.spyOn(console, 'warn') 69 | 70 | // arguments: app_path, devicetypeid, log, exit, setenv, args 71 | expect(command('/my/app_path', 'abcdefg123', '/my/log_path', true, 'env1,env2', 'arg1,arg2')).toBeUndefined() 72 | expect(consoleSpy).toHaveBeenCalledWith('ios-sim.launch is deprecated, use LaunchCommand instead.') 73 | expect(spy).toHaveBeenCalledWith(['/my/app_path', '--devicetypeid', 'abcdefg123', '--log', '/my/log_path', '--exit', '--setenv', 'env1,env2', '--args', 'arg1,arg2']) 74 | 75 | expect(command('/my/app_path', 'abcdefg123', '/my/log_path', true)).toBeUndefined() 76 | expect(spy).toHaveBeenCalledWith(['/my/app_path', '--devicetypeid', 'abcdefg123', '--log', '/my/log_path', '--exit']) 77 | 78 | expect(command('/my/app_path', 'abcdefg123', null, null, 'env1,env2', 'arg1,arg2')).toBeUndefined() 79 | expect(spy).toHaveBeenCalledWith(['/my/app_path', '--devicetypeid', 'abcdefg123', '--setenv', 'env1,env2', '--args', 'arg1,arg2']) 80 | 81 | expect(spy).toHaveBeenCalledTimes(3) 82 | 83 | spy.mockClear() 84 | consoleSpy.mockClear() 85 | }) 86 | 87 | test('start function export', function () { 88 | const command = start 89 | const spy = jest.spyOn(StartCommand, 'run').mockReturnValue() 90 | const consoleSpy = jest.spyOn(console, 'warn') 91 | 92 | // arguments: devicetypeid 93 | expect(command('abcdefg123')).toBeUndefined() 94 | expect(spy).toHaveBeenCalledWith(['--devicetypeid', 'abcdefg123']) 95 | expect(consoleSpy).toHaveBeenCalledWith('ios-sim.start is deprecated, use StartCommand instead.') 96 | 97 | expect(spy).toHaveBeenCalledTimes(1) 98 | 99 | spy.mockClear() 100 | consoleSpy.mockClear() 101 | }) 102 | -------------------------------------------------------------------------------- /test/index.test.js: -------------------------------------------------------------------------------- 1 | // export tests 2 | 3 | const { ShowDeviceTypesCommand, ShowSdksCommand, InstallCommand, LaunchCommand, StartCommand } = require('../src/index') 4 | const { getdevicetypes, showdevicetypes, showsdks, install, launch, start } = require('../src/index') 5 | 6 | test('getdevicetypes function export', function () { 7 | const command = getdevicetypes 8 | expect(typeof command).toEqual('function') 9 | }) 10 | 11 | test('showdevicetypes function export', function () { 12 | const command = showdevicetypes 13 | expect(typeof command).toEqual('function') 14 | }) 15 | 16 | test('showsdks function export', function () { 17 | const command = showsdks 18 | expect(typeof command).toEqual('function') 19 | }) 20 | 21 | test('install function export', function () { 22 | const command = install 23 | expect(typeof command).toEqual('function') 24 | }) 25 | 26 | test('launch function export', function () { 27 | const command = launch 28 | expect(typeof command).toEqual('function') 29 | }) 30 | 31 | test('start function export', function () { 32 | const command = start 33 | expect(typeof command).toEqual('function') 34 | }) 35 | 36 | test('ShowDeviceTypesCommand class export', function () { 37 | const command = new ShowDeviceTypesCommand() 38 | expect(typeof command).toEqual('object') 39 | expect(typeof command.run).toEqual('function') 40 | }) 41 | 42 | test('ShowSdksCommand class export', function () { 43 | const command = new ShowSdksCommand() 44 | expect(typeof command).toEqual('object') 45 | expect(typeof command.run).toEqual('function') 46 | }) 47 | 48 | test('InstallCommand class export', function () { 49 | const command = new InstallCommand() 50 | expect(typeof command).toEqual('object') 51 | expect(typeof command.run).toEqual('function') 52 | }) 53 | 54 | test('LaunchCommand class export', function () { 55 | const command = new LaunchCommand() 56 | expect(typeof command).toEqual('object') 57 | expect(typeof command.run).toEqual('function') 58 | }) 59 | 60 | test('StartCommand class export', function () { 61 | const command = new StartCommand() 62 | expect(typeof command).toEqual('object') 63 | expect(typeof command.run).toEqual('function') 64 | }) 65 | -------------------------------------------------------------------------------- /test/jest.setup.js: -------------------------------------------------------------------------------- 1 | const { stdout, stderr } = require('stdout-stderr') 2 | const fs = jest.requireActual('fs') 3 | const eol = require('eol') 4 | 5 | jest.setTimeout(30000) 6 | jest.useFakeTimers() 7 | 8 | // trap console log 9 | beforeEach(() => { 10 | stdout.start() 11 | stderr.start() 12 | 13 | // change this if you need to see logs from stdout 14 | stdout.print = false 15 | }) 16 | 17 | afterEach(() => { 18 | stdout.stop() 19 | stderr.stop() 20 | }) 21 | 22 | // helper for fixtures 23 | global.fixtureFile = (output) => { 24 | return fs.readFileSync(`./test/fixtures/${output}`, { encoding: 'utf-8' }).toString() 25 | } 26 | 27 | // helper for fixtures 28 | global.fixtureJson = (output) => { 29 | return JSON.parse(global.fixtureFile(output)) 30 | } 31 | 32 | // fixture matcher 33 | expect.extend({ 34 | toMatchFixture (received, expected) { 35 | const val = fixtureFile(expected) 36 | // eslint-disable-next-line jest/no-standalone-expect 37 | expect(eol.auto(received)).toEqual(eol.auto(val)) 38 | return { pass: true } 39 | } 40 | }) 41 | 42 | expect.extend({ 43 | toMatchFixtureJson (received, expected) { 44 | const val = fixtureJson(expected) 45 | // eslint-disable-next-line jest/no-standalone-expect 46 | expect(received).toEqual(val) 47 | return { pass: true } 48 | } 49 | }) 50 | --------------------------------------------------------------------------------