Ответ 1
Просто запустите это в терминале:
xcrun simctl erase all
улучшение, предложенное @txulu, просто убейте симулятор перед выполнением очистки:
killall "Simulator" 2> /dev/null; xcrun simctl erase all
Мне нужно reset симулятор iPhone много, и не нашел способ сделать это, не используя мышь. Это мелочь, но мне очень больно это делать, и мне бы хотелось, чтобы это было сделано с помощью сочетания клавиш.
Еще лучше было бы использовать reset из командной строки, поэтому я мог бы создать reset в развертывании script.
Я не очень хорошо знаком с iOS или MacOS.
Просто запустите это в терминале:
xcrun simctl erase all
улучшение, предложенное @txulu, просто убейте симулятор перед выполнением очистки:
killall "Simulator" 2> /dev/null; xcrun simctl erase all
В 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
Думаю, я бы опубликовал это для всех, кто сталкивался с такой же потребностью. Кто-то из 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
КОПИРОВАЛЬНЫЙ ОТВЕТ - примечание: будет 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
Удалить содержимое
~/Library/Application Support/iPhone Simulator/<sdk revision>
И тебе хорошо идти.
Я проверил это с помощью 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
Решение для коротких клавиш на клавиатуре больше не подходит, и, к сожалению, решение @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
После установки 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
Я написал script, который будет reset содержимым и настройками всех версий и устройств для iOS Simulator. Он захватывает имена устройств и номера версий из меню, поэтому он будет включать в себя любые новые устройства или версии iOS, которые Apple выпускает для симуляторов.
Легко запускается вручную или используется в build- script. Я бы предложил добавить его в качестве предварительного действия script перед сборкой.
Он в значительной степени основывался на Stian script выше, но не устаревает с новыми версиями iOS и устраняет диалоговое окно (лучше для сценариев создания сборки и работы из командной строки).
Я нашел этот очень полезный инструмент под названием "SimulatorManager": http://tue-savvy.github.io Это будет reset все ваши симуляторы с помощью виджета панели меню (не уверен, что это называется), но, кроме того, он даст вам быстрый доступ ко всем вашим данным приложения. Я больше не могу жить без него. Разместите слово!
Я хочу добавить что-то в ответ Кэмерона Брауна. Чтобы убедиться, что правильная версия сбрасывается (например, 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
В качестве дополнительного бонуса к использованию команд xcrun вы можете запустить устройство после того, как вы указали с помощью
xcrun simctl list
После того, как вы просмотрели список:
xcrun instruments -w "iPhone 5s (8.1 Simulator) [31E5EF01-084B-471B-8AC6-C1EA3167DA9E]"
Мы используем следующий 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
Возможно, вам нужно передать идентификатор пакета другим способом.
Основываясь на большинстве приведенных выше ответов, я использую 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
Здесь задача 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
целевые имена и имя приложения 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
Я представляю,
Основываясь на коде Oded Regev (который был основан на коде "menu_click" от Jacob Rus)