是否有一种方法可以使用Xcode/iPhone模拟器模拟多个iPhone?

42

我正在规划一款需要多个用户的游戏,想知道是否有办法启动多个 iPhone 模拟器实例。在菜单和谷歌搜索结果中都没有找到相关信息,但我只是想确认我没有漏看什么。


1
我尝试复制iPhone Simulator.app,但它不允许我这样做。 - ceejayoz
1
Ivsti的回答基本上是正确的,你应该接受它作为答案。http://www.coderebel.com/2010/08/31/iphone_simulator上的脚本运行良好,即允许您每个用户运行一个模拟器。 - twerdster
这是可能的,但通常不值得麻烦。最好使用一个模拟器+1(或更多)设备。通常很容易在craigslist上以超级便宜的价格获得一些(旧/损坏的)设备,并使用它们。 - blueberryfields
1
可以轻松实现,没有任何问题。请参见https://dev59.com/GF8d5IYBdhLWcg3wxkpq#26446438?noredirect=1#comment41535712_26446438 - vintagexav
1
以下是更好的解决方案 https://dev59.com/pHNA5IYBdhLWcg3wmfK5#30607358 应该更新所选答案。 - Just a coder
10个回答

61

只有在多用户的情况下才能实现。

阅读以下内容:http://www.coderebel.com/2010/08/31/iphone_simulator

假设您有两个项目(P1,P2)想要同时进行调试,请按照以下步骤操作。

设置步骤:

  1. 在您的 Mac 上创建一个新用户(U2)。
  2. 将 P2 的读/写权限分配给该用户,特别是其构建文件夹。
  3. 从上述网站下载启动器应用程序并将其复制到“应用程序”中。

调试步骤:

  1. 关闭正在运行的 Xcode 和模拟器。
  2. 使用 U1 启动 iPhone Launcher.app。
  3. 使用 U1 启动 Xcode,加载 P1 并开始调试。
  4. 使用 U2 启动 iPhone Launcher.app。
  5. 使用 U2 启动 Xcode,加载 P2 并开始调试。

不幸的是,需要不时更改用户很麻烦,但目前我还没有找到更好的解决方案。希望这可以帮助到您。


1
你的链接已经失效了,这是给你的信息。 - ahruss

19

有一种简单的方法可以做到这一点,而不需要使用多个用户。请注意,您将无法连接到调试器。请注意,下面的说明适用于XCode 6+。您可以跳过此说明,直接向下滚动到下面的结束部分。

这里的答案中,我们可以看到您可以通过命令行启动任何模拟器:

open -a "iOS Simulator" --args -CurrentDeviceUDID

您可以通过在控制台上运行xcrun simctl list命令来查找设备 ID(以及您所有的模拟器)。它会生成像这样的列表。设备 ID 是大括号内的代码:

== Runtimes ==
iOS 8.3 (8.3 - 12F69) (com.apple.CoreSimulator.SimRuntime.iOS-8-3)
== Devices ==
-- iOS 8.3 --
    iPhone 4s (99Z06AC6-A2D6-46E7-B4F7-BA4F5F3F39C8) (Shutdown)
    iPhone 5 (K262AF11-ADD2-4FDA-ACBA-8C80DD9D4AA1) (Shutdown)
    iPhone 5s (337KDC51-0A4B-47DB-8966-83562FD92C93) (Shutdown)
    iPhone 6 Plus (9GK714E2-F713-4F98-A96E-C72ACD6571A8) (Shutdown)
-- iOS 8.2 --
    etc continued....
因此,要使用以上示例运行模拟器,请在控制台上运行以下命令:

因此,要使用上述示例运行模拟器,请在控制台上运行以下命令:

open -n /Applications/Xcode.app/Contents/Developer/Applications/iOS\ Simulator.app/ --args -CurrentDeviceUDID '99Z06AC6-A2D6-46E7-B4F7-BA4F5F3F39C8'

我们使用-n标志代替-a标志,因为-a标志指定用于打开文件的应用程序,而-n标志即使已经运行一个实例,也会打开应用程序的新实例。请使用man open命令了解所有这些内容。

还要确保您的模拟器路径正确。

还有一件事需要注意,如果您像这样运行模拟器,那么您可能只有有限数量的模拟器。由于它是有限的,您可能希望在不中断已经在屏幕上的模拟器的情况下启动它。我们可以从这里获得答案,在那里他向您展示如何创建一个新模拟器并删除一个模拟器。

总之,这是启动它们的方法:

A) 首先,在启动模拟器之前创建一个模拟器。

用法:simctl create "name" "device type id" "runtime id"

