You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter无GoogleService-Info.plist时上传dSYM至Crashlytics方法

Flutter多Flavor场景iOS端Crashlytics dSYM常态化上传方案

适配Dart-only初始化Firebase、无需多份GoogleService-Info.plist的场景,不需要为每个flavor单独配置plist文件,单脚本即可覆盖所有环境。

多Flavor构建配置区分方案

不需要为3个flavor单独写3套上传脚本,单脚本加环境判断逻辑即可自动匹配对应Firebase项目,实现步骤如下:

  • 先确认Xcode中各flavor对应的构建配置标识:Flutter配置flavor后,会自动生成对应格式的Configuration,通常为Debug-xxx/Profile-xxx/Release-xxx(xxx为你的flavor名,比如dev/staging/prod),可以在Xcode Runner的Build Settings中搜索Configurations确认命名。
  • 在Runner的Build Phases中新增Run Script Phase,注意将该脚本的执行顺序调整到Embed Frameworks、Thin Binary两个Phase之后,不要勾选Run script only when installing选项。
  • 脚本内通过CONFIGURATION环境变量匹配当前构建的flavor,动态传入对应Firebase项目的参数,不需要本地存储多份GoogleService-Info.plist,脚本参考如下:
# Debug环境直接跳过上传,避免开发阶段无意义请求
if [[ "${CONFIGURATION}" == *Debug* ]]; then
  echo "Debug模式跳过Crashlytics dSYM上传"
  exit 0
fi

# 引入Crashlytics运行时
"${PODS_ROOT}/FirebaseCrashlytics/run"

# 根据当前构建配置匹配对应flavor的Firebase参数
case "$CONFIGURATION" in
  *-staging)
    # 替换为staging环境Firebase项目的App ID、对应包名
    FIREBASE_APP_ID="1:xxxxxxx:ios:xxxxxxx"
    BUNDLE_ID="com.xxx.app.staging"
    ;;
  *-dev)
    # 替换为dev环境Firebase项目的App ID、对应包名
    FIREBASE_APP_ID="1:xxxxxxx:ios:xxxxxxx"
    BUNDLE_ID="com.xxx.app.dev"
    ;;
  *-prod)
    # 替换为prod环境Firebase项目的App ID、对应包名
    FIREBASE_APP_ID="1:xxxxxxx:ios:xxxxxxx"
    BUNDLE_ID="com.xxx.app"
    ;;
esac

# 动态生成临时配置文件,调用上传脚本
"${PODS_ROOT}/FirebaseCrashlytics/upload-symbols" \
  -gsp <(echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
<plist version=\"1.0\">
<dict>
    <key>BUNDLE_ID</key>
    <string>${BUNDLE_ID}</string>
    <key>GOOGLE_APP_ID</key>
    <string>${FIREBASE_APP_ID}</string>
</dict>
</plist>") \
  -p ios \
  "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}"

如果你是通过创建多个Target区分flavor,把case的判断变量从CONFIGURATION换成TARGET_NAME即可,逻辑完全一致。

IntelliJ构建/运行时的上传触发规则

  • Build Phase的脚本属于Xcode构建流程的固定环节,不管你是从Xcode直接触发构建,还是在IntelliJ中执行flutter run/flutter build命令,只要走iOS原生编译流程,都会执行该脚本。
  • 上述脚本已经加了Debug环境拦截逻辑,日常开发时在IntelliJ中用Debug模式运行应用,会直接跳过上传步骤,不会产生额外耗时,也不会把开发阶段的调试符号上传到线上Crashlytics后台。
  • 只有当你执行Profile/Release模式的构建(包括本地打测试包、CI/CD打正式包、flutter build ipa指定flavor输出安装包)时,脚本才会自动匹配对应flavor的Firebase配置,完成dSYM上传,不需要手动操作。

内容的提问来源于stack exchange,提问作者valley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:06:36