React Native应用发布苹果商店:解决hermes.framework的dSYM缺失问题

张开发
2026/4/15 5:39:24 15 分钟阅读

分享文章

React Native应用发布苹果商店:解决hermes.framework的dSYM缺失问题
1. 为什么React Native应用发布苹果商店会报dSYM缺失错误最近在帮团队处理React Native应用上架苹果商店时遇到了一个让人头疼的问题。打包上传后苹果商店后台报错提示The archive did not include a dSYM for the hermes.framework with the UUIDs [58A2B46F-BC4E-34AE-82CE-EF76DFDEA9A8]。这个错误直接导致我们的应用无法完成审核流程。简单来说dSYM文件就像是代码的地图。当应用在用户设备上崩溃时系统会生成一堆看似天书的16进制地址。有了dSYM文件Xcode才能把这些地址翻译成我们看得懂的代码位置帮助定位问题。而hermes.framework是React Native默认的JavaScript引擎它的dSYM文件缺失会导致苹果无法正确解析崩溃日志。我查了很多资料发现这个问题在React Native 0.64及以上版本特别常见。根本原因是hermes-engine的安装包默认不包含dSYM文件而苹果商店在上传应用时又强制要求所有二进制文件都必须有对应的调试符号文件。这就好比你去机场托运行李工作人员非要看行李的身份证(dSYM)但航空公司(Hermes)偏偏没给你办。2. 手动解决方案三步搞定dSYM文件2.1 第一步确认React Native和Hermes版本在开始之前我们需要先确认项目中使用的React Native和Hermes引擎版本。打开项目根目录下的package.json文件找到react-native的版本号。然后查看node_modules/hermes-engine/package.json记录下Hermes的版本号。这两个版本号必须严格匹配。我就踩过坑一开始随便下载了最新版的Hermes dSYM结果UUID对不上折腾了半天才发现版本不匹配。建议在React Native官方GitHub的Release页面找到对应版本的Hermes发布包。2.2 第二步下载正确的dSYM文件打开浏览器访问Hermes引擎的GitHub发布页https://github.com/facebook/hermes/releases找到与项目Hermes版本完全一致的发布包。比如你用的是Hermes 0.11.0就找v0.11.0的发布包。下载那个以hermes-runtime-darwin-vX.X.X.tar.gz结尾的文件。解压这个压缩包后你会看到一个hermes.framework.dSYM文件夹。这就是我们需要的调试符号文件。我建议在项目根目录下新建一个dSYMs_backup文件夹把这些文件备份在这里防止后续操作失误导致文件丢失。2.3 第三步将dSYM文件放入正确位置现在需要把下载的dSYM文件放到hermes-engine的正确目录下。具体路径是[项目目录]/ios/Pods/hermes-engine/destroot/Library/Frameworks/universal/hermes.xcframework这个目录下会有多个子目录比如ios-arm64、ios-arm64_x86_64-simulator等。我们需要在每个子目录下都创建一个dSYMs文件夹然后把hermes.framework.dSYM放进去。这里有个关键点不同架构的dSYM文件其实是有区别的。虽然我们下载的是一个通用的包但实际使用时需要确保每个架构目录下的dSYM文件都是专门针对该架构生成的。这就是为什么我们需要为每个子目录单独放置dSYM文件。完成后的目录结构应该是这样的hermes.xcframework/ ├── Info.plist ├── ios-arm64 │ ├── dSYMs │ │ └── hermes.framework.dSYM │ └── hermes.framework ├── ios-arm64_x86_64-maccatalyst │ ├── dSYMs │ │ └── hermes.framework.dSYM │ └── hermes.framework └── ...其他架构目录3. 自动化解决方案一劳永逸的脚本手动解决方案虽然有效但有个致命缺点每次执行pod install或者clean操作后这些手动添加的dSYM文件就会被清除。这意味着每次打包前都得重新操作一遍非常麻烦。3.1 创建自动复制脚本为了解决这个问题我们可以创建一个自动化的脚本。在Xcode中打开项目选择Target - Build Phases点击左上角的号选择New Run Script Phase。将以下脚本代码粘贴进去#!/bin/bash echo [Hermes dSYM Fix] 开始自动复制dSYM文件 # 定义源文件和目标路径 HERMES_DSYM_SOURCE${PROJECT_DIR}/dSYMs_backup/hermes.framework.dSYM HERMES_XCFRAMEWORK_DIR${PROJECT_DIR}/Pods/hermes-engine/destroot/Library/Frameworks/universal/hermes.xcframework # 为目标框架的每个变体创建dSYMs目录并复制文件 for variant in ios-arm64 ios-arm64_x86_64-maccatalyst ios-arm64_x86_64-simulator xros-arm64 xros-arm64_x86_64-simulator; do if [ -d ${HERMES_XCFRAMEWORK_DIR}/${variant} ]; then mkdir -p ${HERMES_XCFRAMEWORK_DIR}/${variant}/dSYMs cp -R ${HERMES_DSYM_SOURCE} ${HERMES_XCFRAMEWORK_DIR}/${variant}/dSYMs/ echo 已为${variant}架构添加dSYM文件 fi done echo [Hermes dSYM Fix] dSYM文件复制完成这个脚本会在每次构建时自动运行确保dSYM文件总是存在于正确的位置。我建议把这个脚本放在Compile Sources阶段之前这样能确保在编译代码前所有必要的调试符号都已经就位。3.2 验证脚本是否生效为了确认脚本真的起作用了我们可以进行以下测试在Xcode中执行Product - Clean Build Folder然后执行Product - Archive打包完成后在Organizer中找到生成的xcarchive文件右键显示包内容检查dSYMs目录下是否有hermes.framework.dSYM如果一切正常你应该能看到hermes的dSYM文件已经包含在归档包中了。这样上传到苹果商店就不会再报错了。4. 高级排查当问题依然存在时有时候即使按照上述步骤操作问题可能仍然存在。这时候就需要更深入的排查了。4.1 检查dSYM文件的UUID每个dSYM文件都有唯一的UUID标识符必须与二进制文件完全匹配。我们可以使用dwarfdump工具来验证dwarfdump --uuid /path/to/hermes.framework.dSYM运行后会输出类似这样的信息UUID: 58A2B46F-BC4E-34AE-82CE-EF76DFDEA9A8 (arm64) /path/to/hermes.framework.dSYM这个UUID必须与苹果商店报错信息中显示的UUID完全一致。如果不一致说明使用的dSYM文件版本不对需要重新下载正确版本的Hermes引擎dSYM。4.2 检查Xcode缓存问题Xcode有时会缓存旧的构建信息导致修改不生效。这时候可以尝试以下步骤完全退出Xcode删除DerivedData目录rm -rf ~/Library/Developer/Xcode/DerivedData清理构建目录rm -rf ~/Library/Developer/Xcode/Archives重新打开项目执行clean后再打包4.3 验证归档包内容有时候问题可能出在上传环节。我们可以手动检查生成的xcarchive文件在Finder中前往~/Library/Developer/Xcode/Archives找到最新的归档文件右键显示包内容进入dSYMs目录检查是否包含hermes.framework.dSYM也可以检查Products/Applications/YourApp.app/Frameworks目录下是否有hermes.framework如果这些检查都通过了但上传时仍然报错可能需要联系苹果开发者支持因为有时候可能是苹果服务器端的问题。

更多文章