Flutterで開発環境、本番環境の切り替え(iOS)

2020-10-01
プログラミング

前提

## ローカル開発環境
$ flutter run --debug --flavor dev --dart-define=app.flavor=dev

## 開発環境ビルド(テスト配布用)
## 以下のコマンドを叩いたあと、Xcode上でSchemwをdevにして、Archive
$ flutter build ios --release --no-codesign --flavor dev --dart-define=app.flavor=dev

## 本番環境ビルド
## 以下のコマンドを叩いたあと、Xcode上ででSchemwをprodにして、Archive
$ flutter build ios --release --no-codesign --flavor prod --dart-define=app.flavor=prod

上記のコマンドで各環境を切り替えるようにする

  • --flavor で schemaを切り替える
  • --debug--release でConfigurationsの名前を切り替える
  • --dart-define=app.flavor でFlutter内のコードを切り替える

方法(iOS側の設定)

– Runner.xcworkspaceをXcodeで開いて、以下の作業を行う。

Configurationsの追加

  • Debug-devはDebugをコピーし、Release-dev, Release-prodはReleaseをコピーするようにする
  • Debug, Release が接頭に対応。--flavor で設定する値が接尾になるように設定
  • Configuration Fileは、Flutter配下の*.xcconfigを読み取る

shcemeを追加

  • New Schemaを選択し、Targetを「Runner」に設定し、dev, prodを作成する。
  • Manage Schemesで「Runner」を削除する
  • Edit SchemeでBuild Configurationを設定する
  • dev scheme => Debug-devが基本。ArchiveのみRelease-dev
  • prod => Release-dev

info.plistとBuild Settings

  • Build SettingsでUser-Defined Settingを追加する。
  • APP_DISPLAY_NAMEで追加し、アプリの表示名を変更する
  • info.plistで開発環境、本番環境で分けたいものがある場合は、ここで定義
  • Product Bundle Identifierの変更(Debug-dev, Release-devの接尾に.devをつける)
  • info.plistのCFBundleDisplayNameを変更
  • 開発環境、本番環境で分けたいものがある場合は、変数に変更
 	<key>CFBundleDisplayName</key>
	<string>$(APP_DISPLAY_NAME)</string> <= 変更

GoogleService-info.plistの各環境の切り替え

  • 以下の階層でフォルダ、ファイルを作成し、Xcodeでフォルダを追加
  • Build PhasesでRun Scriptを追加
  • 名前を「Copy GoogleService-info.plist」に変更
  • Copy Bundle Resourcesの上に移動させて、以下のコードを登録
  • Copy Bundle ResourcesにGoogleService-info.plistが存在すれば、削除しておく
environment=""

if [[ $CONFIGURATION =~ -([^-]*)$ ]]; then
environment=${BASH_REMATCH[1]}
fi

GOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist
GOOGLESERVICE_INFO_FILE=${PROJECT_DIR}/config/${environment}/${GOOGLESERVICE_INFO_PLIST}

if [ ! -f $GOOGLESERVICE_INFO_FILE ]
then
echo "No GoogleService-Info.plist found."
exit 1
fi

PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app

cp "${GOOGLESERVICE_INFO_FILE}" "${PLIST_DESTINATION}"

方法(Flutter側での切り替え)

--dart-define が以下のコード取得できるので、環境ごとに変更することが可能

const flavor = String.fromEnvironment('app.flavor');
if (flavor == 'dev') {
    ...
} else {
    ...
}