Flutter+Firebase iOS端如何分离开发与生产环境数据库?
我之前刚好处理过类似的需求——Flutter项目要给iOS端配置Dev和Prod两套google-services.plist,和Android自动复制json的逻辑对齐。下面给你分享几个针对Flutter iOS项目的实用方案,都是我亲测有效的:
方案1:Xcode Scheme + 前置脚本自动替换
这是最接近Android多环境配置逻辑的方案,通过不同Scheme触发脚本复制对应环境的plist:
先整理文件结构
在项目根目录新建env文件夹,里面再分dev和prod子文件夹,分别放入对应环境的google-services.plist:your_flutter_project/ ├─ env/ │ ├─ dev/ │ │ └─ google-services.plist │ └─ prod/ │ └─ google-services.plist └─ ios/ └─ Runner/给Xcode添加前置脚本
打开iOS项目的Xcode工程,选中Runnertarget,切换到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的前面,确保脚本先执行再复制资源
- 点击左上角
创建对应的Scheme
在Xcode顶部菜单栏选择Product > Scheme > New Scheme,分别创建Dev和Prod两个Scheme,关联到Runner target。之后运行或打包时,选择对应的Scheme,脚本就会自动替换成对应的google-services.plist。
方案2:Flutter dart-define 参数控制脚本
如果不想创建多个Scheme,也可以用Flutter的--dart-define参数传递环境标识,让脚本根据参数复制文件:
同样先整理env文件夹的文件结构(和方案1一致)
修改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运行/打包时传递参数
启动项目时用:flutter run --dart-define=ENV=dev打包时用:
flutter build ios --dart-define=ENV=prod
方案3:用第三方包快速生成配置(flutter_flavorizr)
如果觉得手动配置麻烦,可以用flutter_flavorizr这个包自动帮你生成多环境配置,包括iOS的Scheme、脚本和plist替换逻辑:
安装依赖
在pubspec.yaml中添加:dev_dependencies: flutter_flavorizr: ^2.2.0执行
flutter pub get安装创建配置文件
在项目根目录新建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"自动生成配置
执行命令:flutter pub run flutter_flavorizr这个命令会自动帮你配置Xcode的Scheme、添加替换脚本,甚至修改Android的配置,完全对齐多环境需求。
注意事项
- 把
ios/Runner/google-services.plist加入.gitignore,只提交env文件夹里的两个配置文件,避免版本冲突 - 每次切换环境后,最好执行
flutter clean清理缓存,防止旧的plist文件残留 - 测试打包时,一定要确认当前Scheme或参数对应的环境是否正确,避免打错包
内容的提问来源于stack exchange,提问作者Alistair McIntyre

