升级到Xcode 10后找不到iPhone 6模拟器

时间:2018-10-12 16:12:19

标签: xcode react-native

我已更新到Xcode 10,并且由于这样做,我无法在终端使用命令react-native run-ios运行模拟器。我收到此错误:

  

找不到iPhone 6模拟器

当我转到“ Xcode”>“窗口”>“设备和模拟器”时,模拟器就在其中,当我执行xcrun simctl list devices时,我还会看到模拟器列表。

我可以使用react-native run-ios --device和Xcode在手机上运行该应用程序,并且尝试使用多个应用程序,因此它不是该应用程序。

当我转到Xcode>首选项>位置时,在命令行工具中选择了Xcode 10.0(10A255)。

我尝试重新启动计算机,以及删除并重新安装Xcode。

有什么想法吗?

这是我的设置:

  • MacOs High Sierra 10.13.6
  • Xcode版本10.0
  • react-native-cli:2.0.1
  • 本机:0.57.1​​

13 个答案:

答案 0 :(得分:16)

我有类似的问题。 React Native-0.52.3,XCode-10.2 beta 2

function findMatchingSimulator(simulators, simulatorName) {
  if (!simulators.devices) {
    return null;
  }
  const devices = simulators.devices;
  var match;
  for (let version in devices) {
    // Making sure the version of the simulator is an iOS (Removes Apple Watch, etc)
    if (!version.includes('iOS')) {
      continue;
    }
    [...]
  }
}
  • 打开文件:node_modules/react-native/local-cli/runIOS/findMatchingSimulator.js

  • 检查您的设备版本是否正确,例如:第29行console.log(version)

  • 将其与第30行的条件进行比较:if (version.indexOf('iOS') !== 0) {

我有这样的版本列表:

com.apple.CoreSimulator.SimRuntime.watchOS-5-0 -1
com.apple.CoreSimulator.SimRuntime.tvOS-12-1 -1
com.apple.CoreSimulator.SimRuntime.tvOS-12-2 -1

在这种情况下,我的任何版本都不会返回true ...如果您拥有

  • version.indexOf('iOS') !== 0代替!version.includes('iOS'),它为我解决了这个问题。

答案 1 :(得分:10)

该错误已在react-native中修复,因此您可以更新package.json中的软件包:

npm install -g npm-check-updates
ncu -u react-native
npm install

答案 2 :(得分:7)

找到了解决我问题的方法。
您需要进入react-native节点模块中的local-cli/runIOS/findMatchingSimulator.js并将第37行更改为

if (
        simulator.availability !== '(available)' &&
        simulator.isAvailable !== 'YES'
) {`

有关解决方案和React-native github问题的更多信息:
https://github.com/facebook/react-native/commit/1031872
https://github.com/facebook/react-native/issues/21571

答案 3 :(得分:5)

我去了node_modules / react-native / local-cli / runIOS / findMatchingSimulator.js

我已替换:

if (version.indexOf('iOS') !== 0 )

使用

if (!version.includes("iOS" ))

if (simulator.availability !== '(available)')

使用

if (simulator.isAvailable !== true)

答案 4 :(得分:2)

我只想与大家分享我如何解决它,也许它可以帮助某人。

编辑此文件:node_modules / react-native / local-cli / runIOS / findMatchingSimulator.js

更改:

if (!version.startsWith('iOS') && !version.startsWith('tvOS')) {
  continue;
}

收件人:

if (!version.startsWith('com.apple.CoreSimulator.SimRuntime.iOS') 
    && !version.startsWith('com.apple.CoreSimulator.SimRuntime.tvOS')) {
  continue;
}

对我有用。

我使用了 console.log(version)来查看我从变量 version 中得到了什么,并且该值不是预期的。

答案 5 :(得分:0)

一个对我有用的选项

使用

检查Mac中安装的模拟器的列表
myFetch(apiUrl, httpOptions) {
                return axios.get(apiUrl, httpOptions)
            }

在模拟器列表上,选择任何模拟器名称并像这样运行

xcrun simctl list --json devices

希望这对您有用

答案 6 :(得分:0)

转到node_modules / react-native / local-cli / runIOS /,然后在findMatchingSimulator.js中将第30行替换为

if (version.indexOf('com.apple.CoreSimulator.SimRuntime.iOS') !== 0) {

答案 7 :(得分:0)

使用带有本机版本0.55.3 XCode 10 ,我必须做两次 更改才能运行react-native run-ios

node_modules/react-native/local-cli/runIOS/findMatchingSimulator.js内部:

  1. @ martin-leroux描述的更改:

    更改

    // Skipping non-available simulator
    if (simulator.availability !== true) {
    

    // Skipping non-available simulator
    if (
        simulator.availability !== '(available)' &&
        simulator.isAvailable !== 'YES'
    ) {`
    
  2. 更改@samernady提到的行:

    更改

    // Making sure the version of the simulator is an iOS or tvOS (Removes Apple Watch, etc)
    if (!version.startsWith('iOS') && !version.startsWith('tvOS')) {
    

    // Making sure the version of the simulator is an iOS or tvOS (Removes Apple Watch, etc)
    if (!version.includes('iOS') && !version.startsWith('tvOS')) {
    

答案 8 :(得分:0)

可以解决以下问题。

/node_modules/react-native/local-cli/runIOS/findMatchingSimulator.js

替换此行

if (!version.startsWith('iOS') && !version.startsWith('tvOS')) {

使用

if (!version.includes('iOS') && !version.includes('tvOS')) {

答案 9 :(得分:0)

xcrun simctl list --json devices

自己编辑node_modules/react-native/local-cli/runIOS/findMatchingSimulator.js。 确保findMatchingSimulator函数返回一个match对象,如

{
    udid: simulator.udid,
    name: simulator.name,
    version
}

答案 10 :(得分:0)

我有一个findMatchingSimulator.js的自重构版本。如果将来有人仍然会遇到此问题,并且上述解决方案无法解决您的问题,则只需覆盖... node_modules / react-native / local-cli / runIOS / findMatchingSimulator.js中的findMatchingSimulator-Method 使用以下代码:

   function findMatchingSimulator(simulators, simulatorName) {
      if (!simulators.devices) {
        return null;
      }
      const devices = simulators.devices;
      var match = null;
      for(let version in devices){
          //Skip WatchOS
          if(!version.includes("tvOS") && !version.includes("iOS")){
              continue;
          }

          for(let d in devices[version]){
              var currentDevice = devices[version][d];
              if(!currentDevice.isAvailable){
                  continue;
              }
              if(currentDevice.state === "Booted" ){
                  let booted = currentDevice.state === "Booted";
                  if(currentDevice.name === simulatorName ){
                      return {
                              udid: currentDevice.udid,
                              name: currentDevice.name,
                              booted,
                              version,
                      };
                  }else if(!match){
                      //keep track of first available & bootable device
                      match = {
                         udid: currentDevice.udid,
                         name: currentDevice.name,
                         booted,
                         version,
                      };
                  }
              }
          }
      }
      if (match) {
        return match;
      }
      return null;
    }
   }

编辑:此代码将选择一个已打开的模拟器,并且您仍然可以使用--simulator =“ NAME”参数。

答案 11 :(得分:-1)

我要做的是:

 npm install -g npm

答案 12 :(得分:-1)

从package.json中删除这些行  “反应”:“ XXXXXXXX”,  “ react-native”:“ YYYYYYYYY”,

然后运行 npm install --save react-native react