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

我有两个不同的目标为我的iOS应用程序。 是否有可能在模拟器的两个不同实例上同时运行这两个应用程序? 如果不需要Xcode的debugging器,那也没关系。 到目前为止,我发现唯一的解决scheme是安装两个版本的XCode,但是这是一个非常沉重/耗费空间的解决scheme。

您可以从命令行运行iOS模拟器的两个实例。 他们不会被附加到Xcodedebugging – 实际上,如果你没有运行Xcode,它似乎只能工作。

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

现在打开一个terminal窗口,然后执行此操作。

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 

当第二个启动时,你会得到一个错误警报。 只需closures它,并从“硬件”»“设备”中select一个不同的设备 。 现在你有两个模拟器在运行,而且你从Xcode安装的任何应用程序都会在那里。

Xcode 9

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

只要去Xcode, Cmd + R中的模拟器,你会看到一个新的模拟器popup。

在这里输入图像说明

成功地testing了i40west的解决scheme,手动启动模拟器,但似乎很愚蠢,在这个时代,一个iOS模拟器需要不同的Xcode版本和不同的设备types时,从命令行运行并发testing(略有不同的用例,但与原来的问题)。

请参阅这里与命令行构build和testing最相关的Apple文章: https : //developer.apple.com/library/ios/technotes/tn2339/_index.html

在运行“xcodebuildtesting”命令之前,如果将正确的–args – 传递给“iOS simulator.app”,并使用正确的“-destination”值匹配simultator启动,并输出“xcrun” simctl list“,并设置DEVELOPER_DIR环境variables来select不同的XCode版本二进制文件(即Xcode 6.1和6.4的基本path)

在同一个物理机器和相同的iOS模拟器设备(如iPad或iPhone)以及相同的Xcode版本上需要同时进行unit testing的原因主要是为了支持任何iOS项目的CI(持续集成),因此同一个构build系统可以运行多个构build多个应用程序(我们公司有30个左右的应用程序)一次在function分支机构办理登机手续时自动扫描和build立竹代理程序,而无需等待其他正在运行的构build完成 – 竹支持这种types的自动构build自动 – 发现function分支如果启用。

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

当我们的testing启动入口标准变得复杂时,每个sim和testing启动使用不同的Xcode版本,当根据手册页(xcodebuildtesting)使用DEVELOPER_DIR时,我们指定了一个在两个独立窗口中打开的不同设备,但结果是第一个窗口中的任何运行testing都会被第二个iOS模拟器窗口中断。

似乎有一个共同的共享资源正在挡道,不知道它是有意的还是只是一个新的function,需要超过几天的认真思考,才能更好地实现并发testing运行,而不会产生不利影响。

我们不希望使用虚拟机来解决模拟限制问题,因为我们的经验和其他一般的经验是,iOS在具有大量小文件的虚拟机上构build性能比物理硬件慢。 由于VMware软件和Apple硬件和/或固件相结合的I / O问题,虚拟机通常会大大降低构build成本。 对于我们来说,很抱歉,但是对我们来说,虚拟机的性能并不好 – 这个虚拟的网站向我们提供了关于如何在Mac Mini上为我们的构build服务器场安装ESXi 5.5的指导。

我们已经体验到与Mac mini上的ESXi 5.5相比,SSD上的性能问题比裸机更慢,即使SSD的性能降低了2倍甚至更多(即10分钟的裸机构build需要20个VM)。 关于为什么,请参阅下面的文章。

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

xcodebuildunit testing一次限制1个sim设备严重降低了生产力,并且成倍增加了苹果和生态系统的成本。

应该仔细考虑苹果公司不支持并发来支付更多硬件购买的成本,这样就可以将开发者速度的风险与其他竞争对手相比,这些竞争对手在模拟和EULA方面的限制较less。

并发testing在同一用户login中的优势(大多数ci系统是如何工作的)是苹果品牌的app store应用的质量,这反过来又是人们首先购买iOS设备的部分原因。 糟糕的软件质量使得整个品牌在iOS模拟器中更加呆板和并发支持,这绝对是支持生态系统的明智之举。 关于这个问题的一个必然结论是最近的改进,比如Xcode 7中的Apple的Xcode服务器,Xcode的自动UItestingfunction。

