📌 はじめに
Flutter アプリに Firebase を導入し、開発環境(staging)と本番環境(production)を分ける ための手順を備忘も兼ねてまとめました。
内容
- Firebase を staging(開発用)と production(本番用)に分ける
-
flutterfire_cli
を使用した Firebase 設定 -
GoogleService-Info
の環境ごとの管理 - 実機ビルド手順
1️⃣ Firebase プロジェクトの作成
Firebase で staging(開発用)と production(本番用)を分けるため、2 つの Firebase プロジェクト を作成します。
環境 | Firebase プロジェクト ID |
---|---|
開発環境 | {任意の文字列}-staging |
本番環境 | {任意の文字列}-production |
※APP名-stagingなど分かりやすいプロジェクト名が望ましいです。
2️⃣ flutterfire_cli
のインストール
Flutter アプリと Firebase を連携するために、flutterfire_cli
を使用します。
dart pub global activate flutterfire_cli
パスが通っていない場合は、.zshrc
/ .bashrc
に以下を追加して適用
export PATH="$PATH":"$HOME/.pub-cache/bin"
source ~/.zshrc # または source ~/.bashrc
3️⃣ Firebase 設定ファイルの生成
Firebase の GoogleService-Info.plist
、google-services.json
、firebase_options.dart
を 環境ごとに生成 し、同時にFirebaseプロジェクトにアプリを登録します。
各設定ファイルの役割は下記です。
ファイル | 役割 | 使われる場所 | プラットフォーム |
---|---|---|---|
GoogleService-Info.plist |
iOS 用 Firebase 設定 | iOS SDK (firebase_auth , firebase_core など) |
iOS |
google-services.json |
Android 用 Firebase 設定 | Android SDK (firebase_auth , firebase_core など) |
Android |
firebase_options.dart |
Flutter アプリの Firebase 設定 | Flutter (firebase_core ) |
Flutter 共通 |
📌 Staging 用(開発環境)
flutterfire configure --project={任意の文字列}-staging \
--out=lib/firebase_options_staging.dart \
--ios-bundle-id={任意のID}.staging \
--android-package-name={任意のID}.staging
開発環境用に下記の設定ファイルが作成されます。
ios/Runner/GoogleService-Info.plist
android/app/google-services.json
lib/firebase_options_staging.dart
そのまま続けて本番環境用のコマンドを実行するとgoogle-services.json
、GoogleService-Info.plist
が本番環境用に上書きされてしまうので、その前にiOSはstaging用としてリネーム、Androidはディレクトリを作成して移動します。
※firebase_options.dart
はコマンド実行時に開発環境用としてファイル名を指定しているので問題なし
mv ios/Runner/GoogleService-Info.plist ios/Runner/GoogleService-Info-staging.plist
mkdir android/app/src/staging
mv android/app/google-services.json android/app/src/staging/google-services.json
📌 Production 用(本番環境)
flutterfire configure --project={任意の文字列}-production \
--out=lib/firebase_options_production.dart \
--ios-bundle-id={任意のID} \
--android-package-name={任意のID}
本番環境用に下記の設定ファイルが作成されます。
ios/Runner/GoogleService-Info.plist
android/app/google-services.json
lib/firebase_options_production.dart
iOSはproduction用としてリネーム、Androidはディレクトリを作成して移動します
mv ios/Runner/GoogleService-Info.plist ios/Runner/GoogleService-Info-production.plist
mkdir android/app/src/production
mv android/app/google-services.json android/app/src/production/google-services.json
Tips:
設定ファイルを別環境のもので上書きしてしまった場合でも、Firebaseコンソール上から直接ダウンロードすることが可能です。または、もう一度コマンドを実行すれば再生成されます。
1.Firebaseコンソール にアクセス。
2.Firebase にログインし、対象のプロジェクトを開く。
3.左側のナビゲーションメニューから「⚙️ プロジェクトの設定」をクリック。
4.「アプリの設定」セクションに移動。
5.該当のアプリを選択。
6.「GoogleService-Info.plist をダウンロード」ボタンをクリック。
4️⃣ GoogleService-Info.plist
の管理(iOS)
iOS では GoogleService-Info.plist
を環境ごとに適用する必要があります。
📌 Info.plist
に以下を追加
Xcodeを起動し、Info.plistを開くか、XMLに直接記載します。
Xcode を開く
open ios/Runner.xcworkspace
Info.plistに下記を追記
<key>GoogleService-Info</key>
<string>GoogleService-Info-$(CONFIGURATION).plist</string>
📌 Build Configuration
を設定
stagingでは「GoogleService-Info-staging.plist」、Productionでは「GoogleService-Info-production.plist」が使われるように設定をしていきます。
RunnerのConfigurationの左下の「+」をクリックし、「Duplicate "Debug" Configuration」でコピーし、「Staging」として保存します。
Configurationの左下の「+」をクリックし、「Duplicate "Release" Configuration」でコピーし、「Production」として保存します。
最終的には下記のようになります。
5️⃣ google-services.json
の管理(Android)
Android では google-services.json
を環境ごとに適用するため、フレーバー設定を行います。
📌 android/app/build.gradle
を編集
androidの下にフレーバー設定を追加します。
android {
flavorDimensions "default"
productFlavors {
staging {
applicationId "{任意のID}.staging"
}
production {
applicationId "{任意のID}"
}
}
}
6️⃣ Firebase の初期化
Firebase の環境を firebase_options_staging.dart(開発環境用)と
firebase_options_production.dart(本番環境用)で切り替えられるように設定します。
📌 main.dart
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options_staging.dart' as staging;
import 'firebase_options_production.dart' as prod;
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 🔹 環境(開発・本番)を判定
bool isProduction =
const bool.fromEnvironment('PRODUCTION', defaultValue: false);
// 🔹 Firebase の初期化(開発用 / 本番用の設定を適用)
await Firebase.initializeApp(
options: isProduction
? prod.DefaultFirebaseOptions.currentPlatform // 本番環境のFirebase設定
: staging.DefaultFirebaseOptions.currentPlatform, // 開発環境のFirebase設定
);
runApp(MyApp());
}
7️⃣ 実機ビルドの準備
📌 iPhone 実機を認識
Xcodeでプロジェクトを開くか下記コマンドを実行
open ios/Runner.xcworkspace
-
Runner
を選択 →Signing & Capabilities
タブ -
Team
を設定(Apple ID を登録) - 開発用プロビジョニングプロファイル を設定
📌 Android 実機を認識
- 端末のUSBデバッグ を有効にする
- 実機の 設定 → 端末情報 → ビルド番号を7回タップ(開発者オプションを有効化)
- 開発者オプション から USBデバッグ を有効にする
8️⃣ Debug で実機ビルド
端末に開発アプリをインストールするためのコマンドは下記です。
🔹 iOS
開発環境(Staging)
flutter run --dart-define=PRODUCTION=false
本番環境(Production)
flutter run --dart-define=PRODUCTION=true
🔹 Android
開発環境(Staging)
flutter run --flavor staging --dart-define=PRODUCTION=false
本番環境(Production)
flutter run --flavor production --dart-define=PRODUCTION=true
9️⃣ Release ビルド & インストール
🔹 iOS
実機に Release ビルドをインストール
開発環境(Staging)
flutter build ios --dart-define=PRODUCTION=false --release
flutter install
本番環境(Production)
flutter build ios --dart-define=PRODUCTION=true --release
flutter install
TestFlight / App Store にアップロードする場合
flutter build ipa --dart-define=PRODUCTION=true --release
Xcode で Product
→ Archive
を実行し、TestFlight にアップロード。
※ipaファイルはbuild/ios/ipa/Runner.ipa
にあります。
🔹 Android
実機に Release ビルドをインストール
開発環境(Staging)
flutter build apk --flavor staging --dart-define=PRODUCTION=false --release
adb install android/app/build/outputs/apk/staging/release/app-staging-release.apk
本番環境(Production)
flutter build apk --flavor production --dart-define=PRODUCTION=true --release
adb install android/app/build/outputs/apk/production/release/app-production-release.apk
Play Store にアップロードする場合
flutter build appbundle --flavor production --dart-define=PRODUCTION=true --release
📌 作成された aab
ファイルの保存場所
android/app/build/outputs/bundle/productionRelease/app-production-release.aab
📌 Staging 用の aab
ファイル(内部テスト用)
android/app/build/outputs/bundle/stagingRelease/app-staging-release.aab
コマンドまとめ
📌 コマンド一覧
ビルド目的 | ビルドモード | 環境 | Android コマンド | iOS コマンド |
---|---|---|---|---|
開発用デバッグ(Staging) | Debug | Staging | flutter run --flavor staging --dart-define=PRODUCTION=false |
flutter run --dart-define=PRODUCTION=false |
本番環境デバッグ(Production) | Debug | Production | flutter run --flavor production --dart-define=PRODUCTION=true |
flutter run --dart-define=PRODUCTION=true |
社内テスト・内部テスト(Staging) | Release | Staging | flutter build apk --flavor staging --dart-define=PRODUCTION=false --release |
flutter build ios --dart-define=PRODUCTION=false |
本番リリース(Production) | Release | Production | flutter build apk --flavor production --dart-define=PRODUCTION=true --release |
flutter build ios --dart-define=PRODUCTION=true |
Google Play 内部テスト用(Staging) | Release | Staging | flutter build appbundle --flavor staging --dart-define=PRODUCTION=false --release |
N/A |
Google Play 本番公開用(Production) | Release | Production | flutter build appbundle --flavor production --dart-define=PRODUCTION=true --release |
N/A |
App Store / TestFlight アップロード(Staging) | Release | Staging | N/A | flutter build ipa --dart-define=PRODUCTION=false --release |
App Store / TestFlight アップロード(Production) | Release | Production | N/A | flutter build ipa --dart-define=PRODUCTION=true --release |
補足
📌 1️⃣ Debug(デバッグ)と Release(リリース)の違い
これは Flutter のビルドモード であり、アプリの最適化レベルやデバッグ機能の有無 を決めます。
モード | 目的 | 特徴 | 主な用途 |
---|---|---|---|
Debug | 開発・デバッグ用 | - ホットリロードが可能 - assert() が動作- 開発ツール(DevTools)が利用可能 - 最適化されていないので動作が遅い |
- 開発時の動作確認 - デバッグ作業 |
Release | 本番リリース用 | - 最適化されており動作が速い - assert() は無効- デバッグ情報なし(クラッシュログが少なくなる) - アプリサイズが小さくなる |
- 本番環境のビルド - Google Play / App Store にアップロード |
📌 ポイント
-
flutter run
のデフォルトは Debug モード。 -
flutter build apk / ios / appbundle
のデフォルトは Release モード。 -
--release
を付けると Release ビルドになる。
📌 2️⃣ Staging(開発環境)と Production(本番環境)の違い
これは アプリが接続する Firebase や API サーバーの違い です。
環境 | 目的 | 特徴 | 主な用途 |
---|---|---|---|
Staging | 開発・テスト用 | - Firebase / API も開発用の環境を使用 - 開発チームやテスターが使用 - Google Play 内部テストや TestFlight に配布可能 |
- 社内テスト・QAテスト - ストア公開前の最終チェック |
Production | 本番リリース用 | - 一般ユーザーが使用する環境 - Firebase / API も本番用を使用 - 本番リリース版 |
- ユーザーに提供するアプリ - Google Play / App Store への公開 |
📌 ポイント
- Staging は開発チームやテスター向けの環境(本番と同じ設定で動作確認)。
- Production は一般ユーザー向けの環境(本番用 Firebase / API を使用)。
- Staging と Production で Firebase や API のエンドポイントを切り替えることが重要。
📌 3️⃣ Debug / Release × Staging / Production の組み合わせ
Flutter では 「ビルドモード(Debug / Release)」と「環境(Staging / Production)」を組み合わせて使う のが一般的です。
目的 | ビルドモード | 環境 | 用途 |
---|---|---|---|
開発中にデバッグ | Debug | Staging | ホットリロードしながら開発 |
本番リリース前のテスト | Release | Staging | ストアにアップロードする前の動作確認 |
ユーザー向け本番リリース | Release | Production | Google Play / App Store に公開 |
📌 例
-
開発時:
flutter run --flavor staging --dart-define=PRODUCTION=false
-
本番ビルド時:
flutter build appbundle --flavor production --dart-define=PRODUCTION=true --release