React Native/iOS SDK. Нет функции сопоставления для вызова «RCTBridgeModuleNameForClass» после обновления iOS SDK до версии 14.5.

Я обновил платформу iOS SDK до версии 14.5. Версия Xcode теперь 12.5. После обновления я не могу запустить приложение на своем устройстве. И компилятор выдает ошибку:

Нет соответствующей функции для вызова 'RCTBridgeModuleNameForClass'

Пробовал переустанавливать капсулы, но не помогло. Как это исправить? Спасибо

введите здесь описание изображения


person Tomas    schedule 27.04.2021    source источник


Ответы (3)


Поместите этот код внизу вашего 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 на терминале и попробуйте снова запустить/собрать свой проект!

person Tiago Angelo    schedule 27.04.2021
comment
Решил мою проблему, спасибо! - person ugrdursun; 02.08.2021

Моя функция 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
person Michael Blanton    schedule 27.04.2021
comment
Я все еще не могу выполнить сборку после внесения этих изменений и получения этой ошибки: Flipper-Folly/folly/synchronization/DistributedMutex-inl.h:1051:5: 'atomic_notify_one<unsigned long>' is unavailable - person Anuneet Anand; 28.04.2021
comment
@AnuneetAnand, у меня такая же ошибка. Я использовал решение из stackoverflow.com/a/67286470/4512868. - person Tomas; 28.04.2021
comment
Это другая проблема, и также необходимо отключить флиппер в подфайле. См.: stackoverflow. com/questions/66189325/ - person DBrown; 27.05.2021
comment
Спасибо, это отлично работает для Xcode 12.5.1 с React Native 0.62.2 на моей стороне, в то время как я делаю изменения файлов в patch-package вместо функции post_install. - person Wing Choy; 18.07.2021

Собрал воедино все предложенные решения и получил рабочий вариант.

Подфайл

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 выдает "atomic_notify_one" недоступен, чтобы решить эту проблему.

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

И закомментировал строку # flipper_post_install(installer) внутри post_install do |installer|

Наконец, переустановите свои модули, перестройте и запустите свой проект.

person Tomas    schedule 28.04.2021
comment
Возможно, стоит отметить, что вам также потребуется закомментировать любые инициализации объекта Flipper в файле AppDelegate. - person DBrown; 27.05.2021
comment
Похоже, вам не хватает - в react-native при первом вызове find_and_replace для файла RCTCxxBridge.mm. - person spd; 02.06.2021
comment
Это также решило мою проблему. Но не могли бы вы поделиться с нами, в чем проблема? Почему это произошло? А что удалось исправить предложенным решением? - person Shoeb Mirza; 06.07.2021