反应本机/iOS SDK。将 iOS SDK 更新到 14.5 后,没有匹配的函数调用“RCTBridgeModuleNameForClass”

Tom*_*mas 19 sdk ios react-native xcode12.5 ios14.5

我已将 iOS SDK 平台更新到版本14.5。Xcode 版本现在是12.5。更新后,我无法在我的设备上启动应用程序。并且编译器抛出一个错误:

调用“RCTBridgeModuleNameForClass”没有匹配的函数

我尝试重新安装豆荚,但没有帮助。如何解决?谢谢

在此处输入图片说明

小智 39

将此代码放在 ios/Podfile 的底部

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
Run Code Online (Sandbox Code Playgroud)

保存它,pod install在终端上执行一次并尝试再次运行/构建您的项目!

  • 尝试了一下,我使用的是0.62.2版本的react native,它没有解决问题。出现错误 - 没有匹配的函数可调用“RCTBridgeModuleNameForClass” (10认同)

小智 19

我的 post_install 函数必须略有不同(使用strongModule而不是module在第二次替换中):

  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(strongModule))", "RCTBridgeModuleNameForClass(Class(strongModule)))")
  end
Run Code Online (Sandbox Code Playgroud)


par*_*rse 15

更新到 Xcode 13.1 后,我开始遇到这个问题!然而,到处共享的著名修复程序(RN GitHub issues 和 StackOverflow)对我来说不起作用,但需要一点改变!

RCTBridgeModuleNameForClass(module))应该改为RCTBridgeModuleNameForClass(strongModule))

RCTBridgeModuleNameForClass(Class(module)))RCTBridgeModuleNameForClass(Class(strongModule)))

正如你所看到的,给定的变量名称至少在我的 React Native 版本中发生了变化。

最终代码应该如下所示:

post_install do |installer|
     # Fix after updating to Xcode 13.1
     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(strongModule))", "RCTBridgeModuleNameForClass(Class(strongModule)))")
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
Run Code Online (Sandbox Code Playgroud)


Tom*_*mas 11

我把所有建议的解决方案放在一起,得到了一个工作版本。

播客文件

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(strongModule))", "RCTBridgeModuleNameForClass(Class(strongModule)))")
  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
Run Code Online (Sandbox Code Playgroud)

之后,我收到了一个与 Flipper 相关的新错误:

Flipper-Folly/folly/synchronization/DistributedMutex-inl.h:1051:5: 'atomic_notify_one<unsigned long>' is unavailable
Run Code Online (Sandbox Code Playgroud)

我使用了Xcode throws 'atomic_notify_one' isavailable的解决方案来解决这个问题。

# Enables Flipper.
#
# Note that if you have use_frameworks! enabled, Flipper will not work and
# you should disable the next line.
# use_flipper!()
Run Code Online (Sandbox Code Playgroud)

并注释掉# flipper_post_install(installer)里面的行post_install do |installer|

最后,重新安装您的 pod,重新构建并运行您的项目。


小智 5

这对我有用。

步骤1:打开RCTCxxBridge.mm搜索这段代码:

- (NSArray<RCTModuleData *> *)_initializeModules:(NSArray<id<RCTBridgeModule>> *)modules
                               withDispatchGroup:(dispatch_group_t)dispatchGroup
                                lazilyDiscovered:(BOOL)lazilyDiscovered
Run Code Online (Sandbox Code Playgroud)

并更改为这个

- (NSArray<RCTModuleData *> *)_initializeModules:(NSArray<Class> *)modules
                               withDispatchGroup:(dispatch_group_t)dispatchGroup
                                lazilyDiscovered:(BOOL)lazilyDiscovered
Run Code Online (Sandbox Code Playgroud)

步骤 2:打开 RCTTurboModuleManager.mm(第 300 行)并更改 RCTBridgeModuleNameForClass(module))RCTBridgeModuleNameForClass(Class(module))).