Xcode Cloud上传dSYM至Firebase Crashlytics后版本显示未知怎么办?
我通过Xcode Cloud使用ci_post_xcodebuild.sh脚本自动上传dSYM文件到Firebase Crashlytics,脚本内容如下,但在Firebase控制台中,已上传的dSYM版本显示为“未知”。我试过压缩dSYM文件夹上传,也想手动设置版本,但upload-symbols工具没有这个选项,该怎么解决?
脚本内容
#!/bin/sh set -e if [[ -n $CI_ARCHIVE_PATH ]]; then echo "Archive path is available. Let's run dSYMs uploading script" # Move up to parent directory cd .. echo "Archive path: $CI_ARCHIVE_PATH" echo "Bundle ID: $CI_BUNDLE_ID" echo "Build number: $CI_BUILD_NUMBER" echo "Derived data path: $CI_DERIVED_DATA_PATH" # Crashlytics dSYMs scripts if [ $CI_BUNDLE_ID = "com.example.com" ] then echo "This is a production build." $CI_DERIVED_DATA_PATH/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/upload-symbols -gsp enovcanik-ios/App/Production/GoogleService-Info.plist -p ios $CI_ARCHIVE_PATH/dSYMs/ else echo "This is a staging build." $CI_DERIVED_DATA_PATH/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/upload-symbols -gsp enovcanik-ios/App/Staging/GoogleService-Info.plist -p ios $CI_ARCHIVE_PATH/dSYMs/ fi else echo "Archive path isn't available. Unable to run dSYMs uploading script." fi
解决方案
确认dSYM文件包含正确版本信息:dSYM的版本信息来自编译时的
CFBundleVersion和CFBundleShortVersionString,检查Xcode项目对应Target的Info.plist是否正确配置这两个字段,同时在Xcode Cloud构建日志中搜索这两个字段,确认编译产物携带了正确的版本号。修复脚本路径问题:脚本中
cd ..的目录切换可能导致-gsp参数的相对路径失效,建议改用基于CI_PROJECT_DIR(Xcode Cloud项目根目录环境变量)的绝对路径,比如把GoogleService-Info.plist的路径改为:$CI_PROJECT_DIR/enovcanik-ios/App/Production/GoogleService-Info.plist避免路径切换带来的文件找不到问题,确保
upload-symbols能正确关联App配置。验证dSYM的版本数据:上传前用
dwarfdump工具检查dSYM是否包含版本信息,执行以下命令:# 查看dSYM的UUID(用于和Firebase控制台匹配) dwarfdump --uuid $CI_ARCHIVE_PATH/dSYMs/*.dSYM # 检查是否包含CFBundleVersion信息 dwarfdump --debug-info $CI_ARCHIVE_PATH/dSYMs/*.dSYM | grep -A 2 -B 2 "CFBundleVersion"如果能输出版本号,说明dSYM本身没问题;若输出为空,需检查Xcode的Archive配置是否开启了正确生成dSYM的选项(Build Settings -> Debug Information Format设为DWARF with dSYM File)。
更新Firebase SDK版本:旧版本的
upload-symbols可能存在版本识别缺陷,将Firebase Crashlytics SDK升级到最新稳定版,确保使用的上传工具是最新的。等待崩溃上报匹配:如果App还没有向Firebase上报过对应版本的崩溃,dSYM的版本可能会显示“未知”,可以手动触发一次测试崩溃并上报,之后再查看控制台的dSYM版本状态。
内容的提问来源于stack exchange,提问作者mkrstic

