由于升级到Xcode 10.2,我无法再通过cli运行react-native run-ios

时间:2019-03-26 18:08:33

标签: ios xcode react-native react-native-cli

我今天升级到Xcode 10.2,因为升级后我无法通过cli运行react-native run-ios

react-native run-ios --simulator="iPhone X"

Found Xcode workspace a.xcworkspace

Could not find iPhone X simulator

Error: Could not find iPhone X simulator
    at resolve (/Users/user/Documents/work/a/a-light-ui/node_modules/react-native/local-cli/runIOS/runIOS.js:149:13)
    at new Promise (<anonymous>)
    at runOnSimulator (/Users/user/Documents/work/a/a-light-ui/node_modules/react-native/local-cli/runIOS/runIOS.js:134:10)
    at Object.runIOS [as func] (/Users/user/Documents/work/a/a-light-ui/node_modules/react-native/local-cli/runIOS/runIOS.js:106:12)
    at Promise.resolve.then (/Users/user/Documents/work/a/a-light-ui/node_modules/react-native/local-cli/cliEntry.js:117:22)    

如果我运行xcrun simctl list devices,则所有模拟器都会显示(Shutdown) (unavailable, runtime profile not found)

iPhone X (7AADFA50-7B57-4A40-8434-9A86F345D7ED) (Shutdown) (unavailable, runtime profile not found)

自从将xcode升级到10.2以来,还有其他人遇到过RN问题吗?它仍然可以通过Xcode ..起作用,但这意味着打开Xcode。

5 个答案:

答案 0 :(得分:21)

我这样解决了;

首先,您需要走这条路

  

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

然后;

您需要更改此代码

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

使用

if (!version.startsWith('com.apple.CoreSimulator.SimRuntime.iOS') && !version.startsWith('com.apple.CoreSimulator.SimRuntime.tvOS'))

我希望这会有所帮助,

ref:https://github.com/facebook/react-native/issues/21498#issuecomment-476621627

答案 1 :(得分:0)

此错误自RN v0.58.0起已得到修复,请参见提交here

IIRC这个错误是在Xcode 10.1中引入的

此外,您可以通过简单地将startsWith()替换为includes()来解决此问题。但是每次更新node_modules时这样做都不理想,因此,我建议尽可能更新您的RN版本。

答案 2 :(得分:0)

我想我也将在这里添加解决方案,以希望对某人有所帮助。我刚升级到Mac OS Mojave,也升级到Xcode 10.2。我的整个本地项目都崩溃了,真的很糟糕。因此,我将Xcode降级到10.1。然后,我开始看到这个错误,在运行react-native run-ios之后说:

  

找不到iPhone X模拟器

上述“ hack”通过使用上述更新来编辑findMatchingSimulator.js文件来解决此问题。

然后,react-native run-ios走得更远,下一个错误是:

  

:CFBundleIdentifier,不存在

我通过以下方式解决了此问题:

  1. cd node_modules / react-native / third-party / glog * Tab Enter
  2. ./ configure

现在react-native run-ios works。我希望这对某人有帮助,这对@ss来说是一个痛苦。

答案 3 :(得分:0)

在替换runSimulator.js中的以下代码行后,如果找不到模拟器,模拟器仍然存在。

  

runSimulator.js的路径-> /node_modules/react-native/local-cli/runIOS/findMatchingSimulator.js

SQL> with test (stadat, enddat) as
  2    (select date '2019-06-04', date '2019-06-06' from dual union all
  3     select date '2019-08-11', date '2019-08-13' from dual
  4    )
  5  select t.stadat + column_value - 1 datum
  6  from test t join table(cast(multiset(select level from dual
  7                                       connect by level <= t.enddat - t.stadat + 1
  8                                      ) as sys.odcinumberlist )) on 1 = 1
  9  order by datum;

DATUM
----------
2019-06-04
2019-06-05
2019-06-06
2019-08-11
2019-08-12
2019-08-13

6 rows selected.

SQL>

与此一起

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

在替换后评论以下行

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

和更新到XCode 11后的第二种方法

Xcode 11 xcrun返回true或false,并且对isAvailable属性返回YES或NO。您可以使用以下命令进行检查

if ( simulator.availability !== '(available)' && simulator.isAvailable !== 'YES' ) { continue; }
  

上面的命令将打印所有可用的设备,如下所示

xcrun simctl list devices --json 
  

在以下代码中将YES替换为true

 com.apple.CoreSimulator.SimRuntime.iOS-12-2" : [
  {
    "state" : "Booted",
    "isAvailable" : true,
    "name" : "iPhone X",
    "udid" : "E53748D1-628B-4A99-A419-4D7AE7CE4745"
  }
]

像这样

if ( simulator.availability !== '(available)' && simulator.isAvailable !== 'YES' ) { continue; }

答案 4 :(得分:-1)

您甚至可以做这样的事情

if (version.indexOf('iOS') === -1) ...