FlutterFireで複数の環境を分けてCrashlyticsを設定する方法

はじめに

業務としてアプリ開発する時にinhouse版を作ったり、stage版、develop版を作ったりすることがあるかと思います。
その際にFirebaseプロジェクトを本番とstage版などで分けた場合に自分がやった方法を解説します。

firebase_options.dartの生成

まず、環境わけはできているという前提でFlutterFireを用いてFlutterアプリケーションをFirebaseに登録していきます。

flutterfire configure -p [FirebaseのプロジェクトID] -i [iOSのbundleId] -a [AndroidのapplicationId] -o lib/firebase/stg/firebase_options.dart

まず -p についてですが、なくても問題はありませんがたくさんFirebaseプロジェクトがあると探しづらいので指定しています。
そして -i, -a です。こちらを指定しない場合、各環境のIDのものがランダムでFirebaseに登録されてしまうので指定してください。
最後に -o です。こちらは生成される firebase_options.dart がどこに生成されるか指定できます。指定しない場合lib直下に作成され、複数環境があるので競合してしまい書き換えなどなってしまうので指定しておいた方がいいです。 firebase_options.dart という名前自体も変更できます。

各OSごとの設定

iOS

iOSでは GoogleServices-Info.plist , firebase_app_id_file.json が生成されます。どちらもファイル名指定がなかったので一つ生成ごとに名前を変えるかディレクトリを分けた方がいいです。
完了しましたら、 Build Phases にCrashlyticsに関するRunScriptがあるかと思います。以下に使用しているScriptを貼っておくので参考にしてみてください。

if [ "${CONFIGURATION}" == "Production" ] || [ "${CONFIGURATION}" == "Debug-Production" ] || [ "${CONFIGURATION}" == "Release-Production" ]; then
  echo "Upload symbols for PRODUCTION."
  cp "${PROJECT_DIR}/${PROJECT_NAME}/Resources/Firebase/Development/GoogleService-Info.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
  "$PODS_ROOT/FirebaseCrashlytics/upload-symbols" --flutter-project "$PROJECT_DIR/firebase_app_id_file.production.json"
elif [ "${CONFIGURATION}" == "Development" ] || [ "${CONFIGURATION}" == "Debug-Development" ] || [ "${CONFIGURATION}" == "Release-Development" ]; then
  echo "Upload symbols for DEVELOPMENT."
  cp "${PROJECT_DIR}/${PROJECT_NAME}/Resources/Firebase/Development/GoogleService-Info.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
  "$PODS_ROOT/FirebaseCrashlytics/upload-symbols" --flutter-project "$PROJECT_DIR/firebase_app_id_file.development.json"
elif [ "${CONFIGURATION}" == "Staging" ] || [ "${CONFIGURATION}" == "Debug-Staging" ] || [ "${CONFIGURATION}" == "Release-Staging" ]; then
  echo "Upload symbols for STAGING."
  cp "${PROJECT_DIR}/${PROJECT_NAME}/Resources/Firebase/Staging/GoogleService-Info.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
  "$PODS_ROOT/FirebaseCrashlytics/upload-symbols" --flutter-project "$PROJECT_DIR/firebase_app_id_file.staging.json"
else
  echo "unknown scheme! (scheme: ${CONFIGURATION})"
  return -1
fi

こちらでiOSの設定は以上です。

Android

iOSと同様に google-services.json が生成されるたびに android/app/{各環境のディレクトリ} に自分は入れました。
そして android/app/build.gradle

dependencies {
  // これ
  classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
}

android/build.gradle

apply plugin: 'com.google.firebase.crashlytics'

以上を追加してください
こちらでAndroidの設定は以上です。

実装

ディレクトリを分けた人は、main関数の方に書くFirebase.initializeAppに生成した firebase_options.dart を入れるために以下のようにインポートします。

import 'firebase/dev/firebase_options.dart' as dev;
import 'firebase/stg/firebase_options.dart' as stg;
import 'firebase/prod/firebase_options.dart' as prod;

あとは環境ごとにFirebaseOptionsを取得する関数を作成し、以下のように記述します

await Firebase.initializeApp(options: getFirebaseOptions(), name: AppName.getName());
await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(kReleaseMode);
FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError;

気をつけなければいけない点が一点あり、 Firebase.initializeApp() のnameを指定しない場合、どれだか判別できなくなりエラーとなってしまうので任意の値を入れてあげましょう。
以上でCrashlyticsの設定が完了したかと思います。

最後に

エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。募集にはありませんが、長期インターンも歓迎していますので、興味があれば連絡いただければと思います。

カジュアル面談はこちらになります! meety.net

募集職種一覧はこちらになります!(カジュアルからもOK) www.wantedly.com