Как мне сбросить iOS Simulator из командной строки? - PullRequest
58 голосов
/ 26 февраля 2011

Мне нужно много раз сбросить iPhone Simulator, и я не нашел способа сделать это без использования мыши. Это мелочь, но я очень устал от этого и хотел бы иметь способ сделать это с помощью сочетания клавиш.

Еще лучше был бы способ восстановить его из командной строки, чтобы я мог встроить сброс в сценарий развертывания.

Я не очень знаком с iOS или MacOS.

Ответы [ 17 ]

0 голосов
/ 07 октября 2015

Вот задача Rakefile для сброса целевого симулятора.Это работает с Xcode 7, так как инструменты командной строки Xcode 7 нарушили команду удаления xcrun simctl.У меня есть небольшой метод runC, так как мне нравится видеть фактическую команду терминала, а также ее вывод.

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 голосов
/ 30 июля 2015

Основываясь на большинстве приведенных выше ответов, я использую Keyboard Maestro и сделал небольшой макрос, чтобы сбросить текущий запущенный симулятор и перезапустить его. После сброса и перезапуска фокус снова возвращается к Xcode, поэтому я могу сразу же нажать Command+R, чтобы перезапустить приложение, что мне очень удобно.

enter image description here

Содержимое сценария ruby:

#!/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 голосов
/ 18 апреля 2015

Мы используем следующий скрипт Python для сброса симулятора на нашем сервере сборки.

#!/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()

Предполагается, что идентификатор пакета вашего приложения установлен в качестве переменной среды, например,

export BUNDLE_IDENTIFIER=com.example.app_name

возможно, вы захотите передать идентификатор пакета другим способом.

0 голосов
/ 09 декабря 2014

В качестве дополнительного бонуса к использованию команд xcrun вы можете запустить устройство после того, как вы перечислили с

xcrun simctl list

Запустив список, запустите:

xcrun instruments -w "iPhone 5s (8.1 Simulator) [31E5EF01-084B-471B-8AC6-C1EA3167DA9E]"
0 голосов
/ 26 сентября 2014

имена целей и имя приложения Simulator, похоже, немного изменились на xCode6 / iOS8.Вот обновленная версия osascript Кэмерона Брауна для 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
0 голосов
/ 06 марта 2013

Представляю,

Сценарий сброса Симулятора iOS (ссылка)

enter image description here

На основе кода Одеда Регева(который был основан на прекрасном коде «menu_click» Якоба Руса)

0 голосов
/ 08 октября 2013

Я хочу добавить что-то к Кэмерон Браун в ответ . Чтобы убедиться, что установлена ​​правильная версия (например, iPad, версия 6.1), я запускаю симулятор iOS через 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 может быть, например, "OS=7.0,name=iPad".

Чтобы это работало правильно, я немного адаптировал файл reset_simulator.applescript и удалил часть активации:

tell application "iPhone Simulator"
    activate
end tell
...