错误信息
- 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<id<RCTBridgeModule>> *)modules", "_initializeModules:(NSArray<Class> *)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
- 1. 如果你的代码里本来就有'post_install' 脚本,需要自己合并一下
- 2. '../node_modules/XXX'是代码的路径,和你的代码不一定一样,把你自己的正确路径修改在这里
- 3. ‘ RCTBridgeModuleNameForClass’ 这个地方我的脚本不知道哪不对,替换不了,手动改的,你要是实在不行,也手动改吧