Skip to content

Instantly share code, notes, and snippets.

@cabeca
Created September 23, 2014 21:30
Show Gist options
  • Star 79 You must be signed in to star a gist
  • Fork 10 You must be signed in to fork a gist
  • Save cabeca/cbaacbeb6a1cc4683aa5 to your computer and use it in GitHub Desktop.
Save cabeca/cbaacbeb6a1cc4683aa5 to your computer and use it in GitHub Desktop.
This script removes and recreates all simulators in Xcode 6.
#!/usr/bin/env ruby
device_types_output = `xcrun simctl list devicetypes`
device_types = device_types_output.scan /(.*) \((.*)\)/
runtimes_output = `xcrun simctl list runtimes`
runtimes = runtimes_output.scan /(.*) \(.*\) \((com.apple[^)]+)\)$/
devices_output = `xcrun simctl list devices`
devices = devices_output.scan /\s\s\s\s(.*) \(([^)]+)\) (.*)/
devices.each do |device|
puts "Removing device #{device[0]} (#{device[1]})"
`xcrun simctl delete #{device[1]}`
end
device_types.each do |device_type|
runtimes.each do |runtime|
puts "Creating #{device_type} with #{runtime}"
command = "xcrun simctl create '#{device_type[0]} #{runtime[0]}' #{device_type[1]} #{runtime[1]}"
command_output = `#{command}`
sleep 0.5
end
end
@SpacyRicochet
Copy link

Much ❤️!

@vicwomg
Copy link

vicwomg commented Jul 31, 2015

I really needed this, thanks! One potential issue is that it doesn't name the emulators exactly as the original Xcode does, so scripts depending on them to be named a certain way might not work (saw this when using Appium). Removing " #{runtime[0]}" from line 20 does the trick.

@shaobos
Copy link

shaobos commented Aug 1, 2015

Thanks for this great script. It helped me bring up several bad machines and saved a lot of time for my company. today i just found another way to get a clean slate for all simulators. No code is required:

  1. delete this entire directory ~/Library/Developer/CoreSimulator/Devices
  2. run launchctl list | grep CoreSimulator and then remove any processes from the output. For example: launchctl remove com.apple.CoreSimulator.CoreSimulatorService.117.15.1.dltcnwGXJZL4
  3. run xcrun simctl list. Setting DEVELOPER_DIR might be needed

I don't fully understand the rationale behind this but this seems to work fine for me.

@stevemoser
Copy link

The bash commands are probably simpler but you can try this for a easier yet more complex solution:
Per @saniul
gem install snapshot; snapshot reset_simulators

https://github.com/KrauseFx/snapshot

Per SO:
killall Xcode

sudo killall -9 com.apple.CoreSimulator.CoreSimulatorService

rm -rf ~/Library/Developer/CoreSimulator/Devices

open /Applications/Xcode.app

http://stackoverflow.com/a/31421158/142358

@AlexChesters
Copy link

This worked brilliantly!

@kk-achu
Copy link

kk-achu commented Aug 25, 2015

Awesome...it works great...thank you so much..... before I tried deleting old Xcode and install new Xcode..thinking some thing wrong with Xcode...that didn't solve the problem..but this script did.

@fabiojgrocha
Copy link

Thank you guys! both solutions work great!

@werm098
Copy link

werm098 commented Jan 5, 2016

I can confirm the solution by @tinyfrog works. Thanks!

@johndpope-karhoo
Copy link

still good. thanks

@ollieatkinson
Copy link

ollieatkinson commented Dec 16, 2016

You should use the --json parameter to get machine processable output.

xcrun simctl list devices --json

@oscahie
Copy link

oscahie commented Feb 16, 2018

In Xcode 9 Apple has changed the format of the output of xcrun simctl list runtimes, so to get it working again you'd need to update the regexp in line 7 to:
runtimes = runtimes_output.scan /(.*) \(.*\) - (com.apple.+)$/

@strobox
Copy link

strobox commented Jan 7, 2019

In 2019 (and maybe >2019) do:

device_types_output = `xcrun simctl list devicetypes`
device_types = device_types_output.scan /(.*) \((.*)\)/


runtimes_output = `xcrun simctl list runtimes`
runtimes = runtimes_output.scan /(.*) \(.*\) - (com.apple[^)]+)$/

runtimes.each do |runtime|
  puts " #{runtime}"
end

devices_output = `xcrun simctl list devices`
devices = devices_output.scan /[A-Z0-9-]{36}/

devices.each do |device|
  puts "Removing device #{device}"
  `xcrun simctl delete #{device}`
end

device_types.each do |device_type|
  runtimes.each do |runtime|
    puts "Creating #{device_type} with #{runtime}"
    command = "xcrun simctl create '#{device_type[0]} #{runtime[0]}' #{device_type[1]} #{runtime[1]}"
    puts command
    command_output = `#{command}`
    sleep 0.5
  end
end

@strobox
Copy link

strobox commented Jan 7, 2019

Or just for erase data:

#!/usr/bin/env ruby

devices_output = `xcrun simctl list devices`
devices = devices_output.scan /[A-Z0-9-]{36}/

devices.each do |device|
  puts "Erase device #{device} data"
  `xcrun simctl erase #{device}`
end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment