web-dev-qa-db-fra.com

Comment puis-je réinitialiser le simulateur iOS à partir de la ligne de commande?

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.

59
Cameron Brown

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
76
Kappe

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

55
Alpine

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
37
Cameron Brown

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
16
Joe Susnick

Supprimer le contenu de

~/Library/Application Support/iPhone Simulator/<sdk revision>

Et vous êtes prêt à partir.

11
jdc

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

7
LGFox

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
4
Oded Regev

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

Reset Content and Settings

4
pkamb

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!

1
Sjakelien

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).

https://github.com/michaelpatzer/ResetAllSimulators

1
mpatzer

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
0
n8tr

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.

0
andershqst

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.

enter image description here

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
0
wrtsprt

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
0
asgoth

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]"
0
Laser Hawk