转载专题iOS开发

低版本ReactNative在XCode11启动时异常问题的解决

2019-09-29  本文已影响0人  爱吃萝卜的小蘑菇

在升级Xcode11之后,使用低于0.59.9版本的React Native,启动时必将出现问题:

模拟器运行报红如下:
Unknown argument type"attribute_inmethod-irctappstate
getcurrentappstate: error: Extend
Rctconvert to support this type.
[Rctmodulemethod processmethodsignature]
Rctmodulemethod, mm: 376
-[Rctmodulemethod invokewithbridge: module: arguments: ]

RN错误信息

Xcode运行错误如下:

2019-09-25 15:16:47.784 [error][tid:main][RCTModuleMethod.mm:376] Unknown argument type '__attribute__' in method -[RCTAppState getCurrentAppState:error:]. Extend RCTConvert to support this type.
2019-09-25 15:16:47.784408+0800 example[68797:2090899] Unknown argument type '__attribute__' in method -[RCTAppState getCurrentAppState:error:]. Extend RCTConvert to support this type.

原因是Xcode11(iOS13)中对未使用的接口选择器的参数unused字符串属性进行了更改成了__unused__,导致ReactNative动态收集接口时不能把声明的接口进行导入,运行时无法查找到该接口导致的错误。

解决方案一:

找到文件RCTModuleMethod.mm,路径:node_modules/react-native/React/Base/RCTModuleMethod.mm
(原文文件名称为RCTModuleMethod.mm.mm,但是我的项目中文件名为RCTModuleMethod.m);
RCTParseUnused接口中新增新的解析字段,新增RCTReadString(input, "__attribute__((__unused__))")代码,如下:

static BOOL RCTParseUnused(const char **input)
{
  return RCTReadString(input, "__unused") ||
         RCTReadString(input, "__attribute__((__unused__))") ||     //lzj fixed
         RCTReadString(input, "__attribute__((unused))");
}

重新运行即已正常。

解决方案二:

Xcode->TARGETS->Build Phases->添加Run Script脚本代码:

REACT_NATIVE_DIR=${SRCROOT}/node_modules/react-native
PATCH_FILE_PATH=${SRCROOT}/react-native-patch
echo "REACT_NATIVE_DIR:$REACT_NATIVE_DIR"
echo "PATCH_FILE_PATH:$PATCH_FILE_PATH"
 
set -x
patch  -p0 -N --dry-run --silent -f $REACT_NATIVE_DIR/React/Base/RCTModuleMethod.mm < $PATCH_FILE_PATH/rn_modify_module_method.patch 1>/dev/null
if [ $? -eq 0 ]; then
patch -p0 -f $REACT_NATIVE_DIR/React/Base/RCTModuleMethod.mm < $PATCH_FILE_PATH/rn_modify_module_method.patch
fi

React Native源码库同级目录下新建react-native-patch文件夹,下面再新建rn_modify_module_method.patch文件,添加以下内容:

--- a/node_modules/react-native/React/Base/RCTModuleMethod.mm
+++ b/node_modules/react-native/React/Base/RCTModuleMethod.mm
@@ -90,6 +90,7 @@
 
 static BOOL RCTParseUnused(const char **input)
 {
   return RCTReadString(input, "__unused") ||
+         RCTReadString(input, "__attribute__((__unused__))") ||     //lzj fixed
          RCTReadString(input, "__attribute__((unused))");
 }

目录如图:


目录

编译一下工程,代码即已被修改。

React Native官方Issues链接:https://github.com/facebook/react-native/issues/25138
————————————————
版权声明:本文为CSDN博主「W2Y」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lizhijian21/article/details/101367768

使用方法一进行修改,实测已经成功:

只需要添加中间一行即可
上一篇下一篇

猜你喜欢

热点阅读