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

Posted

技术标签:

【中文标题】Cordova:启动特定的 iOS 模拟器图像【英文标题】:Cordova: start specific iOS emulator image 【发布时间】:2014-04-14 04:01:30 【问题描述】:

我正在使用 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

还有很多变化,但没有运气。每次它在同一个模拟器中启动。

The documentation 的命令行工具没有提供这方面的任何信息,而且广泛的 Google 搜索也未能找到任何信息。我错过了一些微不足道的事情吗?还是我想做一些奇怪的事情?我真的希望这里有人有这方面的经验,并且可以提供一些答案。

提前非常感谢!

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

【问题讨论】:

【参考方案1】:

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

$ 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 英寸 iPhone 切换到 4 英寸 iPhone。

动态列表在platforms/ios/cordova/lib/list-emulator-images中可用

【讨论】:

谢谢,这有帮助。你的来源是什么?只是想知道我自己是如何解决这个问题的......这个问题的答案也很有帮助:***.com/questions/13877840/… 显然,'cordova emulate' 是 ios-sim 的包装器,您也可以直接与之交谈。这就是我最终要做的,所以我可以直接从我选择的 IDE 构建和启动我的代码。 我刚刚运行了这个命令,可以确认没有列出 4.7 和 5.5 英寸的模拟器,即使安装了 Xcode 6 :-( 嗨,我试过这个命令 "./platforms/ios/cordova/lib/list-emulator-images" 但我没有看到所有选项,没有 iPhone 6,没有 iPhone 6-Plus ,NO iPad-Air会是什么问题?谢谢 我真的不知道为什么,但对我来说,Cordova CLI 在用引号指定目标时会抛出"Error: Cannot read property 'name' of undefined",我只能通过像这样cordova run ios --target=iPhone-6 运行它来让它工作。希望这可以为其他人节省一些麻烦! 我的问题结果与 Gifford N 相同。我使用的是 cordova 7.0.0【参考方案2】:

如csantanapr 你可以使用:

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

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

如果您想在同一个模拟器上启动项目,但使用其他版本的 iOS(7.1 或 8.0,如果您的系统中存在该版本)?

当然,你可以说cobberboy:

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

但是你可以改进cordova run 命令的--target 选项。

首先,您必须确保系统上可用的目标 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(或其他一些),只需将其添加到数组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" 将是有效的。

run.js的函数deployToSim

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 框架时可以使用ionic run ios --target='iPhone-6, 9.0' 好发现?。我只是注释掉了验证validTargets 的块,我能够指定完整的平台,例如:"--target="iPhone-6, 8.4""。如果 Cordova 将目标验证委托给 ios-sim,那就太好了。 这对我不起作用。我在 run.js 中输入了垃圾,但它被忽略了。 npm 缓存这个还是什么?如何刷新 npm 的缓存? 你也可以运行“ionic platform update ios”,你就可以运行最近安装的模拟器了【参考方案3】:

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位并直接启动,对吗?【参考方案4】:

不包括版本号

cordova run ios --target="iPhone-6s"

【讨论】:

【参考方案5】:

从 Xcode 8.3.2 开始...

旧线程,我知道,但似乎答案似乎略有变化。该线程中早期帖子的提示有所帮助,但阅读代码中包含的文档&lt;cordova-project&gt;/platforms/ios/cordova/lib/run.js

执行./platforms/ios/cordova/lib/list-emulator-images 列出可用的模拟器镜像。进行 cordova 调用以在所需的模拟器中运行时,不要在末尾包含版本号。

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

See more

【讨论】:

感谢上帝的评论!最新更新后它不起作用,找不到任何信息。刚刚收到错误消息:“错误:无法读取未定义的属性'名称'”,在不包括 ios 版本后已修复。 @MarcoRinck 检查答案的评论,可以通过键入快速修复:cordova run ios --target=iPhone-6【参考方案6】:

由于我的声誉低,我无法对上述答案发表评论,但目标列表可从以下位置获得:

start-emulator 

your platform/ios/cordova/lib/

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

【讨论】:

【参考方案7】:

设备列表的最快输出: $ instruments -s devices

只使用设备名称而不使用版本。

【讨论】:

【参考方案8】:

现在是:

cordova run ios --list
Available ios devices:
Available ios virtual devices:
Apple-TV-1080p, tvOS 14.3
Apple-TV-4K-4K, tvOS 14.3
Apple-TV-4K-1080p, tvOS 14.3
Apple-Watch-Series-5-40mm, watchOS 7.2
Apple-Watch-Series-5-44mm, watchOS 7.2
Apple-Watch-Series-6-40mm, watchOS 7.2
Apple-Watch-Series-6-44mm, watchOS 7.2
iPhone-8, 14.3
iPhone-8-Plus, 14.3
iPhone-11, 14.3
iPhone-11-Pro, 14.3
iPhone-11-Pro-Max, 14.3
iPhone-SE--2nd-generation-, 14.3
iPhone-12-mini, 14.3
iPhone-12, 14.3
iPhone-12-Pro, 14.3
iPhone-12-Pro-Max, 14.3
iPod-touch--7th-generation-, 14.3
iPad-Pro--9-7-inch-, 14.3
iPad-Pro--11-inch---2nd-generation-, 14.3
iPad-Pro--12-9-inch---4th-generation-, 14.3
iPad--8th-generation-, 14.3
iPad-Air--4th-generation-, 14.3

还有:

cordova run ios --target="iPad-Pro--12-9-inch---4th-generation-, 14.3"

在科尔多瓦 10.0.0 中

【讨论】:

【参考方案9】:

不同的 iphone 和 ipad 模拟器

    cordova 运行 ios --list

    cordova emulate ios --target "iPhone-7"

【讨论】:

【参考方案10】:

根据已为cordova 应用程序生成的构建运行带有Web 请求的iOS 模拟器。 从浏览器执行此请求会在 Mac 上使用 iPhone 8Plus 版本打开模拟器: http://hostname:3000/cordova/build/[xxxx-buildnumber]/emulate?target=iPhone-8-Plus

【讨论】:

【参考方案11】:

@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" 使用上述任意目标。在模拟器中运行。

【讨论】:

以上是关于Cordova:启动特定的 iOS 模拟器图像的主要内容,如果未能解决你的问题,请参考以下文章

iOS 启动图像在 Dev 中有效,但在 App Store 版本中无效

IOS启动画面缩放问题

使用 Meteor 在 iOS 模拟器中定位特定设备

如何让图像在 iOS 模拟器中显示?

使用 Cordova 在 iOS 中显示带有外部源的图像

确定 Cordova 无法在 iOs 9 中启动但在 iOs 10 中正常工作的原因