我的iOS应用程序有两个不同的目标。是否可以在模拟器的两个不同实例上同时运行两个应用程序?如果不需要使用Xcode的调试器也可以。到目前为止,我发现的唯一解决方案是安装两个版本的XCode,但这是一个非常笨重/占用空间的解决方案。
我的iOS应用程序有两个不同的目标。是否可以在模拟器的两个不同实例上同时运行两个应用程序?如果不需要使用Xcode的调试器也可以。到目前为止,我发现的唯一解决方案是安装两个版本的XCode,但这是一个非常笨重/占用空间的解决方案。
Answers:
您可以从命令行运行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安装在其中的所有应用程序都将存在。
成功测试了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模拟器开发人员之间的高度合作,并且模拟器产品所有者需要正确订购产品积压,以便引起这个问题的注意:-)
Facebook的FBSimulatorControl提供了一种编程方式来实现此目的。可在https://github.com/facebook/FBSimulatorControl上获得。
该方法testLaunchesMultipleSimulatorsConcurrently
在FBSimulatorControlSimulatorLaunchTests.m有示出如何启动多个模拟器的示例代码。
您可以为不同的硬件配置文件运行模拟器的多个实例,并对其进行调试。首先,您需要针对每种硬件类型(iPhone 6,iPad等)从XCode运行您的应用程序,以将其安装到模拟器实例中。然后按照上面的说明运行模拟器实例和您的应用。要对其进行调试,可以从“ XCode-> Debug-> Attach to Process”菜单将调试器附加到正在运行的进程。您可以查看此博客条目的示例:http : //oguzdemir.dualware.com/?p=43
这是.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
谢谢,