Cordova:启动特定的iOS模拟器映像


120

我正在使用Cordova开发跨平台移动应用程序,在开发阶段主要关注iOS。

对于我的开发过程,如果可以直接从命令行启动我的Cordova应用程序并将其加载到指定的模拟器中,那将是理想的选择。我可以通过从项目根目录运行以下命令来执行此操作:

$cordova run --debug --emulator iOS

这可以正常工作,并导致iOS模拟器在带有iOS 7.0.3的模拟iPhone 4 Retina中运行我的应用程序

除了这种模拟设备之外,我还想在(例如)iPad上进行测试。我已经安装了这些仿真图像,并且可以在Xcode中手动在其中启动我的应用程序。另外,该命令list-emulator-images(位于中project_dir/platforms/ios/cordova/lib)提供了以下输出:

"iPhone Retina (3.5-inch)"
"iPhone Retina (4-inch)"
"iPhone Retina (4-inch 64-bit)"
"iPhone"
"iPad"
"iPad Retina"

但是,问题是:除了默认值(似乎是iPhone Retina (4-inch)仿真映像)以外,我似乎无法弄清楚如何以其他方式启动仿真器。的相关输出cordova help提供以下信息:

run [--debug|--release]
    [--device|--emulator|--target=FOO]
    [PLATFORM] ............................ deploys app on specified platform devices / emulators

我已经尝试过以下操作:

cordova run --debug --emulator=iPad iOS

及其许多变体,但没有运气。每次在同一模拟器中启动。

命令行工具的文档在这方面没有提供任何信息,并且广泛的Google搜索也未能提供任何信息。我缺少一些琐碎的东西吗?还是我想做些奇怪的事情?我真的希望这里有人对此有经验,并能提供一些答案。

首先十分感谢!

编辑:忘记明确提及;我正在Mac上进行所有操作。如前所述,在Xcode中的不同仿真器/模拟器中运行应用程序可以正常工作。

Answers:


335

要找出可用的模拟器图像,可以使用列出它们

$ cordova emulate ios --list
Available iOS Virtual Devices:
    iPhone-4s, 9.3
    iPhone-5, 9.3
    iPhone-5s, 9.3
    iPhone-6, 9.3
    iPhone-6-Plus, 9.3
    iPhone-6s, 9.3
    iPhone-6s-Plus, 9.3
    iPad-2, 9.3
    iPad-Retina, 9.3
    iPad-Air, 9.3
    iPad-Air-2, 9.3
    iPad-Pro, 9.3

然后在--target参数中使用模拟器名称之一:

cordova emulate ios --target="iPhone-4s, 9.3"
cordova emulate ios --target="iPad-Air-2, 9.3"
cordova emulate ios --target="iPhone-6s, 9.3"
cordova emulate ios --target="iPhone-6-Plus, 9.3"

