Je dois souvent réinitialiser l'iPhone Simulator et je n'ai pas trouvé de moyen de le faire sans utiliser la souris. C'est une petite chose, mais j'en ai vraiment marre 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, afin que je puisse créer une réinitialisation dans un script de déploiement.
Je ne connais pas très bien iOS ou MacOS.
Exécutez simplement ceci dans le terminal:
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 Xcode 6, NE SUPPRIMEZ PAS JUSTE LE DOSSIER DU SIMULATEUR! Cela gâchera les choses et vous causera des maux de tête.
Dans Xcode 6, il existe en fait un outil pour contrôler le simulateur à partir de la ligne de commande.
Assurez-vous que vos paramètres de ligne de commande sont définis sur Xcode 6
xcrun simctl
Dans Xcode 6, chaque périphérique a un GUID/UUID associé, 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 configuré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 exécutez xcrun simctl erase
par exemple,
xcrun simctl erase 5B78FC0D-0034-4134-8B1F-19FD0EC9D581
effacerait l'appareil iOS 7.0, iPhone 5
Je pensais que je publierais ceci pour toute personne ayant les mêmes besoins. Quelqu'un sur reddit m'a donné cette solution (que j'ai testée et cela fonctionne très bien). Notez que cette fois, vous avez besoin d'un Ellipsis après "Paramètres", pas trois périodes (bizarre).
Il s'agit d'un AppleScript qui peut être appelé à 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 invoquer avec:
osascript /path/to/script
COPY-PASTE ANSWER - note: réinitialisera le contenu et les paramètres de tous les simulateurs disponibles.
Merci @Alpine pour l'inspiration et les connaissances. Si vous exécutez cela dans votre ligne de commande, vous devriez pouvoir réinitialiser toutes les sims 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 $1 }' output.txt`
do
xcrun simctl erase $UUID
done
Supprimer le contenu de
~/Library/Application Support/iPhone Simulator/<sdk revision>
Et vous êtes prêt à partir.
Je l'ai vérifié avec XCode 9. Pour fermer tous les simulateurs actifs, exécutez:
xcrun simctl shutdown all
Pour réinitialiser tous les simulateurs exécutés:
xcrun simctl erase all
Vous pouvez filtrer le simulateur à fermer/réinitialiser comme ceci:
xcrun simctl shutdown F36B238F-3ED6-4E10-BB5A-0726151916FA
xcrun simctl erase F36B238F-3ED6-4E10-BB5A-0726151916FA
Trouvez tous les simulateurs accessibles (et leur GUID) sur votre machine comme ceci:
xcrun instruments -s
Pour exécuter n'importe quel simulateur par GUID:
xcrun instruments -w F36B238F-3ED6-4E10-BB5A-0726151916FA -t Blank
Pour installer l'application sur le simulateur démarré:
xcrun simctl install booted /path/to/your.app
Pour supprimer l'application 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 dans Info.plist
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 fonctionne 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 la boîte de dialogue du sélecteur d'application.
Dans cette boîte de dialogue, vous ne pouvez pas "Afficher le contenu du package" pour explorer un .app, vous devrez donc utiliser Go to Folder
via Cmd-Shift-G. (Ouvrez d'abord le menu déroulant de l'application et sélectionnez Other
)
Dans la version actuelle de Xcode, accédez au chemin:
/Applications/Xcode/Contents/Developer/Applications
Sélectionnez Simulator.app
et appuyez sur "Ajouter"
Pour Menu Title
, entrer Reset Content and Settings...
Pour Keyboard Shortcut
, presse CMD-Shift-R
J'ai trouvé cet outil très utile appelé "SimulatorManager": http://tue-savvy.github.io Il réinitialisera tous vos simulateurs au moyen d'un widget de barre de menus (je ne sais pas si c'est ce que appelé) mais en plus de cela, il vous donnera un accès rapide à toutes vos données d'application. Je ne peux vraiment plus vivre sans. Faire connaitre!
J'ai écrit un script qui réinitialisera le contenu et les paramètres de toutes les versions et appareils du simulateur iOS. Il saisit les noms des appareils et les numéros de version dans le menu, il inclura donc tous les nouveaux appareils ou versions iOS pour lesquels Apple publie des simulateurs pour.
Il est facile à exécuter manuellement ou à utiliser dans un script de build. Je suggère de l'ajouter en tant que script d'exécution pré-action avant la génération.
Il est fortement basé sur le script de Stian ci-dessus, mais ne devient pas obsolète avec les nouvelles versions d'iOS, et élimine la boîte de dialogue (mieux pour les scripts de construction d'automatisation et le travail à partir de la ligne de commande).
Voici une tâche Rakefile pour réinitialiser un simulateur ciblé. Cela fonctionne avec Xcode 7 car les outils de ligne de commande Xcode 7 ont interrompu la commande de désinstallation de xcrun simctl. J'ai une petite méthode runC personnalisée car j'aime voir la commande du terminal réelle 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
Nous utilisons le script python suivant) pour réinitialiser le simulateur sur notre serveur de build.
#!/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 __== '__main__':
uninstall_app()
Il suppose que l'identifiant de bundle de votre application est défini comme une variable d'environnement, par exemple.
export BUNDLE_IDENTIFIER=com.example.app_name
vous voudrez peut-être passer l'identifiant du bundle d'une autre manière.
En s'appuyant sur la plupart des réponses ci-dessus, j'utilise Keyboard Maestro et j'ai créé une petite macro pour réinitialiser le simulateur en cours d'exécution et le redémarrer. Il revient à Xcode après la réinitialisation et le redémarrage, donc je peux frapper Command+R
encore une fois pour relancer l'application, ce 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
Je veux ajouter quelque chose à réponse de Cameron Brown . Pour m'assurer que la version correcte est réinitialisée (par exemple, 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 par exemple "OS=7.0,name=iPad"
.
Pour que cela fonctionne correctement, j'ai un peu adapté le reset_simulator.applescript et supprimé la partie d'activation:
tell application "iPhone Simulator"
activate
end tell
En plus de l'utilisation des commandes xcrun, vous pouvez lancer un appareil après avoir répertorié avec
xcrun simctl list
Une fois la liste affichée, exécutez:
xcrun instruments -w "iPhone 5s (8.1 Simulator) [31E5EF01-084B-471B-8AC6-C1EA3167DA9E]"