Comment puis-je réinitialiser le simulateur iOS à partir de la ligne de commande?
j'ai besoin de réinitialiser le simulateur iPhone beaucoup, et n'ai pas trouvé un moyen de le faire sans utiliser la souris. C'est une petite chose, mais je suis vraiment malade de le faire et j'aimerais avoir un moyen de le faire en utilisant un raccourci clavier.
encore mieux serait un moyen de le réinitialiser à partir de la ligne de commande, pour que je puisse construire une réinitialisation dans un script de déploiement.
je ne suis pas très familier avec iOS ou MacOS.
17 réponses
simple:
xcrun simctl erase all
amélioration suggérée par @txulu, il suffit de tuer le simulateur avant d'exécuter le nettoyage:
killall "Simulator" 2> /dev/null; xcrun simctl erase all
dans le Xcode 6, Ne supprimez pas seulement le dossier du simulateur! Ça va tout foutre en l'air, et ça va te causer des maux de tête.
dans Xcode 6, Il y a en fait un outil pour contrôler le simulateur depuis la ligne de commande.
assurez-vous que vos paramètres de ligne de commande sont définis à Xcode 6
xcrun simctl
dans le Xcode 6, chaque périphérique a un GUID/UUID associé à lui, pour réinitialiser un périphérique spécifique, vous avez besoin du GUID pour cela.
la commande
xcrun simctl list
vous montrera tous les appareils que vous avez installés. La sortie ressemblera à ceci:
== 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)
copiez simplement le GUID de l'intérieur des parenthèses, et lancez xcrun simctl erase
par exemple,
xcrun simctl erase 5B78FC0D-0034-4134-8B1F-19FD0EC9D581
effacerait l'appareil iOS 7.0, iPhone 5
a pensé que je posterais ceci pour tous ceux qui rencontrent le même besoin. Quelqu'un sur reddit m'a donné cette solution (que j'AI testée et qui fonctionne très bien). Notez que cette fois vous avez besoin d'une ellipse après "Paramètres", pas trois périodes (bizarre).
Ceci est un AppleScript qui peut être invoqué à partir de la ligne de commande pour réinitialiser le simulateur:
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
Enregistrer sous /path/to/script
et d'appeler:
osascript /path/to/script
copier-coller réponse-note: va réinitialiser le contenu et les paramètres de tous les simulateurs disponibles.
Merci @Alpine pour l'inspiration et la connaissance. Si vous lancez ceci dans votre ligne de commande, vous devriez être en mesure de réinitialiser tous les Sim disponibles. Cela fonctionne avec 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 }' output.txt`
do
xcrun simctl erase $UUID
done
supprimer le contenu de
~/Library/Application Support/iPhone Simulator/<sdk revision>
et vous pouvez y aller.
la solution de raccourci clavier n'est plus pertinente et malheureusement la solution @Cameron n'a pas fonctionné pour moi non plus (j'ai essayé de la déboguer sans succès)
voici ce qui marche pour moi:
#!/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
lors de l'installation de Xcode, je crée toujours un raccourci clavier pour "réinitialiser le contenu et les paramètres" dans le simulateur. Un gain de temps extrêmement utile.
System Preferences > Keyboard > Shortcuts > App Shortcuts > "+"
dans le sélecteur D'Application, sélectionnez "Autre"..."pour ouvrir le dialogue application picker.
dans ce dialogue, vous ne pouvez pas" afficher le contenu du paquet " pour explorer A.app, vous aurez donc besoin d'utiliser Go to Folder
via Cmd - Shift - G . (Ouvrez d'abord le menu déroulant de la demande et sélectionnez Other
)
dans la version actuelle de Xcode, allez sur le chemin:
/Applications/Xcode/Contents/Developer/Applications
sélectionner Simulator.app
et appuyer sur "Ajouter "
pour Menu Title
, inscrivez Reset Content and Settings...
pour Keyboard Shortcut
, appuyer sur CMD - Shift - R
j'ai vérifié avec XCode 9. Pour fermer tous les simulateurs actifs exécuter:
xcrun simctl shutdown all
pour réinitialiser tous les simulateurs:
xcrun simctl erase all
vous pouvez filtrer ce que le simulateur de fermer / réinitialiser comme ceci:
xcrun simctl shutdown F36B238F-3ED6-4E10-BB5A-0726151916FA
xcrun simctl erase F36B238F-3ED6-4E10-BB5A-0726151916FA
Retrouvez tous les simulateurs accessibles (et leur interface) sur votre machine comme ceci:
xcrun instruments -s
pour faire fonctionner n'importe quel simulateur par guidage:
xcrun instruments -w F36B238F-3ED6-4E10-BB5A-0726151916FA -t Blank
pour installer app à la simulateur de démarrage:
xcrun simctl install booted /path/to/your.app
pour retirer app du simulateur démarré:
xcrun simctl uninstall booted /path/to/your.app
pour lancer l'application dans le simulateur démarré:
xcrun simctl launch booted "com.app.bundleIdentifier"
" com.App.bundleIdentifier" est votre CFBundleIdentifier en Info.plist
j'ai écrit un script qui va réinitialiser le contenu et les paramètres de toutes les versions et les appareils pour le simulateur iOS. Il saisit les noms de périphériques et les numéros de version à partir du menu, de sorte qu'il comprendra tous les nouveaux périphériques ou les versions iOS pour lesquels Apple publie des simulateurs.
c'est facile à exécuter manuellement ou à utiliser dans un script de construction. Je suggère de l'ajouter en tant que Script de pré-action avant la compilation.
il est fortement basé sur le script de Stian ci-dessus, mais ne devient pas périmé avec les nouvelles versions iOS, et élimine la boîte de dialogue (mieux pour l'automatisation construire des scripts et travailler à partir de la ligne de commande).
j'ai trouvé cet outil très utile appelé " SimulatorManager": http://tue-savvy.github.io Il va réinitialiser tous vos simulateurs au moyen d'un widget de barre de menu (pas sûr si c'est ce que son nom), mais en plus de cela, il vous donnera un accès rapide à toutes vos données d'application. Je ne peux vraiment pas vivre sans plus. À passer le mot!
je veux ajouter quelque chose à la réponse de Cameron Brown . Pour s'assurer que la version correcte est réinitialisée (E. g, iPad, version 6.1), je démarre le simulateur iOS via 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
peut être E. g "OS=7.0,name=iPad"
.
pour que ça fonctionne correctement, j'ai adapté le reset_simulator.applescript un peu et a supprimé la partie d'activation:
tell application "iPhone Simulator"
activate
end tell
comme bonus supplémentaire à l'utilisation des commandes xcrun vous pouvez lancer un appareil après avoir inscrit
xcrun simctl list
une fois la liste affichée, Lancez:
xcrun instruments -w "iPhone 5s (8.1 Simulator) [31E5EF01-084B-471B-8AC6-C1EA3167DA9E]"
nous utilisons le script python suivant pour réinitialiser le simulateur sur notre serveur de construction.
#!/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()
il suppose que l'identifiant du paquet de votre application est défini comme une variable d'environnement, par exemple
export BUNDLE_IDENTIFIER=com.example.app_name
peut-être que vous voulez passer l'identifiant du paquet d'une autre manière.
en me basant sur la plupart des réponses ci-dessus, j'utilise Keyboard Maestro et j'ai fait une petite Macro pour réinitialiser le simulateur en cours d'exécution et le redémarrer.
Il tourne la mise au point de nouveau à Xcode après la réinitialisation et redémarrage, de sorte que je peux frapper Command+R
encore tout de suite pour relancer l'application, que je trouve très pratique.
le contenu du script ruby est:
#!/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
voici une tâche Rakefile pour réinitialiser un simulateur ciblé. Cela fonctionne avec Xcode 7 puisque les outils de la ligne de commande Xcode 7 ont cassé la commande de désinstallation de xcrun simctl. J'ai une méthode d'exécution personnalisée car j'aime voir la commande du terminal ainsi que sa sortie.
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
et le nom d'application du simulateur semblent avoir changé un peu pour xCode6 / iOS8. Voici la version non mise à jour de L'osascript de Cameron Brown pour 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
je présente,
Définitive Simulateur iOS Réinitialiser Script (lien)
basé sur le code D'Oded Regev (qui était basé sur le code d'amende de Jacob Rus "menu_click")