Situation

使用 React Native 0.55.4 搭配 Xcode 13 執行 npx react-native run-ios 出現以下錯誤訊息,

xcrun: error: sh -c '/xxx/Xcode/Xcode_13.app/Contents/Developer/usr/bin/xcodebuild -sdk /xxx/Xcode/Xcode_13.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -find instruments 2> /dev/null' failed with exit code 17664: (null) (errno=Invalid argument)

xcrun: error: unable to find utility "instruments", not a developer tool or in PATH

重點在於 xcrun: error: unable to find utility “instruments”, not a developer tool or in PATH

Action

出現以上錯誤的原因在於Xcode 13的 xcrun 已經沒有 instruments 參數,可以使用 xcrun simctl list 來取代。

接著說明如何修改以及修改哪個檔案。

首先當你輸入 npx react-native run-ios 指令後,node 會執行ReactNative專案目錄/node_modules/react-native/local-cli/runIOS/runIOS.js。(這也是我們要修改的檔案)

打開 ReactNative專案目錄/node_modules/react-native/local-cli/runIOS/runIOS.js,移動到下方區塊

const devices = parseIOSDevicesList(
   child_process.execFileSync('xcrun', ['instruments', '-s'], {encoding: 'utf8'})

這就是出問題的位置。把 execFilesync方法的第2個參數改為 ['simctl', 'list'] 即可,如下

  child_process.execFileSync('xcrun', ['simctl', 'list'], {encoding: 'utf8'})

Result

錯誤訊息不再出現,通過編譯!!