【问题标题】:React Native / iOS SDK. No matching function for call to 'RCTBridgeModuleNameForClass' after update iOS SDK to 14.5反应原生/iOS SDK。将 iOS SDK 更新到 14.5 后调用“RCTBridgeModuleNameForClass”没有匹配功能
【发布时间】:2021-07-21 00:49:37
【问题描述】:

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

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

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

【问题讨论】:

    标签: ios react-native sdk xcode12.5 ios14.5


    【解决方案1】:

    将此代码放在 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
    

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

    【讨论】:

    • 试过了,我用的是0.62.2版本的react native,没有解决问题。出现错误 - 没有匹配函数调用“RCTBridgeModuleNameForClass”
    • @Vasanth 你能解决这个问题吗?
    • 这对我来说确实适用于 react native 61.5。但我认为这是一种疯狂的超级黑客行为,每次你运行类似 yarn-update 的东西时,你都必须重新运行 pod install 来重新修补你的反应代码。疯狂。不过谢谢你的回答。
    【解决方案2】:

    我的 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
    

    【讨论】:

    • 在进行这些更改并收到此错误后,我仍然无法构建:Flipper-Folly/folly/synchronization/DistributedMutex-inl.h:1051:5: 'atomic_notify_one&lt;unsigned long&gt;' is unavailable
    • @AnuneetAnand 我有同样的错误。我使用了stackoverflow.com/a/67286470/4512868的解决方案
    • 这是一个不同的问题,并且需要在 Podfile 中禁用翻转器。见:stackoverflow.com/questions/66189325/…
    • 谢谢,它非常适用于 Xcode 12.5.1 和我身边的 React Native 0.62.2,而我在 patch-package 中而不是 post_install 函数中进行文件更改。
    • 你太棒了!它有帮助。谢谢
    【解决方案3】:

    我汇总了所有建议的解决方案并得到了一个工作版本。

    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(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
    

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

    Flipper-Folly/folly/synchronization/DistributedMutex-inl.h:1051:5: 'atomic_notify_one<unsigned long>' is unavailable
    

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

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

    并在post_install do |installer|中注释掉# flipper_post_install(installer)这一行

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

    【讨论】:

    • 值得注意的是,您还需要在 AppDelegate 文件中注释掉任何 Flipper 对象初始化。
    • 看起来您在第一次调用 RCTCxxBridge.mm 文件的 find_and_replace 时缺少 react-native 中的“-”。
    • 这也解决了我的问题。但是你能和我们分享一下是什么问题吗?为什么会发生?提议的解决方案解决了什么问题?
    • 如果您仍然遇到问题(我在 Xcode 13 上遇到过),那么对此答案的第一条评论解释了将 fix_and_replace 放在一行上对我有用。 stackoverflow.com/a/68245484/2061520
    【解决方案4】:

    更新到 Xcode 13.1 后,我开始遇到这个问题!但是,到处共享的著名修复程序(RN GitHub 问题和 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
    

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 2022-07-15
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 2018-06-17
      • 2021-12-27
      相关资源
      最近更新 更多