xcrun simctl create "mynewsimulator" "iPhone 6" "com.apple.CoreSimulator.SimRuntime.iOS-8-3"
你可以从我上面运行的命令xcrun simctl list中找到运行时ID。在运行上述命令后,设备ID将被打印在控制台屏幕上。请记下它作为启动下面显示的模拟器的最后一个参数。假设此ID为99Z06AC6-A2D6-46E7-B4F7-BA4F5F3F39C8
B)启动它
open -n /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app/ --args -CurrentDeviceUDID '99Z06AC6-A2D6-46E7-B4F7-BA4F5F3F39C8'

C)在模拟器使用完毕后,将其删除。

xcrun simctl delete 99Z06AC6-A2D6-46E7-B4F7-BA4F5F3F39C8

所有这些内容都可以放在一个.sh文件中以便于运行。 如果您决定将所有这些内容放入sh文件中,请注意在每个命令后加上waitsleep命令。

[编辑2017] 我看到XCode 9现在将支持多个模拟器。等待看看它将如何工作。


这个可以工作,除了你必须退出模拟器。 - Gurubaran
嗯,还有关闭模拟器的代码。但是我已经发布了这个解决方案有一段时间了,现在找不到它了。 - Just a coder

11
据我所知,模拟器不能运行多个实例,而且在进行实际设备测试时,调试器也不能运行多个实例。
这意味着为了创建多设备应用程序,您需要将单个Mac分配给单个iPhone/touch设备(或模拟器实例),每个设备都运行您的应用程序。
我已经开始研究是否可以将VMWare或Parallels引入其中,但是没有太多可以在不修改操作系统的情况下完成的工作。
我建议向http://bugreporter.apple.com提交功能请求。

那么,VMWare或其他类似产品能够实现这一点吗? - Just a coder
15
您可以运行尽可能多的设备,但问题只在于模拟器。 - João Nunes
3
可能是在此问题被回答后的某个XCode版本中添加了此功能,但仅供其他人参考:XCode 5 允许您运行多个调试器实例。 - Cutetare

1

如果你有一份Mac OS X服务器许可证,另一个选择(虽然可能过度)是虚拟化一个Mac OS X服务器实例,并在虚拟机中运行第二个模拟器。


0

我通过结合Ivsty的回答和这个,成功让它工作起来了。

基本上,你需要创建两个用户(A和B),在每个用户下运行模拟器,然后在用户B上运行VNC服务器,接着从用户A连接到屏幕B,而无需切换用户即可访问。


0

嗯...我认为你在这里没有遗漏任何东西。据我所知,SDK中没有技术能够模拟多个设备--虽然这将是一个有用的功能。我认为你唯一的选择是获得第二个iPhone OS设备,或者找一个也有iPhone OS设备的朋友让你用于测试。


0

按照以下步骤测试您的应用程序。

首先,您需要完成一个整个过程的任务: 进入项目 -> 编辑项目设置 -> 选中选项 - 并行构建独立目标。

  1. 调试代码,将在模拟器中创建您的应用程序。例如,您的应用程序名称为 - Instance
  2. 关闭模拟器
  3. 进入项目 -> 新建目标 -> Instance2 在Instance2.info.plist文件中添加“Bundle display name:Instance2” 设置可执行文件名称:Instance2 选择Instance2目标 -> 进入项目 -> 设置活动目标 -> Instance2 使用Instance2进行构建

注意:一定要小心操作,否则您将不得不重置模拟器 重置模拟器 -> 运行模拟器 -> iPhone模拟器 -> 重置内容和设置...

现在,您在模拟器中有两个应用程序,可以在所有实例上测试应用程序。

希望这能帮到您 :)


0
在XCode 4中,您可以同时运行多个实例,并且两者都处于调试模式。
我的做法是创建目标的副本并运行原始版本和副本。如果您正在使用输出窗口,则可以切换要查看的输出。

当时,将近三年前,我选择的答案是正确的。我今晚回家后会尝试您的方法,如果成功了就会给您点赞 :) - Abel
没关系,我只是觉得更新一下问题更贴近现状。昨天我实际上不得不这样做,因为我需要同时运行两个模拟。 - erik
1
似乎无法与iOS模拟器一起使用。出现错误“模拟器无法启动,因为它已经在使用中。” - Kekoa

-1

是的,现在这是可能的,而且也相当容易。 你唯一需要的就是xctool,Facebook的构建工具和一个Ruby gem。Ruby gem有助于创建/销毁测试期间所需的模拟器。

您可以在此链接上阅读完整文档:

https://github.com/plu/parallel_ios_tests

我正在使用这种方法,并且同时在4个iOS模拟器上运行我的测试。


-1

支持Xcode 9及以上版本。

(来源:WWDC 2017)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接