Xcode6:运行模拟器的两个实例


122

我的iOS应用程序有两个不同的目标。是否可以在模拟器的两个不同实例上同时运行两个应用程序?如果不需要使用Xcode的调试器也可以。到目前为止,我发现的唯一解决方案是安装两个版本的XCode,但这是一个非常笨重/占用空间的解决方案。



3
这是一个重复的问题,但是@ i40west的答案实际上更好。
vintagexav 2014年

Answers:


224

您可以从命令行运行iOS模拟器的两个实例。它们不会附加到Xcode调试中-实际上,只有在完全不运行Xcode的情况下,它似乎才起作用。

首先,您需要从Xcode在模拟器中运行该应用程序,以便将其安装在模拟器中。确保您运行的模拟器与最终使用的模拟器相同

现在打开终端窗口,并执行此操作。

cd /Applications/Xcode.app/Contents/Developer/Applications
open -n iOS\ Simulator.app
open -n iOS\ Simulator.app

Xcode 7更新:使用Xcode 7,模拟器的应用程序名称已更改,因此是这样的:

cd /Applications/Xcode.app/Contents/Developer/Applications
open -n Simulator.app
open -n Simulator.app

当第二个启动时,您将收到错误警报。只需将其关闭,然后从“硬件”»“设备”中选择其他设备即可。现在,您有两个正在运行的模拟器,并且已经从Xcode安装在其中的所有应用程序都将存在。


7
嗨,谢谢,这是个好主意,但不幸的是,它为第二个模拟器显示了“无法以当前状态启动设备:已启动”。我看到了两个模拟器,但是即使取消了警报,第二个模拟器的屏幕仍保持黑色。
vintagexav 2014年

6
也许是因为我的XCode当前正在运行。也许您应该将该说明添加到您的答案中:)此外,它仅在使用两种不同的模拟硬件(例如:iPhone 5和iPhone 5s)
时才有效

13
顺便说一句,要使用两种不同的模拟硬件正确运行两个不同的模拟器,并避免出现“无法在当前状态下启动设备:已引导”,则必须在第一个模拟器启动后通过单击模拟器>硬件来更改其版本。更多信息:stackoverflow.com/questions/24023029/...
vintagexav

1
谢谢!我正在使用2个模拟器(一个运行iPhone5,另一个运行iPhone6)测试iCloud同步。请注意,模拟器的同步非常严格,因此出于实际目的,您必须使用Debug-> Trigger iCloud Sync强制进行iCloud同步。因此,在这两个设备在各自的模拟器窗口中运行我的应用程序的情况下,我对device1(iphone5)进行了更改,对device1进行了强制同步,单击了device2(iPhone6)并进行了强制同步。中提琴,您现在可以在模拟器中测试iCloud同步。打开模拟器的控制台很有用,因为您可以在发生后台同步活动时查看它。
ObjectiveTC

3
很高兴找到您的答案,谢谢!只是想提一下,显然您可以同时运行XCode,但需注意以下几点:1.第二个模拟器必须具有与第一个模拟器不同的配置(在弹出窗口抱怨之后,您需要更改模拟器的设备版本从硬件菜单)。2.每当您停止并从XCode重新启动第一个模拟器时,第二个模拟器也将停止并重新启动(并且您将需要再次更改其设备版本)
Alex

26

Xcode 9+

Xcode 9现在支持启动多个模拟器。这是在WWDC 2017中宣布的。

只需在Xcode,Cmd + R中更改模拟器,您将看到一个弹出的新模拟器。

在此处输入图片说明


9

成功测试了i40west的解决方案可以手动启动模拟器,但是在当今时代,iOS模拟器从命令行运行并发测试时需要不同的Xcode版本和不同的设备类型(略有不同的用例,但与顶部的原始问题相关),这似乎很愚蠢。 )。

请参阅此处的Apple文章,该文章与命令行构建和测试最相关:https : //developer.apple.com/library/ios/technotes/tn2339/_index.html

