Xcode выбрасывает 'atomic_notify_one <unsigned long>' недоступен
Я установил Xcode 12 на свой Mac, попытался создать собственное приложение для реагирования, которое отлично работает на Android, и получил
'atomic_notify_one<unsigned long>' is unavailable
. Это большая часть информации, которую я получаю от ошибки.
15 ответов
Это ошибка от flipper. Флиппер выдал еще несколько менее описательных ошибок, которые мне пришлось прокомментировать в моем подфайле. После комментирования эта ошибка прекратилась.
Вместо того, чтобы комментировать флиппер, вот решение, которое сработало для меня.
Обновите флиппер в своем подфиле, чтобы он выглядел так
use_flipper!({ 'Flipper-Folly' => '2.5.3', 'Flipper' => '0.87.0', 'Flipper-RSocket' => '1.3.1' })
Запустить
pod repo update
внутри папки ios
И, наконец, обновите модули проекта, используя
pod install
Эта проблема повторилась сегодня после обновления симуляторов iOS до iOS 14.5. Ответ, отправленный «Shared S Katre», кажется хорошим решением.
Поскольку React-Native - это открытый исходный код, я думаю, что любые большие обновления iOS определенно могут привести к критическим изменениям. Думаю, это будет исправлено позже.
В любом случае - проблема, похоже, связана с Flipper, который служит инструментом отладки для RN (https://reactnative.dev/blog/2020/03/26/version-0.62).
Если вам просто нужно создать свой проект, вы можете просто закомментировать flipper в своем подфайле и переустановить свои поды таким образом.
Подфайл
# Enables Flipper.
#
# Note that if you have use_frameworks! enabled, Flipper will not work and
# you should disable the next line.
# use_flipper!()
Затем переустановите свои стручки. Я cd'd в корень проекта и использовал npx.
$ npx pod-install
Наконец, попробуйте собрать и запустить свой проект:
$ npx react-native run-ios
Если у кого-то все еще есть эта ошибка (я только что обновил Mac, Xcode и т. Д.), Вы можете исправить сборку, не отключая Flipper и Hermes; в вашем файле Pod под
post_install
просто добавьте (я нашел его где-то в сети и изменил, чтобы исправить новые ошибки с последними обновлениями):
post_install do |installer|
flipper_post_install(installer)
react_native_post_install(installer)
# # to build for the simulator on Apple M1
# installer.pods_project.targets.each do |target|
# target.build_configurations.each do |config|
# # disables arm64 builds for the simulator
# config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64'
# end
# end
## Fix for XCode 12.5 & RN 0.62.2 - See https://github.com/facebook/react-native/issues/28405
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)))")
## Fix for Flipper-Folly on iOS 14.5
find_and_replace("Pods/Flipper-Folly/folly/synchronization/DistributedMutex-inl.h",
"atomic_notify_one(state)", "folly::atomic_notify_one(state)")
find_and_replace("Pods/Headers/Private/RCT-Folly/folly/synchronization/DistributedMutex-inl.h",
"atomic_notify_one(state)", "folly::atomic_notify_one(state)")
find_and_replace("Pods/Flipper-Folly/folly/synchronization/DistributedMutex-inl.h",
"atomic_wait_until(&state, previous | data, deadline)", "folly::atomic_wait_until(&state, previous | data, deadline)")
end
Перед вашим
target
, Добавлять
# fixes for last Mac updates
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
Я должен прокомментировать все
#ifdef FB_SONARKIT_ENABLED
в AppDelegate.m установите для hermes значение false и закомментируйте Flipper в Podfile.
В конце концов, удалите Pods и Podfile.lock, затем установите pod
просто прокомментировал эту строку и решил эту проблему -
# use_flipper!
# post_install do |installer|
# flipper_post_install(installer)
# end
У меня была такая же проблема при сборке в XCode 12.5. Если временное отключение Flipper вам не подходит, вы можете перейти на версию XCode 12.4. Это исправило это для меня. Вы можете скачать XCode 12.4 здесь: https://developer.apple.com/download/more
Чтобы немного расширить ответы Umang и opensw.
Я обновил find_and_replace следующим образом. Обратите внимание, я добавил
system("chmod +w " + name)
это исправляет
Permission denied @ rb_sysopen
ошибка.
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
system("chmod +w " + name)
File.open(name, "w") { |file| file.puts replace }
STDOUT.flush
end
end
Dir[dir + '*/'].each(&method(:find_and_replace))
end
Вот моя конфигурация флиппера
use_flipper!({ 'Flipper' => '0.87.0', 'Flipper-Folly' => '2.5.3', 'Flipper-RSocket' => '1.3.1' })
А что касается исправления файлов, то в моем случае на самых последних версиях по состоянию на 30 апреля достаточно обновить
DistributedMutex-inl.h
только в одном месте.
Также обратите внимание, как я добавил два дополнительных символа пробела перед именем функции. Это необходимо, чтобы установка модуля не нарушала код при последующих вызовах.
post_install do |installer|
flipper_post_install(installer)
react_native_post_install(installer)
find_and_replace("Pods/RCT-Folly/folly/synchronization/DistributedMutex-inl.h",
" atomic_notify_one(state);", " folly::atomic_notify_one(state);")
end
Замените весь текущий код флиппера в вашем Podfile на эту базу в вашей версии React Native:
add_flipper_pods!({ 'Flipper-Folly' => '2.5.3', 'Flipper' => '0.87.0', 'Flipper-RSocket' => '1.3.1' })
или же
use_flipper!({ 'Flipper-Folly' => '2.5.3', 'Flipper' => '0.87.0', 'Flipper-RSocket' => '1.3.1' })
Затем обновите проект Pods, используя это:
cd ios && pod install && cd ..
Я думаю, что ответ, предоставленный @opensw, будет работать, но я нашел что-то более расширенное решение, чтобы оно работало с установкой pod каждый раз, не удаляя
Pods
папка. Прежде всего, измените добавить / заменить эту строку в своем подфиле.
use_flipper!({ 'Flipper-Folly' => '2.5.3', 'Flipper' => '0.87.0', 'Flipper-RSocket' => '1.3.1' })
Теперь в последних версиях, упомянутых в приведенных выше строках, исправлена проблема с
Flipper-folly
Но мы также должны позаботиться о безумие RCT, и для этого мы будем использовать
find_and_replace
функция. Вот новая функция, которую я получил отсюда
# Define find-and-replace function
def find_and_replace(dir, findstr, replacestr)
Dir[dir].each do |name|
text = File.read(name)
replace = text.gsub(findstr,replacestr)
replaced = text.index(replacestr)
if replaced == nil && 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
Теперь вызовите эту функцию из пост-установки, поэтому нам нужно будет добавить следующие 2 вызова функций внутри
post_install do |installer|
find_and_replace("Pods/RCT-Folly/folly/synchronization/DistributedMutex-inl.h",
"atomic_notify_one(state)", "folly::atomic_notify_one(state)")
find_and_replace("Pods/RCT-Folly/folly/synchronization/DistributedMutex-inl.h",
"atomic_wait_until(&state, previous | data, deadline)", "folly::atomic_wait_until(&state, previous | data, deadline)")
Вот мой ответ на Github
Вы должны прокомментировать ниже код Flipper в Podfile:
use_flipper!
post_install do |installer|
flipper_post_install(installer)
end
У меня была такая же проблема при обновлении проекта с RN 0.63 до 0.64 (и с использованием Xcode 12.5), но ответ, получивший наибольшее количество голосов, не решил проблему для меня, и я старался избегать каких-либо дополнительных скриптов.
Я заметил в по помощникеобновлению некоторые изменения в подфайле - в частности, изменение с
flipper_post_install(installer)
к
react_native_post_install(installer)
. Я внес это изменение и обновил свой каталог модулей, а затем запустил
pod install --repo-update
и это исправило это для меня :)
Я также заметил, что патч запускается для
DistributedMutex
файл (который был рассматриваемым файлом) после установки модулей, поэтому мне кажется, что это должно быть правильное исправление
Бонус : это также позволило мне удалить старые
flipper_post_install
сценарий, который у меня был в верхней части моего подфайла из предыдущего обновления
замените atomic_nofiy_one на folly::atomic_notify_one, полный подфайл будет удален:
platform :ios, '9.0'
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
def add_flipper_pods!
version = '~> 0.33.1'
pod 'FlipperKit', version, :configuration => 'Debug'
pod 'FlipperKit/FlipperKitLayoutPlugin', version, :configuration => 'Debug'
pod 'FlipperKit/SKIOSNetworkPlugin', version, :configuration => 'Debug'
pod 'FlipperKit/FlipperKitUserDefaultsPlugin', version, :configuration => 'Debug'
pod 'FlipperKit/FlipperKitReactPlugin', version, :configuration => 'Debug'
end
# Post Install processing for Flipper
def flipper_post_install(installer)
installer.pods_project.targets.each do |target|
if target.name == 'YogaKit'
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '4.1'
end
end
end
end
target 'AwesomeProject' do
# Pods for AwesomeProject
pod 'FBLazyVector', :path => "../node_modules/react-native/Libraries/FBLazyVector"
pod 'FBReactNativeSpec', :path => "../node_modules/react-native/Libraries/FBReactNativeSpec"
pod 'RCTRequired', :path => "../node_modules/react-native/Libraries/RCTRequired"
pod 'RCTTypeSafety', :path => "../node_modules/react-native/Libraries/TypeSafety"
pod 'React', :path => '../node_modules/react-native/'
pod 'React-Core', :path => '../node_modules/react-native/'
pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules'
pod 'React-Core/DevSupport', :path => '../node_modules/react-native/'
pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS'
pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation'
pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob'
pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image'
pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS'
pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network'
pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings'
pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text'
pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration'
pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/'
pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact'
pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi'
pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor'
pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector'
pod 'ReactCommon/callinvoker', :path => "../node_modules/react-native/ReactCommon"
pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon"
pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga', :modular_headers => true
pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec'
pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'
target 'AwesomeProjectTests' do
inherit! :complete
# Pods for testing
end
use_native_modules!
# Enables Flipper.
#
# Note that if you have use_frameworks! enabled, Flipper will not work and
# you should disable these next few lines.
add_flipper_pods!
post_install do |installer|
flipper_post_install(installer)
## Fix for XCode 12.5 beta
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)))")
find_and_replace("Pods/Flipper-Folly/folly/synchronization/DistributedMutex-inl.h",
" atomic_notify_one(state);", " folly::atomic_notify_one(state);")
end
end
target 'AwesomeProject-tvOS' do
# Pods for AwesomeProject-tvOS
target 'AwesomeProject-tvOSTests' do
inherit! :search_paths
# Pods for testing
end
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