Flutter iOS 存档缺少 dSYM 文件解决方案
在开发 Flutter iOS 应用时,当尝试上传或验证应用时可能会遇到以下错误提示:
The archive did not include a dSYM for the Flutter.framework with the UUIDs [4C4C---****-45CD327]. Ensure that the archive's dSYM folder includes a DWARF file for Flutter.framework with the expected UUIDs.
这表示存档文件缺少 Flutter.framework 的调试符号文件(dSYM)。缺少 dSYM 文件将导致无法准确分析应用崩溃报告。
解决方案概览
以下是解决此问题的几种有效方法,按照推荐顺序排列:
方法 1:升级 Flutter(推荐首先尝试)
多个开发者确认升级 Flutter 版本能解决此问题:
- 在终端中运行:
bash
flutter upgrade
- 清理构建缓存:
bash
flutter clean
- 尝试重新构建并归档应用
方法 2:添加 Run Script 自动生成 dSYM
如果升级后问题仍然存在,手动添加构建脚本自动生成缺失的 dSYM:
- 在 Xcode 中打开项目
- 选择项目目标 > Build Phases
- 点击 + > New Run Script Phase
- 粘贴以下脚本之一:
bash
# Flutter 框架生成脚本
if [ -d "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework" ]; then
echo "Generating dSYM for Flutter.framework"
dsymutil "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework/Flutter" -o "${BUILT_PRODUCTS_DIR}/Flutter.framework.dSYM"
fi
bash
# Hermes 引擎生成脚本
set -euo pipefail
HERMES_BIN="${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework/hermes"
HERMES_DSYM="${DWARF_DSYM_FOLDER_PATH}/hermes.framework.dSYM"
if [ -e "$HERMES_BIN" ] && [ ! -e "$HERMES_DSYM" ]; then
echo "🛠 Generating dSYM for Hermes..."
/usr/bin/dsymutil "$HERMES_BIN" -o "$HERMES_DSYM"
fi
脚本放置顺序
在 Build Phases 中确保生成脚本位于 [CP] Embed Pods Frameworks
之后,但不应是最后一个阶段
方法 3:手动添加 dSYM 文件
当上述方法无效时,可手动生成并添加 dSYM:
- 定位框架文件:
bash
find ~/Library/Developer/Xcode/DerivedData -name "Flutter.framework" | grep -v "SourcePackages"
- 生成 dSYM 文件:
bash
xcrun dsymutil -o ~/Desktop/Flutter.framework.dSYM /path/to/Flutter.framework/Flutter
- 添加到存档:
- 在 Xcode 中打开 Organizer(Window > Organizer)
- 右键点击存档 > Show in Finder
- 右键点击 .xcarchive 文件 > Show Package Contents
- 将生成的 dSYM 复制到 dSYMs 目录
特殊情况:使用 Shorebird
如果通过 Shorebird 进行部署:
- 访问 Shorebird 控制台
- 进入对应应用版本 > Artifacts
- 下载 Flutter.dSYM 文件
- 按上述步骤手动添加到存档的 dSYMs 目录
问题诊断与验证
遇到此问题时,请检查:
- Flutter 版本是否过旧
- Xcode 构建阶段顺序是否正确
- 存档包中是否确实缺少 Flutter.framework.dSYM
通过以上方法,应该能够成功生成所需的 dSYM 文件并解决归档时的 UUID 匹配错误。