我今天升级到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。
答案 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,不存在
我通过以下方式解决了此问题:
现在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)
...