【问题标题】:Cordova: start specific iOS emulator imageCordova:启动特定的 iOS 模拟器图像
【发布时间】: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 中的不同模拟器/模拟器中运行应用程序可以正常工作。

【问题讨论】:

    标签: ios iphone cordova


    【解决方案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中可用

    【讨论】:

    • 谢谢,这有帮助。你的来源是什么?只是想知道我自己是如何解决这个问题的......这个问题的答案也很有帮助:stackoverflow.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 模拟器

            1. cordova 运行 ios --list

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2015-12-09
                  • 2015-07-08
                  • 1970-01-01
                  • 2015-05-31
                  • 2017-02-27
                  • 2016-07-19
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多