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
相关产品推荐
相关产品推荐

