Я установил Xcode 12 на свой Mac, попытался создать собственное приложение для реагирования, которое отлично работает на Android, и получил 'atomic_notify_one<unsigned long>' is unavailable
. Это самая большая информация, которую я получаю от ошибки.
Xcode выдает «atomic_notify_one‹unsigned long›» недоступен
Ответы (12)
Вместо того, чтобы комментировать флиппер, вот решение, которое сработало для меня.
Обновите флиппер в вашем подфайле, чтобы он выглядел так
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!()
Затем переустановите свои модули. Я зашел в корень проекта и использовал npx.
$ npx pod-install
Наконец, попробуйте создать и запустить свой проект:
$ npx react-native run-ios
Обновлять:
Судя по комментариям, теперь это исправлено. Если вам нужен флиппер, вы сможете вернуть свой подфайл и обновить флиппер.
См.: https://stackoverflow.com/a/67314652/9906042
Спасибо штабелерам!
- Исправьте подфайл, как показано на изображении ниже
- компакт-диск ios
- удалить папку Pods и Podfile.lock
- установка модуля
- обновление модуля
- cd .. && npx реагировать на собственный run-ios
Я должен прокомментировать все #ifdef FB_SONARKIT_ENABLED
в AppDelegate.m, установить для Hermes значение false и прокомментировать Flipper в Podfile.
В конце концов, удалите Pods и Podfile.lock, затем установите pod.
:hermes_enabled => false
было тем, чего мне не хватало, чтобы приступить к работе. Надеюсь скоро выйдет обновление. Спасибо!
- person Allen; 27.04.2021
:hermes_enabled => true
, и мне также нужно было изменить его на :hermes_enabled => false
. Я сделал pod install --update-repo
после этого, и это не помогло. Спасибо
- person Dror Bar; 09.05.2021
Если у кого-то все еще есть эта ошибка (я только что обновил Mac, Xcode и т. д.), вы можете исправить сборку, не отключая Flipper и Hermes; в вашем файле пода под 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
Permission denied @ rb_sysopen - Pods/Flipper-Folly/folly/synchronization/DistributedMutex-inl.h
, то удаление папки Pods
исправляет ее
- person Stathis Ntonas; 29.04.2021
Эта ошибка была ошибкой флиппера. Flipper выдал еще несколько менее описательных ошибок, которые мне пришлось прокомментировать в моем подфайле. После комментирования эта ошибка прекратилась.
просто прокомментировал эту строку и решил эту проблему -
# 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
Вам нужно прокомментировать ниже код Flipper в Podfile:
use_flipper!
post_install do |installer|
flipper_post_install(installer)
end
Я думаю, что ответ, предоставленный @opensw, будет работать, но я нашел нечто более усовершенствованное решение, чтобы оно работало с установкой модуля каждый раз без удаления папки 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
Замените весь текущий код флиппера в вашем подфайле на эту базу в вашей версии React Native:
add_flipper_pods!({ 'Flipper-Folly' => '2.5.3', 'Flipper' => '0.87.0', 'Flipper-RSocket' => '1.3.1' })
or
use_flipper!({ 'Flipper-Folly' => '2.5.3', 'Flipper' => '0.87.0', 'Flipper-RSocket' => '1.3.1' })
Затем обновите проект Pods, используя это:
cd ios && pod install && cd ..
Чтобы немного расширить ответы 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