问题原因

在使用 yarn ios --device 'xxx的iPhone' 或者 react-native run-ios --device 'xxx的iPhone' 时,出现 (Error: Unable To Find Utility "Instruments", Not A Developer Tool) 等等关键字信息的错误提示,

正如错误提示的,因为没有 Instruments 这个工具了,在xcode12的版本,Instruments已经被废弃,但是老版本的React Native库里使用的还是 Instruments 这个命令用于查找当前电脑可用设备

所以这是RN的版本和XCode的版本不兼容了,但是此时又不想升级RN的版本,担心或者已经遇到很多兼容性的问题,那么可以通过修改 @react-native-community 包中代码,修改使用这个命令的地方,换成新版本的查找设备的命令即可。

修改1: node_modules/@react-native-community/cli-platform-ios/build/commands/runIOS/index.js

在这个js中,我们找到名为runIOS的方法,

然后我们可以找到如下这么一行关键代码:

const devices = (0, _parseIOSDevicesList.default)(_child_process().default.execFileSync('xcrun', ['instruments', '-s'], {encoding: 'utf8'
}));
复制代码

也就是说,在低版本的RN里,查找设备列表是用的 xcrun instruments -s,我们直接在命令行输入这行看看会出现什么:

即出现了RN命令运行时的错误,也就是说当前的系统已经不支持这个命令了(笔者此时的XCode是14版本),

那我们看一下高版本的RN,可以正常运行的,它的库中使用的查找设备列表的命令代码是什么:

同样的路径同样的方法,我们可以看到查找设备列表的命令已经变成了:xcrun xctrace list devices

然后在控制执行该命令发现可以列出当前设备列表。

也就是说,RN其实只是用JS代表帮我们调用XCode提供的命令,找到了这个问题我们对低版本的RN代码进行微调即可,此时我们现将查找设备的命令更改成可以正常运行的,

也就是说我们将,

const devices = (0, _parseIOSDevicesList.default)(_child_process().default.execFileSync('xcrun', ['instruments', '-s'], {encoding: 'utf8'
}));
复制代码

改为

const devices = (0, _parseIOSDevicesList.default)(_child_process().default.execFileSync('xcrun', ['xctrace', 'list', 'devices'], {encoding: 'utf8'
}));
复制代码

是不是就可以了,笔者试了一下这么直接用不行,在新版本的代码中使用了 execa 这个库执行命令:

const out = execa.sync('xcrun', ['xctrace', 'list', 'devices']);
复制代码

因此我们需要在老版本的代码中引入 execa 去执行命令:

我们参考 _child_process 的定义,再定义一个 _execa,然后使用 _execa 执行命令:

const devices = (0, _parseIOSDevicesList.default)(_execa().default.sync('xcrun', ['xctrace', 'list', 'devices']));
复制代码

到了这一步,查找设备的命令可以正常执行了,但是还有一个问题,就是对设备列表的结果解析,笔者试了一下直接用老版本的解析代码,也就是 _parseIOSDevicesList.default 对新版本命令的结果输出是不行的,因此还需要修改一下 _parseIOSDevicesList 方法,如何修改看下一步。

修改2: node_modules/@react-native-community/cli-platform-ios/build/commands/runIOS/parseIOSDevicesList.js

这一步的修改比较简单,主要是将正则表达式换一下就可以了:

(老版本的代码):

(改过后的代码):

function parseIOSDevicesList(text) {const devices = [];text.stdout.split('\n').forEach(line => {const device = line.match(/(.*?) ((([0-9.]+)) )?(([0-9A-F-]+))( (Simulator))?/i,)if (device) {const [, name,, version, udid, isSimulator] = device;const metadata = {name,udid};if (version) {metadata.version = version;metadata.type = isSimulator ? 'simulator' : 'device';} else {metadata.type = 'catalyst';}devices.push(metadata);}});return devices;
}
复制代码

收工

最后就可以直接通过 yarn ios --device 'xxx的iPhone' 或者 react-native run-ios --device 'xxx的iPhone' 直接运行了,如果提示找不到设备就多运行几次,因为新命令不知道是因为我的硬件问题还是怎么回事,一会输出有我的iphone一会没有,所以提示找不到就在xcode中判断是不是连上了,如果连上了,就多试几次命令就可以了。

两个文件的完整代码我上传到了github上:github.com/qiaomengnan…

