在升级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: ]
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