Flutter で Firebase Auth を利用したアプリ開発をしているときに、環境分けを試みたらえらくハマったので解決に至るまでの記録を残しておく。
まず、環境別に Firebase も用意することになるので、今までだと GoogleService-Info.plist や google-service.json をそれぞれの Firebase Project から DL して、環境別に切り替えるということが必要でったが、最近はそれが不要になったと読んだので、そちらでチャレンジしてみた。
Dart コードのみで環境分けにチャレンジ
最初に参考にしたのはこちらの記事
【Flutter】flutterfire_cli を使って Dart コードのみで環境分けする
説明にある通りうまく環境分けが行えたのだが、iOS シミュレーターでテストしようとすると、GoogleService-Info.plist が無いと言われる。
結果的にわかったことは、Firebase Auth で利用しようとしている Google Sign-in プラグインは Dart コードのみの初期化に未対応ということ。
google_sign_in plugin currently doesn't support dart-only initialization and for mean time, you'll need to fallback on manual installation.
ということで、ここは一旦 Dart コードのみでの環境分けは諦めて、素直に plist や json をそれぞれ用意する方法に変更する。
環境分け
次に参考にしたのはこちら。
flutterでスマホアプリ開発するときに必ずやってること
ただし、一度上述した DART コードのみの環境分けにチャレンジしたため、その際の環境が残っている状態だったので、xcode の Run Script を一部修正。
env=""
if [[ $CONFIGURATION =~ -([^-]*)$ ]]; then
env=${BASH_REMATCH[1]}
fi
if [ "${env}" == "dev" ]; then
cp -r "${PROJECT_DIR}/Runner/GoogleService-Info-dev.plist" "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app/GoogleService-Info.plist"
elif [ "${env}" == "prod" ]; then
cp -r "${PROJECT_DIR}/Runner/GoogleService-Info-prod.plist" "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app/GoogleService-Info.plist"
fi
/bin/sh "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build
一通りの設定が終わり、テストすると今度は以下のメッセージでクラッシュ。
“Your app is missing support for the following URL schemes: {REVERSED_CLIENT_ID}”
GoogleService-Info.plist
の中にある REVERSED_CLIENT_ID
を xcode の URL_Types
に指定する必要があることがわかるが、ここで問題。環境別にしているので、Google Sign-In のでべローパーガイド にある方法では、1つの環境にしか対応できない。
調べてみると、どうやら xcode で User-Defined setting
ができるので、これを使うやり方を発見。
Target -> Runner -> Build Settings -> + -> Add User-Defined settings
で、URL_SCHEME
を作成する。そうすると 各 Configuration ごとに値を設定できるので、
Debug-dev
Release-dev
に開発環境の Firebase への接続情報を持つ GoogleService-Info-dev.plist
の中の REVERSED_CLIENT_ID
を指定し、
Debug-prod
Release-prod
に本番環境の Firebase への接続情報を持つ GoogleService-Info-prod.plist
の中の REVERSED_CLIENT_ID
を指定。
これでひとまず、環境分けの環境が整った。。