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

Flutter+Firebase iOS端如何分离开发与生产环境数据库?

Flutter iOS 多环境配置 google-services.plist 方案

我之前刚好处理过类似的需求——Flutter项目要给iOS端配置Dev和Prod两套google-services.plist,和Android自动复制json的逻辑对齐。下面给你分享几个针对Flutter iOS项目的实用方案,都是我亲测有效的:

方案1:Xcode Scheme + 前置脚本自动替换

这是最接近Android多环境配置逻辑的方案,通过不同Scheme触发脚本复制对应环境的plist:

  1. 先整理文件结构
    在项目根目录新建env文件夹,里面再分dev和prod子文件夹,分别放入对应环境的google-services.plist:

    your_flutter_project/
    ├─ env/
    │  ├─ dev/
    │  │  └─ google-services.plist
    │  └─ prod/
    │     └─ google-services.plist
    └─ ios/
       └─ Runner/
    
  2. 给Xcode添加前置脚本
    打开iOS项目的Xcode工程,选中Runner target,切换到Build Phases标签:

    • 点击左上角+号,选择New Run Script Phase
    • 把默认的脚本内容替换成下面的代码:
      # 获取当前运行的Scheme名称
      SCHEME_NAME="${SCHEME_NAME}"
      
      # 定义源文件和目标文件路径
      DEV_PLIST="${SRCROOT}/../env/dev/google-services.plist"
      PROD_PLIST="${SRCROOT}/../env/prod/google-services.plist"
      TARGET_PLIST="${SRCROOT}/Runner/google-services.plist"
      
      # 根据Scheme复制对应环境的plist
      if [ "${SCHEME_NAME}" = "Dev" ]; then
          cp "${DEV_PLIST}" "${TARGET_PLIST}"
      elif [ "${SCHEME_NAME}" = "Prod" ]; then
          cp "${PROD_PLIST}" "${TARGET_PLIST}"
      fi
      
    • 把这个Run Script拖到[CP] Copy Pods Resources的前面,确保脚本先执行再复制资源
  3. 创建对应的Scheme
    在Xcode顶部菜单栏选择Product > Scheme > New Scheme,分别创建Dev和Prod两个Scheme,关联到Runner target。之后运行或打包时,选择对应的Scheme,脚本就会自动替换成对应的google-services.plist。

方案2:Flutter dart-define 参数控制脚本

如果不想创建多个Scheme,也可以用Flutter的--dart-define参数传递环境标识,让脚本根据参数复制文件:

  1. 同样先整理env文件夹的文件结构(和方案1一致)

  2. 修改Xcode的Run Script
    把方案1的脚本替换成下面的代码,它会读取Flutter传递的ENV参数:

    # 从Flutter的dart-define参数中提取环境标识
    ENV=$(echo "$OTHER_SWIFT_FLAGS" | grep -o 'ENV=[^ ]*' | cut -d'=' -f2)
    
    # 默认用prod环境,防止参数缺失
    if [ -z "$ENV" ]; then
        ENV="prod"
    fi
    
    # 复制对应环境的plist
    if [ "$ENV" = "dev" ]; then
        cp "${SRCROOT}/../env/dev/google-services.plist" "${SRCROOT}/Runner/google-services.plist"
    elif [ "$ENV" = "prod" ]; then
        cp "${SRCROOT}/../env/prod/google-services.plist" "${SRCROOT}/Runner/google-services.plist"
    fi
    
  3. 运行/打包时传递参数
    启动项目时用:

    flutter run --dart-define=ENV=dev
    

    打包时用:

    flutter build ios --dart-define=ENV=prod
    

方案3:用第三方包快速生成配置(flutter_flavorizr)

如果觉得手动配置麻烦,可以用flutter_flavorizr这个包自动帮你生成多环境配置,包括iOS的Scheme、脚本和plist替换逻辑:

  1. 安装依赖
    在pubspec.yaml中添加:

    dev_dependencies:
      flutter_flavorizr: ^2.2.0
    

    执行flutter pub get安装

  2. 创建配置文件
    在项目根目录新建flavorizr.yaml,内容示例:

    flavors:
      dev:
        app:
          name: "MyApp Dev"
        firebase:
          googleServicesFile: "env/dev/google-services.plist"
      prod:
        app:
          name: "MyApp"
        firebase:
          googleServicesFile: "env/prod/google-services.plist"
    
  3. 自动生成配置
    执行命令:

    flutter pub run flutter_flavorizr
    

    这个命令会自动帮你配置Xcode的Scheme、添加替换脚本,甚至修改Android的配置,完全对齐多环境需求。

注意事项

  • 把ios/Runner/google-services.plist加入.gitignore,只提交env文件夹里的两个配置文件,避免版本冲突
  • 每次切换环境后,最好执行flutter clean清理缓存,防止旧的plist文件残留
  • 测试打包时,一定要确认当前Scheme或参数对应的环境是否正确,避免打错包

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:56:21