如何从命令行重置 iOS 模拟器?

发布于 2024-10-19 05:31:37 字数 152 浏览 7 评论 0原文

我需要经常重置 iPhone 模拟器,但还没有找到不使用鼠标的方法。这是一件小事,但我真的厌倦了这样做,并且希望有一种方法可以使用键盘快捷键来完成此操作。

更好的是从命令行重置它,这样我就可以将重置构建到部署脚本中。

我对 iOS 或 MacOS 不太熟悉。

I need to reset the iPhone Simulator a lot, and haven't found a way to do it without using the mouse. It's a small thing, but I'm really sick of doing it and would love to have a way to do this using a keyboard shortcut.

Even better would be a way to reset it from the command line, so I could build a reset into a deploy script.

I am not very familiar with iOS or MacOS.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(18

平定天下 2024-10-26 05:31:37

只需在终端中运行此命令:

xcrun simctl shutdown all && xcrun simctl erase all

@txulu 建议的另一种方法,在删除模拟器之前终止进程:

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

Just run this in the terminal:

xcrun simctl shutdown all && xcrun simctl erase all

Another approach suggested by @txulu, before erasing the simulator kill the process:

killall "Simulator" 2> /dev/null; xcrun simctl erase all
人海汹涌 2024-10-26 05:31:37

在 Xcode 6 中,不要只删除模拟器的文件夹!它会把事情搞砸,而且会让你头疼。

在 Xcode 6 中,实际上有一个工具可以从命令行控制模拟器。

确保您的命令行设置设置为 Xcode 6

xcrun simctl

在 Xcode 6 中,每个设备都有一个与其关联的 GUID/UUID,要重置特定设备,您需要它的 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 freeze

例如,

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

将擦除 iOS 7.0、iPhone 5 设备

In Xcode 6, DO NOT JUST DELETE THE FOLDER FOR THE SIMULATOR! It WILL screw things up, and it WILL cause you a headache.

In Xcode 6, there's actually a tool to control the simulator from the command line.

Make sure your command line settings are set to Xcode 6

xcrun simctl

In Xcode 6, each device has a GUID/UUID associated to it, to reset a specific device, you need the GUID for it.

The command

xcrun simctl list

will show you all of the devices you have set up. The output will look like this:

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

Just copy the GUID from inside the parentheses, and run xcrun simctl erase

for example,

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

would erase the iOS 7.0, iPhone 5 device

坚持沉默 2024-10-26 05:31:37

我想我会把这篇文章发布给任何遇到同样需求的人。 reddit 上有人给了我这个解决方案(我测试过,效果很好)。请注意,这次“Settings”后面需要一个省略号,而不是三个句点(很奇怪)。

这是一个 AppleScript,可以从命令行调用来重置模拟器:

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

Thought I'd post this for anyone who runs into the same need. Someone on reddit gave me this solution (which I tested and it works great). Note that this time you need an ellipsis after "Settings", not three periods (weird).

This is an AppleScript that can be invoked from the command line to reset the Simulator:

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

Save as /path/to/script and invoke with:

osascript /path/to/script
疾风者 2024-10-26 05:31:37

我用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”是 Info.plist 中的 CFBundleIdentifier

I checked it with XCode 9.
To close all active simulators run:

xcrun simctl shutdown all

To reset all simulators run:

xcrun simctl erase all

You can filter what simulator to close/reset like this:

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

Find all accessible simulators (and their GUID) on your machine like this:

xcrun instruments -s

To run any simulator by GUID:

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

To install app to the booted simulator:

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

To remove app from the booted simulator:

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

To launch the app in the booted simulator:

xcrun simctl launch booted "com.app.bundleIdentifier"

"com.app.bundleIdentifier" is your CFBundleIdentifier in Info.plist

懒猫 2024-10-26 05:31:37

复制粘贴答案 - 注意:将重置所有可用模拟器的内容和设置。

感谢@Alpine 的灵感和知识。如果您在命令行中运行此命令,您应该能够重置所有可用的模拟人生。这适用于 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

COPY-PASTE ANSWER - note: will reset the contents and settings of all available simulators.

Thanks @Alpine for the inspiration and knowledge. If you run this in your command line you should be able to reset all the available sims. This works with 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
随心而道 2024-10-26 05:31:37

删除 的内容

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

就可以了。

Delete the contents of

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

And you're good to go.

酒与心事 2024-10-26 05:31:37

安装 Xcode 后,我总是在模拟器中创建“重置内容和设置”的键盘快捷键。非常有用的节省时间的工具。

系统偏好设置>键盘>快捷方式>应用程序快捷方式> “+”

在应用程序选择器中,选择“其他...”以打开应用程序选择器对话框。

在此对话框中,您无法“显示包内容”来浏览 .app,因此您需要通过 Cmd-Shift 使用转到文件夹 -G。 (首先打开应用程序下拉列表并选择其他

在当前版本的Xcode中,转到路径:

/Applications/Xcode/Contents/Developer/Applications

选择Simulator.app 并按“添加”

对于菜单标题,输入重置内容和设置...

对于键盘快捷键,按 CMD-Shift-R

重置内容和设置

Upon installing Xcode I always create a keyboard shortcut for "Reset Content and Settings" in the simulator. An extremely useful time saver.

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

In the Application picker, select "Other..." to open the app picker dialog.

In this dialog you're unable to "Show Package Contents" to explore a .app, so you'll need to use Go to Folder via Cmd-Shift-G. (First open the application drop down and select Other)

In the current version of Xcode, go to the path:

/Applications/Xcode/Contents/Developer/Applications

Select Simulator.app and press "Add"

For Menu Title, enter Reset Content and Settings...

For Keyboard Shortcut, press CMD-Shift-R

Reset Content and Settings

葮薆情 2024-10-26 05:31:37

键盘快捷键解决方案不再相关,不幸的是@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'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

The keyboard short-cut solution is not relevant anymore and unfortunately @Cameron solution didn't work for me either (I tried to debug it with no luck)

Here is what works for me:

#!/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
忆梦 2024-10-26 05:31:37

我写了一个脚本来重置内容和内容iOS 模拟器所有版本和设备的设置。它从菜单中获取设备名称和版本号,因此它将包括 Apple 为其发布模拟器的任何新设备或 iOS 版本。

手动运行或在构建脚本中使用很容易。我建议在构建之前将其添加为预操作运行脚本。

它很大程度上基于 Stian 的脚本,但不会因新的 iOS 版本而变得过时,并且消除了对话框(更适合自动化构建脚本和从命令行工作)。

https://github.com/michaelpatzer/ResetAllSimulators

I wrote a script that will reset the contents & settings of all versions and devices for the iOS Simulator. It grabs the device names and version numbers from the menu, so it will include any new devices or iOS versions that Apple releases simulators for.

It's easy to run manually or use in a build-script. I would suggest adding it as a Pre-Action Run Script before the build.

It's based heavily on Stian's script above, but doesn't become stale with new iOS versions, and eliminates the dialog box (better for automation build scripts and working from the command-line).

https://github.com/michaelpatzer/ResetAllSimulators

丘比特射中我 2024-10-26 05:31:37

我发现这个非常有用的工具称为“SimulatorManager”:
http://tue-savvy.github.io
它将通过菜单栏小部件(不确定这是否是它的名称)来重置所有模拟器,但最重要的是,它将使您可以快速访问所有应用程序数据。我真的不能再没有它了。
传播这个词!

I have found this very helpful tool called "SimulatorManager":
http://tue-savvy.github.io
It will reset all you simulators by means of a menu bar widget (not sure if that's what its called) but on top of that it will give you quick access to all your application data. I really can't live without it anymore.
Spread the word!

吾性傲以野 2024-10-26 05:31:37

我想在卡梅伦·布朗的回答中添加一些内容。为了确保重置正确的版本(例如,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

I want to add something to Cameron Brown's answer. To make sure the correct version is resetted (e.g, iPad, version 6.1), I start the iOS Simulator 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 can be e.g "OS=7.0,name=iPad".

For that to work correctly, I adapted the reset_simulator.applescript a bit and removed the activation part:

tell application "iPhone Simulator"
    activate
end tell
顾铮苏瑾 2024-10-26 05:31:37

作为使用 xcrun 命令的额外好处,您可以在列出后启动设备,

xcrun simctl list

一旦显示列表,运行:

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

As an added bonus to using the xcrun commands you can launch a device after you listed with

xcrun simctl list

Once you have the list displayed run:

xcrun instruments -w "iPhone 5s (8.1 Simulator) [31E5EF01-084B-471B-8AC6-C1EA3167DA9E]"
故人爱我别走 2024-10-26 05:31:37

我们使用以下 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 = '

它假设您的应用程序的包标识符设置为环境变量,例如,

export BUNDLE_IDENTIFIER=com.example.app_name

您可能希望以其他方式传递包标识符。

+ 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()

它假设您的应用程序的包标识符设置为环境变量,例如,

您可能希望以其他方式传递包标识符。

We use the following python script to reset the simulator on our build server.

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

It assumse your app's bundle identifier is set as an environment variable, e.g.

export BUNDLE_IDENTIFIER=com.example.app_name

maybe you'd want to pass the bundle identifier in another way.

+ 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()

It assumse your app's bundle identifier is set as an environment variable, e.g.

maybe you'd want to pass the bundle identifier in another way.

℉服软 2024-10-26 05:31:37

基于上面的大多数答案,我使用 Keyboard Maestro 并制作了一个小宏来重置当前运行的模拟器并重新启动它。
重置并重新启动后,它将焦点返回到 Xcode,因此我可以立即再次点击 Command+R 来重新运行应用程序,我觉得这非常方便。

输入图片这里的描述

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

Building on most of the answers above, I am using Keyboard Maestro and made a little Macro to reset the currently running Simulator and restarting it.
It turns the focus back to Xcode after resetting and restarting, so I can hit Command+R again right away to re-run the app, which I find very convenient.

enter image description here

The content of the ruby script is:

#!/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
〃温暖了心ぐ 2024-10-26 05:31:37

这是一个用于重置目标模拟器的 Rakefile 任务。这适用于 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

Here's a Rakefile task to reset a targeted simulator. This works with Xcode 7 since the Xcode 7 command line tools broke the xcrun simctl uninstall command. I have a little custom runC method since I like to see the actual terminal command as well as its output.

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
李不 2024-10-26 05:31:37

只需一个线性命令:循环遍历设备文件夹中的每个模拟器并删除。

for id in $(xcrun simctl list devices | grep -E '([0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12})' -o); do xcrun simctl erase $id; done

将其粘贴到终端中,然后按返回

分解:

  • xcrun simctl list devices:列出所有可用的模拟器。
  • grep -E '([0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[ 0-9A-F]{12})' -o:匹配模拟器的UUID。
  • for id in $(...):循环遍历找到的每个 UUID。
  • xcrun simctl擦除$id:擦除当前UUID对应的模拟器。

Just one liner command : Loop through each simulator in Devices folder and erase.

for id in $(xcrun simctl list devices | grep -E '([0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12})' -o); do xcrun simctl erase $id; done

paste it in Terminal and hit return.

Breaking it down:

  • xcrun simctl list devices: Lists all available simulators.
  • grep -E '([0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12})' -o: Matches the UUIDs of simulators.
  • for id in $(...): Loops through each UUID found.
  • xcrun simctl erase $id: Erases the simulator corresponding to the current UUID.
夏末的微笑 2024-10-26 05:31:37

目标名称和模拟器应用程序名称似乎已更改为 xCode6 / iOS8。
这是 Cameron Brown 的 osascript for 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

target names and Simulator app name seem to have changed a bit to xCode6 / iOS8.
Here is un updated version of Cameron Brown's osascript for 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
沙与沫 2024-10-26 05:31:37

我介绍

最终的 iOS 模拟器重置脚本(链接)

在此处输入图像描述

基于 Oded Regev 的代码(基于 Jacob Rus 的精美“menu_click”代码)

I present,

The Definitive iOS Simulator Reset Script (link)

enter image description here

Based on Oded Regev's code (which was based on Jacob Rus's fine "menu_click" code)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文