感谢这两篇文章给的提示:

gankrin.org/how-to-fix-…

github.com/react-nativ…

react native (Error: Unable To Find Utility “Instruments“, Not A Developer Tool)相关推荐

  1. IOS-React-Native:unable to find utility instruments, not a developer tool or in PATH

    解决办法: 终端运行命令 sudo xcode-select -s /Applications/Xcode.app/Contents/Developer/ 错误信息: Found Xcode proj ...

  2. 终端报错xcrun: error: unable to find utility “xcodebuild”, not a developer tool or

    我们可以通过设置Xcode中Command Line Tools来解决这个问题. Xcode -> Preferences -> Locations 复制代码 从下拉菜单中选择命令行工具. ...

  3. Xcode升级以后构建ios出现 “unable to find utility PackageApplication, not a developer tool or in PATH”的报错解决

    一般出现这种错误是因为Xcode升级以后PackageApplication丢失的原因,需要将PackageApplication文件重新放在/Applications/Xcode.app/Conte ...

  4. 从终端运行React Native App时出错(iOS)

    本文翻译自:Error Running React Native App From Terminal (iOS) I am following the tutorial on the official ...

  5. React Native 学习资源精选仓库

    <React Native Awesome>这里fork过来的,汇集了各类react-native学习资料.工具.组件.开源App.资源下载.以及相关新闻等,只求精不求全.因后面无法 Pu ...

  6. React Native 学习资源精选仓库(汇聚知识,分享精华)

    React Native 学习资源精选仓库(汇聚知识,分享精华) <React Native Awesome>这里fork过来的,汇集了各类react-native学习资料.工具.组件.开 ...

  7. 构建了我的第一个React Native应用程序之后,我现在确信这是未来。

    by Taylor Milliman 泰勒·米利曼(Taylor Milliman) 构建了我的第一个React Native应用程序之后,我现在确信这是未来. (After building my ...

  8. react native中一次错误排查 Error:Error: Duplicate resources

    最近一直在使用react native中,遇到了很多的坑,同时也学习到了一些移动端的开发经验. 今天在做一个打包的测试时,遇到了一个问题,打包过程中报错"Error:Error: Dupli ...

  9. 解决React Native unable to load script from assets index.android.bundle on windows

    React Native运行的时候,经常碰到React Native unable to load script from assets index.android.bundle on windows ...

最新文章

  1. Python使用tsne进行高维数据可视化实战:二维可视化、三维可视化
  2. SAP WM初阶之LX09查询TR List
  3. 第二课_课后习题解答
  4. 双向LSTM在时间序列异常值检测的应用
  5. 这边有本书:中国社会生存的必备常识(修订版)下载
  6. mysql中文乱码解决方案_Mysql中文乱码解决方案
  7. 查看UNIX/Linux资源占用的top命令
  8. 237. 删除链表中的节点 golang
  9. 通知:即日起本博客暂停更新,请移步至yanxin8.com获取最新文章
  10. 读计算机基础知识心得体会1000字,计算机学习个人心得体会1000字.doc
  11. javase(8)_集合框架_List、Set、Map
  12. 【数据科学赛】CAIL 2022 #八赛道 #NLP #文本匹配 #信息抽取
  13. 科学道德与学风-2021雨课堂答案-第10章
  14. c语言if后面的表达式是什么类型,if语句后面的表达式应该是什么?
  15. 闯荡江湖的必备指南(2)
  16. 教你几招网盘不限速的方法
  17. 【JavaEE进阶系列 | 从小白到工程师】基本类型包装类的使用,装箱以及拆箱与parseInt方法
  18. Android个人信息页面
  19. FPGA基础(数字电路)
  20. win10-SW2016工程图关联零件属性链接操作

热门文章

  1. “福鼎一杯”:“一杯严选”与“茶人的栖息地”——见茶卸甲 | AiHi资讯
  2. 逻辑回归算法分析及在MLlib中的实现剖析
  3. 【信息安全】工具篇--子域名收集
  4. 无线物联网技术,在智能门禁系统的应用
  5. 数据结构--图的存储结构
  6. MacOS 安装 JDK1.8
  7. 信号传输速率的快速了解
  8. 不只是休闲:关于体感游戏的一些思考(六)--- 飞行
  9. 安装SQL Server和SQL Server Management Studio(SSMS)
  10. ora-03114处理