如果在运行带有正确的'-destination'值的'xcodebuild test'命令并将正确的'-destination'值与'xcrun'输出的UUID值匹配的模拟器运行之前,将正确的--args传递给'iOS Simulator.app',则多个并发测试对我们来说效果很好simctl list”,并设置DEVELOPER_DIR环境变量以选择不同的XCode版本二进制文件(即Xcode 6.1和6.4的基本路径)

需要在同一台物理机器和同一台iOS模拟器设备(例如iPad或iPhone)上以及同一Xcode版本上进行并发单元测试的原因主要是为了支持任何iOS项目的CI(连续集成),从而同一构建系统可以运行多个构建中的多个签入功能分支时,Bamboo代理会一次自动扫描和构建应用程序(我们公司拥有30个左右的应用程序),而无需等待其他正在运行的内部版本完成-Bamboo支持这种类型的自动构建发现的功能分支(如果启用)。

至于运行多个并发测试时发生的情况,我们在不同的Terminal.app窗口中连续两次运行多个“ xcodebuild test”命令,结果只有一个模拟器窗口出现,并且在最简单的测试中测试失败。

当我们复杂化测试启动的进入条件,每个sim卡和测试启动的不同Xcode版本时,当按照手册页使用DEVELOPER_DIR时(xcodebuild测试),我们指定了一个在两个单独的窗口中打开的不同设备,但是结果是在第一个窗口中运行的所有测试都会被第二个iOS模拟器窗口中断。

似乎有一个共同的共享资源正在被阻碍,不确定它的意图或只是一个新功能,需要几天多的时间认真思考如何更好地实现并发测试运行而不会带来不利影响。

我们不希望使用VM来解决模拟限制,因为我们的经验以及其他方面的经验通常是,iOS在具有大量小文件的VM上构建性能比物理硬件要慢。由于VMware软件和Apple硬件和/或固件的结合出现I / O问题,因此VM通常会大大降低构建速度。抱歉,实际上贫民窟,但对我们而言,VM的性能不佳–实际上,贫民窟站点已向我们提供了有关如何在Mac Mini上为我们的构建场安装ESXi 5.5的说明。

我们已经遇到了Mac Mini上的ESXi 5.5速度比裸机慢2倍甚至更多的构建性能问题(即10分钟的裸机构建在VM上需要20倍)。有关原因,请参阅下面的摘要文章。

https://corner.squareup.com/2015/07/ios-build-infrastructure.html

xcodebuild单元测试一次限制使用1个sim设备会严重降低生产率,并成倍增加Apple和生态系统的成本。

应该仔细考虑苹果公司不支持并发来证明购买更多硬件的合理性所付出的代价,权衡了开发者速度与其他竞争者的竞争风险,这些竞争者在模拟和EULA方面的限制较少。

在同一用户登录(大多数ci系统如何工作)中进行并发测试的优势在于,苹果品牌应用商店应用的质量很高,这反过来又在一定程度上使得人们首先购买了iOS设备。劣质的软件质量使整个品牌变得更加迟钝,iOS模拟器中的并发支持绝对似乎是支持生态系统的明智之举。当前问题的一些必然结果是最近的改进,例如Apple的CI Xcode服务器,Xcode 7中Xcode的自动UI测试功能。

鼓励不必要的开销使人们购买大量的硬件,设置,配置,更不用说支持所有机器,网络和电源等所需的大量人员,最终可能损害苹果的利润,因为不是每个人都像苹果和能够提供MacPro或Mac Mini机架,仅用于支持模拟器上的并发测试。模拟器的全部目的是避免使用硬件,并加快测试速度。

加上EULA对VM的限制,使得Mac Pro上的VM的情况相当薄弱。如果可以运行多个模拟,则这种硬件类型将很有吸引力,但是由于不支持并发单元测试(除了以上两个条件-不同的XCode版本和不同的模拟器设备),我们可能会继续使用Mac Mini来构建基础结构。

Apple的这些SIM和EULA限制不仅使构建流程变慢,而且还增加了不必要的复杂性和成本。对于小型应用程序,它可能并不那么在意,但是随着应用程序的大小和复杂性的增加,构建过程可能会花费一个多小时(我听说Facebook iOS构建过程可能会花费那么长时间)。没有人愿意等待一个小时来了解构建是否通过。

