iOS小记--Xcode12.5:Cannot initialize a parameter of type ‘NSArray<id<RCTBridgeModule>> *‘

错误信息

  • Cannot initialize a parameter of type ‘NSArray<id<RCTBridgeModule>> *‘
  • No matching function for call to 'RCTBridgeModuleNameForClass'
  • Xcode12.5 & RN

原因

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

解决方式

通过Ruby脚本修改代码。Podfile 的最下方加上这些内容,然后 pod install

post_install do |installer|
## Fix for XCode 12.5
    find_and_replace("../node_modules/react-native/React/CxxBridge/RCTCxxBridge.mm",
    "_initializeModules:(NSArray> *)modules", "_initializeModules:(NSArray *)modules")
    find_and_replace("../node_modules/react-native/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm",
    "RCTBridgeModuleNameForClass(module)", "RCTBridgeModuleNameForClass(Class(module)))")
end

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

\color{red}{注意:多解释两句,有朋友在Podfile加了代码,还是会出错,这里把我遇到的几种情况罗列下,你参照着改改。}
- 1. 如果你的代码里本来就有'post_install' 脚本,需要自己合并一下
- 2. '../node_modules/XXX'是代码的路径,和你的代码不一定一样,把你自己的正确路径修改在这里
- 3. ‘ RCTBridgeModuleNameForClass’ 这个地方我的脚本不知道哪不对,替换不了,手动改的,你要是实在不行,也手动改吧

相关链接

  • github
  • CSDN

你可能感兴趣的:(iOS小记--Xcode12.5:Cannot initialize a parameter of type ‘NSArray<id<RCTBridgeModule>> *‘)