Xcode 13:Cannot initialize a parameter of type 'NSArray<id<RCTBridgeModule>> *'

963 阅读1分钟

原因:Xcode升级之后,.mm 文件中某些 C++ 方法的参数类型发生了变化,原来的 RN 代码编译报错。

解决办法

  • 手动改:

RCTCxxBridge.mm 文件中搜索 Code Block Objective-C NSArray<id<RCTBridgeModule>> *)modules,将其替换成 NSArray<Class> *)modules

  • 脚本改(修改 Podfile):

    • 将下面的代码加到 post_install 中:
    post_install do |installer|
        ## Fix for XCode 12.5 beta
        find_and_replace("../node_modules/react-native/React/CxxBridge/RCTCxxBridge.mm",
        "_initializeModules:(NSArray<id<RCTBridgeModule>> *)modules", "_initializeModules:(NSArray<Class> *)modules")
    end
    
    • 在 Podfile 的文件底部添加下面这个函数:
    def find_and_replace(dir, findstr, replacestr)
      Dir[dir].each do |name|
          text = File.read(name)
          replace = text.gsub(findstr,replacestr)
          if text != replace
              puts "Fix: " + name
              File.open(name, "w") { |file| file.puts replace }
              STDOUT.flush
          end
      end
      Dir[dir + '*/'].each(&method(:find_and_replace))
    end
    
    • 在命令行执行 pod install 即可。

两种办法本质上都是一样的,都是去 RCTCxxBridge.mm 文件修改代码。推荐第二种方案,不容易出错。