我们知道黑客解决方案,例如在Mac Mini上运行ESXI VM,在大型项目上使用OS X和xcodebuild不能很好地发挥性能,而在现代化的Mac Book Pro或Mac Mini上或在不同的登录帐户上,这些项目的构建要花费10分钟以上在裸机上运行到环境中只是为了能够在相同的Xcode版本和相同的模拟器设备上运行并发测试。

尽管运行良好,但尚无官方支持ESXi。VMware可能不支持Mac Mini硬件却缺少ECC内存的原因之一,尽管支持Mac Pro,因为它确实具有ECC内存,但与iOS相比,与裸机相比,Mac Pro的iOS版本可能存在与Mac Mini相同的问题在相同的硬件和软件配置上进行测试(唯一的变化是VM与运行OS X的裸机)。MacPro目前尚未经过我们的测试。根据我们的经验,VMware Fusion在性能方面也相当慢。

更重要的是,当上述问题加在一起时,开发人员将需要等待更长的时间,除非计算机池足够大以支持变化的小路(每2个开发人员构建一个CI,机器与开发人员的比例非常高)。CI构建机器应该能够比1运行更多的并发构建和更多的并发测试。

关于iOS模拟器的其他观察之一是,即使在7个主要版本之后,它们似乎仍在开发中,并且尚未完成。'xcrun simctl'子命令具有--set选项,该选项可以提供某种灵活性,但不能确定什么可能的值有效,与--noxpc相同。没有人需要猜测适当的值,此外,应该有一个手册页介绍该选项以及示例。这两个有趣的选项有哪些用例?

您可能会说,没有一个应用程序应被设计为具有较大的占用空间,以保证可以运行并发测试,并使用基于XPC的更好的体系结构,因为整体应用程序是问题所在。这很可能是正确的,它不是我们希望的那样实用的解决方案,如果您在同一个基础架构上构建20多个应用程序,问题仍然存在。

使机器配置和过程尽可能通用和可扩展以实现更高的吞吐量,这需要在模拟器(应用程序+核心开发人员)上进行一些工作。这也需要所有Apple模拟器开发人员之间的高度合作,并且模拟器产品所有者需要正确订购产品积压,以便引起这个问题的注意:-)



5

您可以为不同的硬件配置文件运行模拟器的多个实例,并对其进行调试。首先,您需要针对每种硬件类型(iPhone 6,iPad等)从XCode运行您的应用程序,以将其安装到模拟器实例中。然后按照上面的说明运行模拟器实例和您的应用。要对其进行调试,可以从“ XCode-> Debug-> Attach to Process”菜单将调试器附加到正在运行的进程。您可以查看此博客条目的示例:http : //oguzdemir.dualware.com/?p=43


5

这是.sh中的一个小脚本,用于列出计算机上模拟器的UDID并运行它。将以下代码复制到扩展名为“ .sh”的文件中,然后在终端中运行它。

如何:

步骤1.列出带有选项1的设备并复制所需的UDID

步骤2.运行选项2并粘贴UDID,然后按Enter键

请注意:验证包含模拟器的路径是否正确(如果未用路径替换)

#!/bin/sh
PS3='Type the number of your choice (1, 2 or 3) and press Enter: '
options=("List Devices" "Run Simulator" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "List Devices")
            xcrun simctl list devices
            echo "\033[1m\n\nCopy the UDID in parentheses of the device which you want run and launch option 2 (Run Simulator)\033[0m"
            ;;
        "Run Simulator")
            read -p 'Type device UDID which you want launch: ' currentDeviceUDID
            open -n /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app/ --args -CurrentDeviceUDID $currentDeviceUDID
            ;;
        "Quit")
            break
            ;;
        *) echo invalid option;;
    esac
done

谢谢,


0

这是2020年,xCode 11.4:“文件”->“打开设备”->“ iOs 13.4”->,然后选择未首先运行的iPhone版本,您将获得第二个模拟器运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.