欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

更新Xcode11之后,启动react-native项目报错

程序员文章站 2022-06-15 20:33:23
...

前言

在更新Xcode11之后,会发现启动以前的react-native项目,会报错。但是之前的代码都已经上线了,应该不会出现逻辑问题的。经过排查问题主要是两个。

问题1:如果使用非Xcode启动RN项目报错

描述

一般情况下,比如我在Webstorm中启动react-native项目时,主要就是两步。

> npm start

> react-native run-ios
info Found Xcode project XXX.xcodeproj
CoreData: annotation:  Failed to load optimized model at path '/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/Frameworks/InstrumentsPackaging.framework/Versions/A/Resources/XRPackageModel.momd/XRPackageModel 9.0.omo'
error Could not find iPhone X simulator. Run CLI with --verbose flag for more details.

以前都启动的好好的,怎么现在就报错了呢?

解决

应该是在Xcode11更新后,模拟器默认只安装了 iphone 8 / iphone 8 Plus / iphone 11 / iphone 11 Pro / iphone 11 Pro Max 这几款手机。

而react-native中,配置文件的地址
/node_modules/@react-native-community/cli-platform-ios/build/commands/runIOS/runIOS.js 的 359 行,可以看到配置的如下:

options: [{
    command: '--simulator [string]',
    description: 'Explicitly set simulator to use. Optionally include iOS version between' + 'parenthesis at the end to match an exact version: "iPhone 6 (10.0)"',
    default: 'iPhone X'
  }

默认的启动项的 iphone x 不存在了。所以启动时需要我们手动的指定Xcode11中存在的模拟器类型即可。

react-native run-ios --simulator="iPhone 8" # 非全面屏
react-native run-ios --simulator="iPhone 11 Pro" # 全面屏

问题2:启动RN项目后进入RN页面报错

描述

在Xcode10版本创建的RN项目,整个程序都是好好地。但是在更新到Xcode11之后运行时,模拟器能起来,但是在进入RN页面时,却提示报错:Unknown argument type ‘_attribute_’ in method -[RCTAppState getCurrentAppState:error:]. Extend RCTConvert to support this type
更新Xcode11之后,启动react-native项目报错

这个问题就是由于Xcode11更新所引起的问题。

解决

打开/node_modules/react-native/React/Base/RCTModuleMethod.mm 文件。

然后修改其中的 RCTParseUnused 方法,为其增加一个新的判断条件 RCTReadString(input, "__attribute__((__unused__))") ||

// 修改后的结果如下
static BOOL RCTParseUnused(const char **input)
{
  return RCTReadString(input, "__unused") ||
         RCTReadString(input, "__attribute__((__unused__))") ||
         RCTReadString(input, "__attribute__((unused))");
}

然后重新启动项目,就可以发现我们能够正常的进入到react-native的项目页面中了。