美文网首页转载专题iOS开发
低版本ReactNative在XCode11启动时异常问题的解决

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

作者: 爱吃萝卜的小蘑菇 | 来源:发表于2019-09-29 10:38 被阅读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

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

    只需要添加中间一行即可

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/nlffpctx.html