support - ¿Cómo puedo reiniciar el simulador de iOS desde la línea de comando?
support.apple.com/iphone/restore en español (17)
Necesito resetear mucho el simulador de iPhone, y no he encontrado la forma de hacerlo sin usar el mouse. Es algo pequeño, pero estoy realmente harto de hacerlo y me encantaría tener una forma de hacerlo usando un atajo de teclado.
Aún mejor sería una forma de restablecerlo desde la línea de comandos, así que podría construir un reinicio en una secuencia de comandos de implementación.
No estoy muy familiarizado con iOS o MacOS.
Al instalar Xcode, siempre creo un atajo de teclado para "Restablecer contenido y configuración" en el simulador. Un ahorro de tiempo extremadamente útil.
System Preferences > Keyboard > Shortcuts > App Shortcuts > "+"
En el selector de aplicaciones, seleccione "Otro ..." para abrir el cuadro de diálogo del selector de aplicaciones.
En este cuadro de diálogo, no puede "Mostrar contenido del paquete" para explorar un .app, por lo que deberá usar Go to Folder
través de Cmd - Shift - G. (Primero abra la aplicación desplegable y seleccione Other
)
En la versión actual de Xcode, ve a la ruta:
/Applications/Xcode/Contents/Developer/Applications
Seleccione Simulator.app
y presione "Agregar"
Para el Menu Title
, ingrese Reset Content and Settings...
Para Keyboard Shortcut
, presione CMD - Shift - R
Aquí hay una tarea de Rakefile para reiniciar un simulador específico. Esto funciona con Xcode 7 ya que las herramientas de línea de comandos de Xcode 7 rompieron el comando xcrun simctl uninstall. Tengo un pequeño método runC personalizado porque me gusta ver el comando de terminal real así como su salida.
desc "Resets the iPhone Simulator state"
task :reset_simulator => [] do
deviceDestinationName = ''iPhone 6'' #for efficiency since we only target one device for our unit tests
puts "...starting simulator reset"
runC(''killall "iOS Simulator"'')
runC(''killall "Simulator"'')
runC(''xcrun simctl list > deviceList.txt'')
lines = File.open(''deviceList.txt'').readlines
lines.each do |line|
lineStripped = line.strip
if (lineStripped=~/[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12}/)
if (lineStripped !~ /unavailable/ && lineStripped.include?("#{deviceDestinationName} ("))
puts "Inspecting simulator: #{lineStripped} by making sure it is shut down, then erasing it."
needsShutdown = !lineStripped.include?(''Shutdown'')
aDeviceId = lineStripped[/[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12}/]
if (needsShutdown)
runC("xcrun simctl shutdown #{aDeviceId}")
end
runC("xcrun simctl erase #{aDeviceId}")
#does not work to just uninstall the app with Xcode 7, do just rely on resetting the device above
#`xcrun simctl uninstall #{aDeviceId} com.animoto.AppServiceClientTester`
end
end
end
runC(''rm deviceList.txt'')
end
#Runs a command and prints out both the command that will be run and the results
def runC(command)
puts ''$ '' + command
puts `#{command}`
end
COPY-PASTE ANSWER - nota: restablecerá el contenido y la configuración de todos los simuladores disponibles.
Gracias @ Alpine por la inspiración y el conocimiento. Si ejecuta esto en su línea de comando, debería poder restablecer todos los sims disponibles. Esto funciona con Xcode 6.
# Get the sim list with the UUIDs
OUTPUT="$(xcrun simctl list)"
# Parse out the UUIDs and saves them to file
echo $OUTPUT | awk -F "[()]" ''{ for (i=2; i<NF; i+=2) print $i }'' | grep ''^[-A-Z0-9]*$'' > output.txt
# Iterate through file and reset sim
for UUID in `awk ''{ print $1 }'' output.txt`
do
xcrun simctl erase $UUID
done
Como una ventaja añadida al uso de los comandos xcrun, puede iniciar un dispositivo después de haberlo enumerado con
xcrun simctl list
Una vez que tenga la lista que se muestra, ejecute:
xcrun instruments -w "iPhone 5s (8.1 Simulator) [31E5EF01-084B-471B-8AC6-C1EA3167DA9E]"
Eliminar el contenido de
~/Library/Application Support/iPhone Simulator/<sdk revision>
Y estás listo para ir.
En Xcode 6, NO SOLO ELIMINE LA CARPETA PARA EL SIMULADOR. PODRÁ estropear las cosas y le causará dolor de cabeza.
En Xcode 6, en realidad hay una herramienta para controlar el simulador desde la línea de comandos.
Asegúrate de que la configuración de tu línea de comando esté configurada en Xcode 6
xcrun simctl
En Xcode 6, cada dispositivo tiene un GUID / UUID asociado, para restablecer un dispositivo específico, necesita el GUID para ello.
El comando
xcrun simctl list
le mostrará todos los dispositivos que ha configurado. La salida se verá así:
== Devices ==
-- iOS 7.0 --
iPhone 4s (F77DC0AE-6A6D-4D99-9936-F9DB07BBAA82) (Shutdown)
iPhone 5 (5B78FC0D-0034-4134-8B1F-19FD0EC9D581) (Shutdown)
iPhone 5s (569E5910-E32D-40E2-811F-D2E8F04EA4EF) (Shutdown)
iPad 2 (451DBBD8-A387-4E77-89BF-2B3CD45B4772) (Shutdown)
iPad Retina (2C58366B-5B60-4687-8031-6C67383D793F) (Shutdown)
iPad Air (50E03D3B-3456-4C49-85AD-60B3AFE4918B) (Shutdown)
-- iOS 7.1 --
-- iOS 8.0 --
iPhone 4s (27818821-A0BB-496E-A956-EF876FB514C2) (Shutdown)
iPhone 5 (6FBAA7E2-857C-432A-BD03-980D762DA9D2) (Shutdown)
iPhone 5s (7675C82B-DE49-45EB-A28D-1175376AEEE9) (Shutdown)
iPad 2 (836E7C89-B9D6-4CC5-86DE-B18BA8600E7B) (Shutdown)
iPad Retina (EFDD043D-2725-47DC-A3FF-C984F839A631) (Shutdown)
iPad Air (9079AD6C-E74D-4D5F-9A0F-4933498B852E) (Shutdown)
Resizable iPhone (943CFEDE-A03C-4298-93E3-40D0713652CB) (Shutdown)
Resizable iPad (DBA71CA5-6426-484B-8E9B-13FCB3B27DEB) (Shutdown)
Solo copie el GUID desde dentro de los paréntesis y ejecute xcrun simctl erase
por ejemplo,
xcrun simctl erase 5B78FC0D-0034-4134-8B1F-19FD0EC9D581
borraría el dispositivo iOS 7.0, iPhone 5
Escribí un script que restablecerá el contenido y la configuración de todas las versiones y dispositivos para iOS Simulator. Toma los nombres de los dispositivos y los números de versión del menú, por lo que incluirá todos los dispositivos nuevos o versiones de iOS para los que Apple lanza simuladores.
Es fácil de ejecutar manualmente o usar en un script de construcción. Sugiero agregarlo como una secuencia de comandos de ejecución previa a la ejecución antes de la compilación.
Se basa en gran medida en el guión de Stian anterior, pero no se queda obsoleto con las nuevas versiones de iOS, y elimina el cuadro de diálogo (mejor para las secuencias de comandos de compilación de automatización y desde la línea de comandos).
Estoy presente,
El script de reinicio Definitive iOS Simulator (enlace)
Basado en el código de Oded Regev (que se basó en el código "menu_click" de Jacob Rus)
He encontrado esta herramienta muy útil llamada "SimulatorManager": http://tue-savvy.github.io Se restablecerán todos los simuladores por medio de un widget de barra de menú (no estoy seguro de que así se llame) pero además de eso le dará acceso rápido a todos sus datos de aplicación. Realmente ya no puedo vivir sin eso. ¡Difundir la palabra!
La solución de atajo de teclado ya no es relevante y lamentablemente la solución de @Cameron tampoco me funcionó (intenté depurarla sin suerte)
Esto es lo que funciona para mí:
#!/bin/bash
# `menu_click`, by Jacob Rus, September 2006
#
# Accepts a list of form: `{"Finder", "View", "Arrange By", "Date"}`
# Execute the specified menu item. In this case, assuming the Finder
# is the active application, arranging the frontmost folder by date.
osascript <<SCRIPT
on menu_click(mList)
local appName, topMenu, r
-- Validate our input
if mList''s length < 3 then error "Menu list is not long enough"
-- Set these variables for clarity and brevity later on
set {appName, topMenu} to (items 1 through 2 of mList)
set r to (items 3 through (mList''s length) of mList)
-- This overly-long line calls the menu_recurse function with
-- two arguments: r, and a reference to the top-level menu
tell application "System Events" to my menu_click_recurse(r, ((process appName)''s ¬
(menu bar 1)''s (menu bar item topMenu)''s (menu topMenu)))
end menu_click
on menu_click_recurse(mList, parentObject)
local f, r
-- `f` = first item, `r` = rest of items
set f to item 1 of mList
if mList''s length > 1 then set r to (items 2 through (mList''s length) of mList)
-- either actually click the menu item, or recurse again
tell application "System Events"
if mList''s length is 1 then
click parentObject''s menu item f
else
my menu_click_recurse(r, (parentObject''s (menu item f)''s (menu f)))
end if
end tell
end menu_click_recurse
application "iPhone Simulator" activate
menu_click({"iPhone Simulator", "iOS Simulator", "Reset Content and Settings…"})
tell application "System Events"
tell process "iPhone Simulator"
tell window 1
click button "Reset"
end tell
end tell
end tell
SCRIPT
Lo comprobé con XCode 9. Para cerrar todos los simuladores activos, ejecuta:
xcrun simctl shutdown all
Para restablecer todos los simuladores, ejecuta:
xcrun simctl erase all
Puede filtrar qué simulador cerrar / restablecer de esta manera:
xcrun simctl shutdown F36B238F-3ED6-4E10-BB5A-0726151916FA
xcrun simctl erase F36B238F-3ED6-4E10-BB5A-0726151916FA
Encuentre todos los simuladores accesibles (y su GUID) en su máquina de esta manera:
xcrun instruments -s
Para ejecutar cualquier simulador por GUID:
xcrun instruments -w F36B238F-3ED6-4E10-BB5A-0726151916FA -t Blank
Para instalar la aplicación en el simulador arrancado:
xcrun simctl install booted /path/to/your.app
Para eliminar la aplicación del simulador arrancado:
xcrun simctl uninstall booted /path/to/your.app
Para iniciar la aplicación en el simulador de arranque:
xcrun simctl launch booted "com.app.bundleIdentifier"
"com.app.bundleIdentifier" es su CFBundleIdentifier en Info.plist
Pensé que publicaría esto para cualquiera que se encuentre con la misma necesidad. Alguien en reddit me dio esta solución (que probé y funciona muy bien). Tenga en cuenta que esta vez necesita una elipsis después de "Configuración", no tres períodos (raro).
Este es un AppleScript que se puede invocar desde la línea de comando para reiniciar el simulador:
tell application "iPhone Simulator"
activate
end tell
tell application "System Events"
tell process "iPhone Simulator"
tell menu bar 1
tell menu bar item "iOs Simulator"
tell menu "iOs Simulator"
click menu item "Reset Content and Settings…"
end tell
end tell
end tell
tell window 1
click button "Reset"
end tell
end tell
end tell
Guardar como /path/to/script
e invocar con:
osascript /path/to/script
Quiero agregar algo a la respuesta de Cameron Brown . Para asegurarme de que se restablece la versión correcta (por ejemplo, iPad, versión 6.1), inicio el simulador de iOS a través de ios-sim :
version=$(echo "$DESTINATION" | egrep -o "OS=[0-9.]{3}" | cut -d ''='' -f 2)
simType=$(echo "$DESTINATION" | egrep -o "name=[a-zA-Z]*" | cut -d ''='' -f 2 | tr "[A-Z]" "[a-z]")
IOS_SIM_BIN=$(which ios-sim)
if [ -z $IOS_SIM_BIN ]
then
echo "ios-sim not installed, please use ''sudo npm install ios-sim -g''"
fi
echo "Resetting Simulator /"$simType/", version /"$version/""
$IOS_SIM_BIN start --family $simType --sdk $version --timeout 1
osascript /path/to/reset_simulator.applescript
$DESTINATION
puede ser, por ejemplo, "OS=7.0,name=iPad"
.
Para que funcione correctamente, adapté un reset_simulator.applescript un poco y eliminé la parte de activación:
tell application "iPhone Simulator"
activate
end tell
Sobre la base de la mayoría de las respuestas anteriores, estoy usando Keyboard Maestro e hice una pequeña macro para reiniciar el simulador en ejecución y reiniciarlo. Vuelve a centrar la atención en Xcode después de restablecer y reiniciar, por lo que puedo presionar Command+R
nuevamente para volver a ejecutar la aplicación, lo que me parece muy conveniente.
El contenido del script de ruby es:
#!/usr/bin/env ruby
list = `xcrun simctl list`.split("/n")
list.each do |line|
if line =~ //(Booted/)$/
device = line.match(/([^(]*)/s+/(([^)]*)/)/s+/(([^)]*)/).*/)[1]
uuid = line.match(/([^(]*)/s+/(([^)]*)/)/s+/(([^)]*)/).*/)[2]
status = line.match(/([^(]*)/s+/(([^)]*)/)/s+/(([^)]*)/).*/)[3]
puts uuid
break
end
end
Usamos la siguiente secuencia de comandos python para restablecer el simulador en nuestro servidor de compilación.
#!/usr/bin/env python
import subprocess
import re
import os
def uninstall_app():
print ''Running %s'' % __file__
# Get (maybe read from argv) your bundle identifier e.g. com.mysite.app_name
try:
bundle_identifier = ''$'' + os.environ[''BUNDLE_IDENTIFIER'']
except KeyError, e:
print ''Environment variable %s not found. '' % e
print ''Environment: '', os.environ
exit(1)
print ''Uninstalling app with Bundle identifier: '', bundle_identifier
# We call xcrun, and strip the device GUIDs from the output
process = subprocess.Popen([''xcrun'', ''simctl'', ''list''], stdout=subprocess.PIPE)
# Read first line
line = process.stdout.readline()
while True:
# Assume first match inside parenthesis is what we want
m = re.search(''/((.*?)/)'', line)
if not (m is None):
# The regex found something,
# group(1) will throw away the surrounding parenthesis
device_GUID = m.group(1)
# Brutely call uninstall on all listed devices. We know some of these will fail and output an error, but, well..
subprocess.call([''xcrun'', ''simctl'', ''uninstall'', device_GUID, bundle_identifier])
# Read next line
line = process.stdout.readline()
# Stop condition
if line == '''':
break
if __name__ == ''__main__'':
uninstall_app()
Supone que el identificador del paquete de su aplicación está configurado como una variable de entorno, por ejemplo
export BUNDLE_IDENTIFIER=com.example.app_name
tal vez quieras pasar el identificador del paquete de otra manera.
los nombres de destino y el nombre de la aplicación del simulador parecen haber cambiado un poco a xCode6 / iOS8. Aquí está una versión actualizada del osascript de Cameron Brown para xCode6 / iOS8:
tell application "iPhone Simulator"
activate
end tell
tell application "System Events"
tell process "iPhone Simulator"
tell menu bar 1
tell menu bar item "iOs Simulator"
tell menu "iOs Simulator"
click menu item "Reset Content and Settings…"
end tell
end tell
end tell
tell window 1
click button "Reset"
end tell
end tell
end tell
sencillo :
xcrun simctl erase all
mejora sugerida por @txulu, simplemente mata el simulador antes de ejecutar la limpieza:
killall "Simulator" 2> /dev/null; xcrun simctl erase all