Skip to content

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 版本能解决此问题:

  1. 在终端中运行:
bash
flutter upgrade
  1. 清理构建缓存:
bash
flutter clean
  1. 尝试重新构建并归档应用

方法 2:添加 Run Script 自动生成 dSYM

如果升级后问题仍然存在,手动添加构建脚本自动生成缺失的 dSYM:

  1. 在 Xcode 中打开项目
  2. 选择项目目标 > Build Phases
  3. 点击 + > New Run Script Phase
  4. 粘贴以下脚本之一:
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:

  1. 定位框架文件:
bash
find ~/Library/Developer/Xcode/DerivedData -name "Flutter.framework" | grep -v "SourcePackages"
  1. 生成 dSYM 文件:
bash
xcrun dsymutil -o ~/Desktop/Flutter.framework.dSYM /path/to/Flutter.framework/Flutter
  1. 添加到存档:
  • 在 Xcode 中打开 Organizer(Window > Organizer)
  • 右键点击存档 > Show in Finder
  • 右键点击 .xcarchive 文件 > Show Package Contents
  • 将生成的 dSYM 复制到 dSYMs 目录

特殊情况:使用 Shorebird

如果通过 Shorebird 进行部署:

  1. 访问 Shorebird 控制台
  2. 进入对应应用版本 > Artifacts
  3. 下载 Flutter.dSYM 文件
  4. 按上述步骤手动添加到存档的 dSYMs 目录

问题诊断与验证

遇到此问题时,请检查:

  1. Flutter 版本是否过旧
  2. Xcode 构建阶段顺序是否正确
  3. 存档包中是否确实缺少 Flutter.framework.dSYM

通过以上方法,应该能够成功生成所需的 dSYM 文件并解决归档时的 UUID 匹配错误。