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

问题描述 投票:122回答:6

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

ios xcode xcode6 simulator
6个回答
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安装的任何应用程序都会在那里。


25
投票

Xcode 9+

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

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

enter image description here


9
投票

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

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

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

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

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

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

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

我们不希望使用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和生态系统的成本。

应该仔细考虑Apple不支持并发性以证明更多硬件购买合理性的成本,从而衡量开发者对于在sims和EULA方面具有较少限制的竞争对手失去开发人员速度的风险。

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

鼓励不必要的开销让人们购买大量的硬件,设置,配置,更不用说支持所有机器,网络和电源点等所需的众多人员,最终可能会损害Apple的利润,因为不是每个人都像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虽然运行良好,但尚未获得官方支持。 VMware可能不支持Mac Mini硬件的原因之一是缺乏ECC内存,虽然Mac Pro受支持,因为它有ECC内存,但与Mac裸机相比,Mac Mini可能存在同样的问题测试相同的硬件和软件配置(仅更改VM与运行OS X的裸机)。 MacPro目前尚未经过我们的测试。根据我们的经验,VMware Fusion在性能方面也相当缓慢。

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

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

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

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


6
投票

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

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


5
投票

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


4
投票

这里有一个.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

谢谢,

© www.soinside.com 2019 - 2024. All rights reserved.