С момента обновления до 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, не существует

Я исправил это:

  1. cd node_modules/реакции-нативный/сторонний /glog * Tab Enter
  2. . /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)...