重要提示在启动其他目标模拟器之前退出模拟器(在菜单栏上选择Simulator->Quit

考虑到您可能需要通过菜单退出iOS模拟器才能从3.5英寸切换到4英寸iPhone。

动态列表位于 platforms/ios/cordova/lib/list-emulator-images


3
谢谢,这有所帮助。您的来源是什么?只是想知道我自己该如何解决...这个问题的答案也有很大帮助:stackoverflow.com/questions/13877840 / ... 显然,“ cordova emulate”是包装的ios-sim,您也可以谈谈直接。这就是我最终要做的,因此我可以直接从所选的IDE中构建和启动代码。
EggMeister

我只是运行了此命令,即使安装了Xcode 6,也可以确认没有列出4.7和5.5英寸模拟器:-(
Ben Clayton

嗨,我尝试了这个命令“ ./platforms/ios/cordova/lib/list-emulator-images”,但我没有看到所有选项,没有iPhone 6,没有iPhone 6-Plus,没有iPad-Air问题?谢谢
user2120121 2015年

10
我真的不知道为什么,但是对我来说"Error: Cannot read property 'name' of undefined",在用引号指定目标时,Cordova CLI会抛出异常,我只能通过像这样运行它来使其工作cordova run ios --target=iPhone-6。希望这可以节省别人的麻烦!
Gifford N.

1
我得到的问题与Gifford N相同。我正在使用cordova 7.0.0
Terry Wilkinson

18

就像csantanapr一样,您可以使用:

cordova emulate ios --target="iPhone-4s"

但是,在这种情况下,cordova(或PhoneGap或其他)项目将在iOS版本7.0.3的iPhone 4s模拟器上启动。

是否要在同一模拟器上但与其他版本的iOS(7.1或8.0,如果系统中存在该版本)一起启动项目?

当然,您可以像说cobberboy一样

启动特定的模拟器并直接使用ios-sim选择您的ios版本。

但是您可以改进--targetcordova run命令的选项。

首先,您必须确保系统上可用的目标iOS版本。

为此,请使用cobberboy的答案:

$ ios-sim showdevicetypes

然后,您需要打开文件your_project_dir/platforms/ios/cordova/lib/run.js并找到如下代码行:

// validate target device for ios-sim
// Valid values for "--target" (case sensitive):
var validTargets = ['iPhone-4s', 'iPhone-5', 'iPhone-5s', 'iPhone-6-Plus', 'iPhone-6',
    'iPad-2', 'iPad-Retina', 'iPad-Air', 'Resizable-iPhone', 'Resizable-iPad'];

要使用iPhone-4s, 7.1(或其他一些方法),只需将其添加到array即可validTargets

var validTargets = ['iPhone-4s', 'iPhone-4s, 7.1', 'iPhone-5', 'iPhone-5s', 'iPhone-6-Plus', 'iPhone-6',
    'iPad-2', 'iPad-Retina', 'iPad-Air', 'Resizable-iPhone', 'Resizable-iPad'];

而在

cordova emulate ios --target="iPhone-4s, 7.1"

--target="iPhone-4s, 7.1"将有效。

而功能deployToSimrun.js

function deployToSim(appPath, target) {
// Select target device for emulator. Default is 'iPhone-6'
if (!target) {
    target = 'iPhone-6';
    console.log('No target specified for emulator. Deploying to ' + target + ' simulator');
}
var logPath = path.join(cordovaPath, 'console.log');
var simArgs = ['launch', appPath,
    '--devicetypeid', 'com.apple.CoreSimulator.SimDeviceType.' + target,
    // We need to redirect simulator output here to use cordova/log command
    // TODO: Is there any other way to get emulator's output to use in log command?
    '--stderr', logPath, '--stdout', logPath,
    '--exit'];
return spawn('ios-sim', simArgs);
}

转换iPhone-4s, 7.1到有效的论据com.apple.CoreSimulator.SimDeviceType.iPhone-4s, 7.1进行ios-sim


这工作得很好,并允许我ionic run ios --target='iPhone-6, 9.0'在使用Ionic Framework时使用。
jorisw

好发现find。我只是注释掉了可以验证的块,validTargets并且能够指定完整的平台,例如:"--target="iPhone-6, 8.4""。如果Cordova将目标验证委托给会非常好的ios-sim
凯尔·福克斯

这对我不起作用。我在run.js中输入了垃圾,它被忽略了。npm会缓存这个东西吗?如何刷新npm的缓存?
Randgalt

您还可以运行“ ionic platform update ios”,并且可以运行最近安装的模拟器
Benjamin Piette,2016年

10

TL; DR

您可以启动特定的模拟器并通过直接使用ios-sim选择ios版本。

export appname="./platforms/ios/build/emulator/Hello World.app"
ios-sim launch "$appname" --devicetypeid "com.apple.CoreSimulator.SimDeviceType.iPad-2, 8.0" --stderr ./platforms/ios/cordova/console.log --stdout ./platforms/ios/cordova/console.log

细节

当我运行这个:

cordova emulate ios --target="iPad"

并查看运行的进程,我看到了这一点(单行):

ios-sim launch ./platforms/ios/build/emulator/HelloWorld.app 
        --stderr ./platforms/ios/cordova/console.log 
        --stdout ./platforms/ios/cordova/console.log 
        --family ipad 
        --exit

进一步研究ios-sim,似乎有一些更具体的选项,尤其是:

--devicetypeid <device type>    The id of the device type that should be simulated (Xcode6+). Use 'showdevicetypes' to list devices.
  e.g "com.apple.CoreSimulator.SimDeviceType.Resizable-iPhone6, 8.0"

因此,我按照建议的方式进行操作,并使用“ showdevicetypes”参数运行ios-sim并得到了以下信息:

$ ios-sim showdevicetypes
com.apple.CoreSimulator.SimDeviceType.iPhone-4s, 7.1
com.apple.CoreSimulator.SimDeviceType.iPhone-5, 7.1
com.apple.CoreSimulator.SimDeviceType.iPhone-5s, 7.1
com.apple.CoreSimulator.SimDeviceType.iPad-2, 7.1
com.apple.CoreSimulator.SimDeviceType.iPad-Retina, 7.1
com.apple.CoreSimulator.SimDeviceType.iPad-Air, 7.1
com.apple.CoreSimulator.SimDeviceType.iPhone-4s, 8.0
com.apple.CoreSimulator.SimDeviceType.iPhone-5, 8.0
com.apple.CoreSimulator.SimDeviceType.iPhone-5s, 8.0
com.apple.CoreSimulator.SimDeviceType.iPhone-6-Plus, 8.0
com.apple.CoreSimulator.SimDeviceType.iPhone-6, 8.0
com.apple.CoreSimulator.SimDeviceType.iPad-2, 8.0
com.apple.CoreSimulator.SimDeviceType.iPad-Retina, 8.0
com.apple.CoreSimulator.SimDeviceType.iPad-Air, 8.0
com.apple.CoreSimulator.SimDeviceType.Resizable-iPhone, 8.0
com.apple.CoreSimulator.SimDeviceType.Resizable-iPad, 8.0

更改默认模拟器如何工作?您绕过了Cordova的位子,而是直接启动,对吗?
mix3d 17-10-10


4

从Xcode 8.3.2开始...

我知道旧的线程,但似乎答案似乎有所变化。该线程之前的帖子中的提示有所帮助,但阅读代码中包含的文档也是如此,<cordova-project>/platforms/ios/cordova/lib/run.js

执行./platforms/ios/cordova/lib/list-emulator-images以列出可用的仿真器映像。进行cordova调用以在所需仿真器中运行时,请勿在末尾包含版本号。

cordova run ios --emulator --target="iPad-Air"

看更多


感谢上帝的评论!最新更新后,它不起作用,也找不到任何信息。刚收到错误消息:“错误:无法读取未定义的属性'名称'”,此错误消息在不包括ios版本后已得到修复。
Marco Rinck

@MarcoRinck检查对答案的评论,可以通过键入以下内容进行快速修复:cordova run ios --target=iPhone-6
Kira Hao

3

由于声誉低下,我无法在上面的答案中发表评论,但可以从以下位置找到目标列表:

start-emulator 

your platform/ios/cordova/lib/

话虽如此,我无法使ipad视网膜模拟器正常工作...





0

@Birja的答案现在可以正常工作,但是他最终使用的运行命令仍然是错误的,因此这里的答案正确:

列出模拟器中可用的所有设备 cordova run ios --list

这将导致如下所示:

Available ios devices:
Available ios virtual devices:
Apple-TV-1080p, tvOS 12.2
Apple-Watch-Series-2-38mm, watchOS 5.2
iPhone-5s, 12.2
iPhone-6, 12.2
iPad-Air-2, 12.2
iPad--5th-generation-, 12.2
iPad-Pro--9-7-inch-, 12.2
iPad-Pro, 12.2
iPad-Pro--12-9-inch---2nd-generation-, 12.2
iPad-Pro--10-5-inch-, 12.2
iPad--6th-generation-, 12.2
iPad-Pro--11-inch-, 12.2
iPad-Pro--12-9-inch---3rd-generation-, 12.2

cordova run ios --target "iPad-Pro, 12.2"使用上面的任何目标。在模拟器中运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.