С момента обновления до Xcode 10.2 я больше не могу запускать реакцию на запуск через IOS
Сегодня я обновился до Xcode 10.2, так как после обновления я не могу запускать react-native run-ios
через cli:
react-native run-ios --simulator="iPhone X"
Found Xcode workspace a.xcworkspace
Could not find iPhone X simulator
Error: Could not find iPhone X simulator
at resolve (/Users/user/Documents/work/a/a-light-ui/node_modules/react-native/local-cli/runIOS/runIOS.js:149:13)
at new Promise (<anonymous>)
at runOnSimulator (/Users/user/Documents/work/a/a-light-ui/node_modules/react-native/local-cli/runIOS/runIOS.js:134:10)
at Object.runIOS [as func] (/Users/user/Documents/work/a/a-light-ui/node_modules/react-native/local-cli/runIOS/runIOS.js:106:12)
at Promise.resolve.then (/Users/user/Documents/work/a/a-light-ui/node_modules/react-native/local-cli/cliEntry.js:117:22)
Если я запускаю xcrun simctl list devices
все симуляторы показывают (Shutdown) (unavailable, runtime profile not found)
:
iPhone X (7AADFA50-7B57-4A40-8434-9A86F345D7ED) (Shutdown) (unavailable, runtime profile not found)
У кого-нибудь еще была эта проблема с RN после обновления xcode до 10.2? Это все еще работает через Xcode.. но это означает открытие Xcode.
Ответы
Ответ 1
Я решил так;
Во-первых, вам нужно идти по этому пути
node_modules/реагируют родной/локального кли /runIOS/findMatchingSimulator.js
а потом;
Вам нужно изменить этот код
if (!version.startsWith('iOS') && !version.startsWith('tvOS'))
с
if (!version.startsWith('com.apple.CoreSimulator.SimRuntime.iOS') && !version.startsWith('com.apple.CoreSimulator.SimRuntime.tvOS'))
Надеюсь, это будет полезно,
ссылка: https://github.com/facebook/react-native/issues/21498#issuecomment-476621627
Ответ 2
Эта ошибка была исправлена начиная с RN v0.58.0
, смотрите коммиты здесь
IIRC эта ошибка была введена в Xcode 10.1
Также вы можете это исправить, просто заменив startsWith()
includes()
. Но делать это каждый раз, когда вы обновляете node_modules
не идеально, поэтому я бы порекомендовал обновить вашу версию RN, если это возможно.
Ответ 3
Я думал, что добавлю свое решение и здесь, в надежде помочь кому-нибудь. Я только что обновился до Mac OS Mojave и также обновился до Xcode 10.2. Весь мой реагирующий родной проект сломался, очень плохо. Тогда я опустил Xcode до 10.1. Затем я начал видеть эту ошибку, сказав после запуска response-native run-ios:
Не удалось найти симулятор iPhone X
вышеупомянутый "взлом" исправил это, отредактировав файл findMatchingSimulator.js с обновлениями выше.
Затем, реактивный run-ios пошел дальше, следующая ошибка была:
: CFBundleIdentifier, не существует
Я исправил это:
- cd node_modules/реакции-нативный/сторонний /glog * Tab Enter
- . /configure
Сейчас реагирует - родной run-ios работает. Надеюсь, это кому-нибудь поможет, это было больно в @ss.
Ответ 4
Если не удалось найти, симулятор все еще сохраняется после замены следующих строк кода в runSimulator.js.
Путь для runSimulator.js ->/node_modules/react-native/local-cli/runIOS/findMatchingSimulator.js
if (!version.startsWith('iOS') && !version.startsWith('tvOS')) { continue; }
с этим
if ( !version.startsWith('com.apple.CoreSimulator.SimRuntime.iOS') && !version.startsWith('com.apple.CoreSimulator.SimRuntime.tvOS') ) { continue; }
комментируйте следующие строки после замены
if ( simulator.availability !== '(available)' && simulator.isAvailable !== 'YES' ) { continue; }
и второй подход после обновления до XCode 11
Xcode 11 xcrun возвращает true или false, а не YES или NO для свойства isAvailable, как и раньше. Вы можете проверить это с помощью следующей команды
xcrun simctl list devices --json
Команда выше распечатает все доступные устройства, как следующие
com.apple.CoreSimulator.SimRuntime.iOS-12-2" : [
{
"state" : "Booted",
"isAvailable" : true,
"name" : "iPhone X",
"udid" : "E53748D1-628B-4A99-A419-4D7AE7CE4745"
}
]
Замените YES на true в следующем коде
if ( simulator.availability !== '(available)' && simulator.isAvailable !== 'YES' ) { continue; }
как это
if ( simulator.availability !== '(available)' && simulator.isAvailable !== true ) { continue; }
Ответ 5
Вы даже просто делаете что-то подобное
if (version.indexOf('iOS') === -1)
...