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

时间:2014-10-19 01:30:53

标签: ios xcode xcode6 simulator

我的iOS应用程序有两个不同的目标。是否可以在两个不同的模拟器实例上同时运行这两个应用程序? 如果它不需要Xcode的调试器的好处,那就没问题了。 到目前为止,我找到的唯一解决方案是安装两个版本的XCode,但这是一个非常繁重/耗费空间的解决方案。

7 个答案:

答案 0 :(得分: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安装的任何应用程序都会在那里。

答案 1 :(得分:25)

Xcode 9 +

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

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

enter image description here

答案 2 :(得分:9)

成功测试了i40west的解决方案是否能够手动启动模拟器,但在当今时代,iOS模拟器在从命令行运行并发测试时需要不同的Xcode版本和不同的设备类型(略有不同的用例)但与上面的原始问题有关)。

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

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

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

至于运行多个并发测试时会发生什么,我们运行多个xcodebuild测试'在不同的Terminal.app窗口中连续两次命令,结果只显示一个模拟器窗口,并且在最简单的测试中测试失败。

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

似乎有一个共同的共享资源正在阻碍,不确定它是打算还是只是一个新功能需要超过几天的认真考虑如何更好地实现并发测试运行wihout不利影响。

我们不想使用VM来解决sim限制问题,因为我们的经验和其他一般情况是iOS在具有大量小文件的VM上构建性能比物理硬件慢。由于VMware软件和Apple硬件和/或固件的组合中的I / O问题,VM通常会大幅减慢构建速度。很抱歉,但是对于我们来说,虚拟机不能很好地运行 - 在我们的构建农场中,虚拟机网站为我们提供了有关如何在Mac Mini上安装ESXi 5.5的说明。

我们遇到过构建性能问题,Mac Mini上的ESXi 5.5比裸机慢,即使SSD使用2倍或更多(即10分钟裸机构建需要20个VM)。请参阅下面的平方文章了解原因。

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

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

苹果公司不支持并发性以支持更多硬件购买的成本应该仔细考虑,从而衡量开发者对于在sims和EULA方面受到较少限制的竞争对手失去开发者速度的风险。

同一用户登录中的并发测试(大多数ci系统如何工作)的优势在于Apple品牌应用程序商店应用程序的质量,这反过来又是人们首先购买iOS设备的部分原因。软件质量差使整个品牌更加笨拙,iOS模拟器中的并发支持看起来似乎是支持生态系统的明智之举。手头问题的一些推论是最近的改进,例如Apple的Xcode Xcode服务器,Xcode在Xcode 7中的自动UI测试功能。

鼓励不必要的开销让人们购买大量硬件,设置,配置,更不用说支持所有机器,网络和电源点等所需的众多人员,最终可能会损害Apple的利润因为并不是每个人都像苹果公司那样能够买得起MacPro或Mac Mini的机架只是为了支持模拟器上的并发测试。模拟器的重点是避免使用硬件并加快测试速度。

另外,针对虚拟机的EULA限制使得Mac Pro上的虚拟机的情况相当薄弱。如果可以运行多个SIM卡,这种硬件类型会很有吸引力,但由于并不支持并发单元测试(除了上述两个条件 - 不同的XCode版本和不同的模拟器设备),我们可能会坚持使用Mac Mini进行构建基础设施。

Apple的这些SIM和EULA限制不仅使构建管道变得更慢,而且还增加了不必要的复杂性和成本。它对于小型应用程序可能并不那么令人担忧,但随着应用程序的大小和复杂性的增加,构建可能需要一个多小时(我听说Facebook iOS版本可能需要很长时间)。没有人想等一个小时才知道是否通过了构建。

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

虽然ESXi运行良好,但官方不支持ESXi。 VMware可能不支持Mac Mini硬件的原因之一是缺少ECC内存,虽然Mac Pro受支持,因为它有ECC内存,但它可能与Mac Mini在iOS版本减速方面存在同样的问题与相同硬件和软件配置上的裸机测试相比(仅更改VM与运行OS X的裸机)。 MacPro目前尚未经过我们的测试。根据我们的经验,VMware Fusion在性能方面也相当缓慢。

更重要的是,当上述问题复杂化时,开发人员需要等待更长时间,除非机器池足够大以支持更改的管道(每2个开发人员一个CI构建,机器与开发人员的比例非常高)。 CI构建机器应该能够运行更多并发构建和更多并发测试而不是1。

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

你可能会说,没有任何应用程序可以设计为具有足够大的空间来保证并行测试运行,并且使用基于XPC的更好的架构,因为单片应用程序是个问题。这可能是正确的,它不是我们希望的实用解决方案,如果你有20多个应用程序在同一个基础架构上构建,问题依然存在。

使机器配置和流程尽可能通用且可扩展以获得更高的吞吐量,这将需要在模拟器(app + core devs)上进行一些工作。它还需要所有Apple模拟器开发人员和模拟器产品所有者之间的高度协作,以便正确地订购产品积压以解决此问题: - )

答案 3 :(得分:6)

来自Facebook的FBSimulatorControl提供了一种编程方式来实现这一目标。它可以在https://github.com/facebook/FBSimulatorControl获得。

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

答案 4 :(得分:5)

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

答案 5 :(得分:4)

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

如何:

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

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

注意:验证包含模拟器的路径是否正常(如果没有替换路径)

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

谢谢,

答案 6 :(得分:0)

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