# 実行
$ flutter run --dart-define-from-file=dart_defines/$(FLAVOR).json
or
$ flutter run --dart-define=FLAVOR=$(FLAVOR)
# アプリビルドコマンドの例
# --release つけると release でビルドできる
flutter build ios --dart-define-from-file=dart_defines/dev.env
ios/GoogleService-Info.plist
ios/Firebase/devGoogleService-Info.plist
ios/Firebase/sthGoogleService-Info.plist
ios/Firebase/prdGoogleService-Info.plist
android/app/src/firebase/dev-google-services.json
android/app/src/firebase/stg-google-services.json
android/app/src/firebase/prd-google-services.json
ルートディレクトリに dart_definesというフォルダを作成しflavorの設定を追加
# ex
{
"flavor": "dev",
"appIdSuffix": "com.example.YOURAPPNAME.FLAVOR",
}
下記の設定により ビルドがしやすくなる
{
"version": "0.2.0",
"configurations": [
{
"name": "dev",
"request": "launch",
"type": "dart",
"flutterMode": "debug",
"args": [
"--dart-define-from-file=dart_defines/dev.json"
]
},
{
"name": "stg",
"request": "launch",
"type": "dart",
"flutterMode": "debug",
"args": [
"--dart-define-from-file=dart_defines/stg.json"
]
},
{
"name": "prd",
"request": "launch",
"type": "dart",
"flutterMode": "release",
"args": [
"--dart-define-from-file=dart_defines/prd.json"
]
}
]
}
- dev.png
- stg.png
- prd.png
- flutter_launcher_icons-dev.yaml
- flutter_launcher_icons-stg.yaml
- flutter_launcher_icons-prd.yaml
flutter_icons:
android: true
ios: true
image_path: "assets/launcher_icons/$(FLAVOR).png"
dev_dependencies:
...
flutter_launcher_icons: ^0.13.1
flutter_icons:
android: true
ios: true
assets:
- ./assets/images/
- ./assets/launcher_icons/dev.png
- ./assets/launcher_icons/prd.png
- ./assets/launcher_icons/stg.png
$ flutter pub run flutter_launcher_icons:main
※ Runner.xcworkspaceを開く (水色の方 青の方(Runner.xcodeproj)は firebaseのimportエラーが出るので開かない)
Runner > Flutterにdev.xcconfigとprd.xcconfigを追加
# dev
FLAVOR=dev
APP_ID_PREFIX=.dev
# prd
FLAVOR=prd
APP_ID_PREFIX=
後ほど、シェルスクリプトで生成されるファイルの 依存を示す
#include "DartDefine.xcconfig"
flavor に応じて 上記で作成した.xcconfigの使用を切り替えるようにする
#/bin/bash
echo $DART_DEFINE | tr ',' '\n' | while read line;
do
echo $line | base64 -d | tr ',' '\n' | xargs -I@ bash -c "echo @ | grep 'FLAVOR' | sed 's/.*=//'"
echo $flavor
done | (
read flavor
echo "#include \"$flavor.xcconfig\"" > $SRCROOT/Flutter/DartDefine.xcconfig
)
$ chmod 755 ios/scripts/dart_define.sh
Edit Scheme > Build > Pre Acion > New Run Script Actionに以下を記載
sh "$SRCROOT/scripts/dart_define.sh"
Runner > Build Settingsを開き、Primary App Icon Set Nameを以下に書き換える
AppIcon-$(FLAVOR)
TARGETS > Runner > Build Settingsを開き、Product Bundle Identifierを以下に書き換える
$com.example.YOURAPPNAME$(APP_ID_PREFIX)
TARGETS > Runner > Infoを開き、Bundle display nameを以下に書き換える
YOURAPPNAME$(APP_ID_PREFIX)
※ 以下のように設定 別のcodeエディターからファイルが発見できないため
すべての 環境のものを格納
TARGETS/Runner/Build Phasesを開き、右上の+ボタンからNew Run Script Phaseを選択
cp -f ${SRCROOT}/Firebase/${FLAVOR}GoogleService-Info.plist ${SRCROOT}/GoogleService-Info.plist
ルートにGoogleService-InfoをfirebaseからDWして 毎回書き換えるためのファイルを置いておく。(なんの環境でもいい)
必要なflvorだけ用意
# plugins {...}の下
# 環境変数の定義
def dartEnvironmentVariables = project
.property('dart-defines')
.split(',')
.collectEntries {
new String(it.decodeBase64(), 'UTF-8')
.split(',')
.collectEntries {
def pair = it.split('=')
[(pair.first()): pair.last()]
}
}
# icon imagaのコピー
task copyIcons(type: Copy) {
from "src/${dartEnvironmentVariables.FLAVOR}/res"
into 'src/main/res'
}
# firebaseファイルから flavorのgoole-services.jsonを選択
task copyFirebaseSource(type: Copy) {
from "src/firebase/${dartEnvironmentVariables.FLAVOR}-google-services.json"
into './'
rename { String fileName ->
fileName = "google-services.json"
}
}
tasks.whenTaskAdded {
it.dependsOn copyFirebaseSource
it.dependsOn copyIcons
}
defaultConfig {
applicationId "com.example.YOURAPPNAME"
minSdkVersion 26
targetSdkVersion 30
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
if(dartEnvironmentVariables.FLAVOR == 'dev') {
applicationIdSuffix ".dev"
manifestPlaceholders += [appNamePrefix:".dev"]
} else if(dartEnvironmentVariables.FLAVOR == 'stg') {
applicationIdSuffix ".stg"
manifestPlaceholders += [appNamePrefix:".stg"]
} else if(dartEnvironmentVariables.FLAVOR == 'prd') {
applicationIdSuffix ""
manifestPlaceholders += [appNamePrefix:""]
} else {
print("error:Flavor not found")
}
}
android/app/src/main/AndroidManifest.xmlの以下に設定を変える
<application
android:label="YOURAPPNAME${appNamePrefix}"