Подтвердить что ты не робот

Как я могу reset iOS Simulator из командной строки?

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

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

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

4b9b3361

Ответ 1

Просто запустите это в терминале:

xcrun simctl erase all

улучшение, предложенное @txulu, просто убейте симулятор перед выполнением очистки:

killall "Simulator" 2> /dev/null; xcrun simctl erase all

Ответ 2

В Xcode 6 НЕ УДАЛЯЙТЕ ПАПКУ ДЛЯ СИМУЛЯТОРА! Он будет винить вещи, и это приведет к головной боли.

В Xcode 6 на самом деле есть инструмент для управления симулятором из командной строки.

Убедитесь, что для параметров командной строки установлено значение Xcode 6

xcrun simctl

В Xcode 6 каждое устройство имеет связанный с ним GUID/UUID, к reset конкретному устройству, для этого вам нужен GUID.

Команда

xcrun simctl list

покажет вам все устройства, которые вы настроили. Результат будет выглядеть так:

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

Просто скопируйте GUID из круглых скобок и запустите xcrun simctl erase

например,

xcrun simctl erase 5B78FC0D-0034-4134-8B1F-19FD0EC9D581

удалит устройство iOS 7.0, iPhone 5

Ответ 3

Думаю, я бы опубликовал это для всех, кто сталкивался с такой же потребностью. Кто-то из reddit дал мне это решение (которое я тестировал, и он отлично работает). Обратите внимание, что на этот раз вам понадобится многоточие после "Настройки", а не три периода (странно).

Это AppleScript, который можно вызвать из командной строки в reset Симулятор:

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

Сохранить как /path/to/script и вызвать с помощью:

osascript /path/to/script

Ответ 4

КОПИРОВАЛЬНЫЙ ОТВЕТ - примечание: будет reset содержимое и настройки всех доступных симуляторов.

Спасибо @Alpine за вдохновение и знания. Если вы запустите это в своей командной строке, вы сможете reset всех доступных симов. Это работает с 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

Ответ 5

Удалить содержимое

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

И тебе хорошо идти.

Ответ 6

Я проверил это с помощью XCode 9. Чтобы закрыть все активные симуляторы, выполните:

xcrun simctl shutdown all

Для сброса всех симуляторов выполните:

xcrun simctl erase all

Вы можете отфильтровать симулятор для закрытия/сброса следующим образом:

xcrun simctl shutdown F36B238F-3ED6-4E10-BB5A-0726151916FA
xcrun simctl erase F36B238F-3ED6-4E10-BB5A-0726151916FA

Найдите все доступные симуляторы (и их GUID) на вашем компьютере следующим образом:

xcrun instruments -s

Чтобы запустить любой симулятор по GUID:

xcrun instruments -w F36B238F-3ED6-4E10-BB5A-0726151916FA -t Blank

Чтобы установить приложение на загруженный симулятор:

xcrun simctl install booted /path/to/your.app

Чтобы удалить приложение из загруженного симулятора:

xcrun simctl uninstall booted /path/to/your.app

Чтобы запустить приложение в загруженном симуляторе:

xcrun simctl launch booted "com.app.bundleIdentifier"

com.app.bundleIdentifier - это ваш CFBundleIdentifier в Info.plist

Ответ 7

Решение для коротких клавиш на клавиатуре больше не подходит, и, к сожалению, решение @Cameron тоже не работает для меня (я пытался отлаживать его без везения)

Вот что работает для меня:

#!/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 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 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) ¬
        (menu bar 1) (menu bar item topMenu) (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 length > 1 then set r to (items 2 through (mList length) of mList)

    -- either actually click the menu item, or recurse again
    tell application "System Events"
        if mList length is 1 then
            click parentObject menu item f
        else
            my menu_click_recurse(r, (parentObject (menu item f) (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

Ответ 8

После установки Xcode я всегда создаю ярлык для клавиш "Reset Содержание и настройки" в симуляторе. Очень полезная экономия времени.

System Preferences > Keyboard > Shortcuts > App Shortcuts > "+"

В приложении "Выбор" выберите "Другое...", чтобы открыть диалоговое окно выбора приложения.

В этом диалоговом окне вы не можете "Показать содержимое пакета", чтобы изучить .app, поэтому вам нужно использовать Go to Folder через Cmd - Shift - G. (Сначала откройте приложение и выберите Other)

В текущей версии Xcode перейдите к следующему пути:

/Applications/Xcode/Contents/Developer/Applications

Выберите Simulator.app и нажмите "Добавить"

Для Menu Title введите Reset Content and Settings...

Для Keyboard Shortcut нажмите Cmd - Shift - R

Reset Содержание и настройки

Ответ 9

Я написал script, который будет reset содержимым и настройками всех версий и устройств для iOS Simulator. Он захватывает имена устройств и номера версий из меню, поэтому он будет включать в себя любые новые устройства или версии iOS, которые Apple выпускает для симуляторов.

Легко запускается вручную или используется в build- script. Я бы предложил добавить его в качестве предварительного действия script перед сборкой.

Он в значительной степени основывался на Stian script выше, но не устаревает с новыми версиями iOS и устраняет диалоговое окно (лучше для сценариев создания сборки и работы из командной строки).

https://github.com/michaelpatzer/ResetAllSimulators

Ответ 10

Я нашел этот очень полезный инструмент под названием "SimulatorManager": http://tue-savvy.github.io Это будет reset все ваши симуляторы с помощью виджета панели меню (не уверен, что это называется), но, кроме того, он даст вам быстрый доступ ко всем вашим данным приложения. Я больше не могу жить без него. Разместите слово!

Ответ 11

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

Ответ 12

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

xcrun simctl list

После того, как вы просмотрели список:

xcrun instruments -w "iPhone 5s (8.1 Simulator) [31E5EF01-084B-471B-8AC6-C1EA3167DA9E]"

Ответ 13

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

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

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

Ответ 14

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

введите описание изображения здесь

Содержимое ruby ​​ script:

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

Ответ 15

Здесь задача Rakefile для reset целевого симулятора. Это работает с Xcode 7, так как инструменты командной строки Xcode 7 нарушили команду xcrun simctl uninstall. У меня есть небольшой пользовательский метод 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

Ответ 16

целевые имена и имя приложения Simulator, похоже, немного изменились на xCode6/iOS8. Ниже приведена обновленная версия osascript Cameron Brown для 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