鼓励人们购买大量的硬件,设置和configuration,更不用说需要支持所有机器,networking和电源点等的大量人员,这将不利于苹果公司的利润,因为不是每个人都像苹果公司能够买得起MacPro或Mac Mini机架只是为了支持模拟器上的并行testing。 模拟器的重点在于避免使用硬件并加速testing。

再加上EULA对虚拟机的限制,使得Mac Pro上的虚拟机非常薄弱。 如果多个模拟器可以运行,这种硬件types将是有吸引力的,但由于不支持并发unit testing(除了上述两个条件 – 不同的XCode版本和不同的模拟器设备),我们可能会坚持Mac Mini的构build基础设施。

Apple的这些模拟和EULA限制不仅使构buildstream水线变慢,而且增加了不必要的复杂性和成本。 对于小应用程序来说,这可能不是那么重要,但随着应用程序规模和复杂程度的增长,构build过程可能需要一个多小时(我听说Facebook的iOS构build可能需要很长时间)。 没有人想等一个小时才能知道构build是否通过。

我们知道像在Mac Minis上运行ESXI虚拟机这样的黑客解决scheme,在OS X和xcodebuild上,对于在现代Mac Book Pro或Mac Mini上构build超过10分钟的大型项目,或者不同的login帐户在裸机上运行环境,只要能够在同一个Xcode版本和相同的模拟器上运行并发testing。

尽pipeESXi运行良好,但并未得到官方的支持。 VMware可能不支持Mac Mini硬件的原因之一就是缺lessECC内存,尽pipe支持Mac Pro,因为它具有ECC内存,但与Mac Mini相比,Mac版本相比裸机,速度更慢在相同的硬件和软件configuration上进行testing(只更改是VM与运行OS X的裸机)。 MacPro目前还没有经过我们的testing。 根据我们的经验,VMware Fusion在性能方面也相当慢。

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

关于iOS模拟器的其他观察之一是,他们似乎是一个正在进行的工作,即使在7个主要版本之后,仍然是完全未完成的。 'xcrun simctl'子命令有一个–set选项,它可以允许某种types的灵活性,但是不知道什么可能的值是有效的,和–noxpc一样。 没有人需要猜测适当的值,此外,应该有一个手册页,涵盖这个选项,也许是例子。 这两个有趣的选项有哪些用例?

你可能会说,没有任何应用程序应该被devise成有足够大的空间来保证并发testing运行,并且使用基于XPC的更好的体系结构,因为单一应用程序是个问题。 这可能是正确的,但并不是我们所希望的那样实用的解决scheme,如果您有20多个应用程序在相同的基础架构上构build,问题依然存在。

为了获得更高的吞吐量,尽可能使机器configuration和stream程尽可能通用和可扩展,需要在模拟器(app + core devs)上进行一些工作。 它还要求所有苹果模拟器开发者和模拟器产品所有者(s)需要高度的协作,以便正确地为产品积压订单,以获得任何关注:-)

来自Facebook的FBSimulatorControl提供了一个编程的方式来做到这一点。 它在https://github.com/facebook/FBSimulatorControl上可用。;

testLaunchesMultipleSimulatorsConcurrently在FBSimulatorControlSimulatorLaunchTests.m中的方法testLaunchesMultipleSimulatorsConcurrently具有说明如何启动多个模拟器的示例代码。

您可以为不同的硬件configuration文件运行模拟器的多个实例并进行debugging。 首先,您需要从XCode为每种硬件types(iPhone 6,iPad等)运行您的应用程序,以将其安装到模拟器实例中。 然后像上面解释的那样运行模拟器实例和你的应用程序。 要debugging它,可以将debugging器附加到正在运行的进程,从“XCode-> Debug-> Attach to Process”菜单。 你可以查看这个博客条目的例子: http : //oguzdemir.dualware.com/?p=43

这里有一个脚本,用来在你的电脑上列出模拟器的UDID并运行它。 将下面的代码复制到扩展名为“.sh”的文件中,并在terminal中运行。

如何:

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

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

小心:确认包含你的模拟器的path是否正确(如果不是你的path)

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

谢谢,