🔥
【SwiftUI × Firebase】開発環境・本番環境を完全分離する実装ガイド
はじめに
iOSアプリ開発でFirebaseを利用する際、こんな経験はありませんか?
- 開発中のテストデータが本番環境に混入してしまった
- 本番APIキーを開発中に使ってしまった
- デバッグ時に本番データを誤って削除してしまった
本記事では、同一デバイス上で開発版と本番版を別アプリとして同時に動作させ、完全に環境を分離する方法を実践的に解説します。
この記事で実現できること
✅ 開発版・本番版を同一デバイスに同時インストール
✅ アプリ名・アイコンで視覚的に区別(例: "MyApp DEV" / "MyApp")
✅ Firebase接続先の自動切り替え
✅ 本番データへの誤操作を完全防止
想定読者
- SwiftUIでiOSアプリを開発している方
- Firebaseを利用したバックエンド連携を実装中の方
- 開発環境と本番環境の分離方法を知りたい方
- Xcodeのビルド設定をより深く理解したい方
実装の全体像
環境分離を実現するために、以下の3つの要素を組み合わせます:
- Firebase側: 開発用・本番用プロジェクトの分離
- Xcode側: xcconfigファイルによるビルド設定の分岐
- コード側: コンパイル条件によるplistファイルの動的読み込み
Part 1: Firebaseプロジェクトの設定
1-1. Firebaseプロジェクトの作成
- Firebase Consoleにアクセス
- 「プロジェクトを追加」をクリック
- 本番環境用のプロジェクトを作成する。名称:
prod-myapp(任意の名前) - 開発環境用のプロジェクトを作成する。名称:
dev-myapp(任意の名前)
1-2. 各プロジェクトにiOSアプリを登録
本番用プロジェクトの設定
- Firebaseコンソールで本番用プロジェクトを開く
- プロジェクト概要画面で「アプリを追加」→ iOSアイコンをクリック
- 以下の情報を入力:
-
Apple バンドルID:
com.example.myapp -
アプリのニックネーム:
MyApp(任意)
-
Apple バンドルID:
- 「アプリを登録」をクリック
- GoogleService-Info.plistをダウンロード
- ダウンロードしたファイルを
GoogleService-Info-release.plistにリネーム - プロジェクトルートディレクトリに配置
開発用プロジェクトの設定
- Firebaseコンソールで開発用プロジェクトを開く
- プロジェクト概要画面で「アプリを追加」→ iOSアイコンをクリック
- 以下の情報を入力:
-
Apple バンドルID:
com.example.myapp.debug -
アプリのニックネーム:
MyApp DEV(任意)
-
Apple バンドルID:
- 「アプリを登録」をクリック
- GoogleService-Info.plistをダウンロード
- ダウンロードしたファイルを
GoogleService-Info-debug.plistにリネーム - プロジェクトルートディレクトリに配置
ファイル配置確認
プロジェクトルートに以下のファイルが配置されているか確認:
/your-project-root/
├── GoogleService-Info-debug.plist # 開発用
└── GoogleService-Info-release.plist # 本番用
Part 2: Xcodeプロジェクトの設定
2-1. xcconfigファイルの作成
xcconfigファイルは、ビルド設定を環境別に管理するための設定ファイルです。
Debug.xcconfig を作成
- Xcodeでプロジェクトを開く
- File → New → File...
- 「Configuration Settings File」を選択
- ファイル名:
Debug.xcconfig - 保存場所: プロジェクトルート
- 以下の内容を記述:
Debug.xcconfig
// Bundle ID設定
PRODUCT_BUNDLE_IDENTIFIER = com.example.myapp.debug
// アプリ表示名
DISPLAY_NAME = MyApp DEV
// コンパイル条件
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG
Release.xcconfig を作成
- File → New → File...
- 「Configuration Settings File」を選択
- ファイル名:
Release.xcconfig - 保存場所: プロジェクトルート
- 以下の内容を記述:
Release.xcconfig
// Bundle ID設定
PRODUCT_BUNDLE_IDENTIFIER = com.example.myapp
// アプリ表示名
DISPLAY_NAME = MyApp
// 最適化設定
SWIFT_OPTIMIZATION_LEVEL = -O
2-2. Configurationsへxcconfigファイルを適用
- Xcodeのプロジェクトナビゲーターでプロジェクトファイル(青いアイコン)を選択
- PROJECT → プロジェクト名 を選択
- 「Info」タブを選択
- 「Configurations」セクションを展開
- 各Configurationにxcconfigファイルを設定:
-
Debug:
Debug.xcconfigを選択 -
Release:
Release.xcconfigを選択
-
Debug:
2-3. Target Build Settingsの確認・修正
- Xcodeのプロジェクトナビゲーターでプロジェクトファイルを選択
- TARGETS → アプリ名 を選択
- 「Build Settings」タブを選択
- 検索ボックスで以下を検索し、設定を確認:
Product Bundle Identifier
- 検索:
PRODUCT_BUNDLE_IDENTIFIER - 値が
$(PRODUCT_BUNDLE_IDENTIFIER)になっているか確認 - なっていない場合は手動で
$(PRODUCT_BUNDLE_IDENTIFIER)に変更
Product Name
- 検索:
PRODUCT_NAME - デフォルトのまま
$(TARGET_NAME)でOK
2-4. Info.plistにDisplay Name設定を追加
- TARGETS → アプリ名 → 「Info」タブを選択
- 「Custom iOS Target Properties」セクションを確認
-
Bundle display nameキーを探す-
存在する場合: 値を
$(DISPLAY_NAME)に変更 -
存在しない場合:
- 「+」ボタンをクリック
- Key:
Bundle display name - Type:
String - Value:
$(DISPLAY_NAME)
-
存在する場合: 値を
これにより、ホーム画面に表示されるアプリ名が環境別に変わります:
- Debug: MyApp DEV
- Release: MyApp
2-5. GoogleService-Info.plistファイルをプロジェクトに追加
両plistファイルをプロジェクトに追加
- Xcodeのプロジェクトナビゲーターで右クリック
- 「Add Files to "プロジェクト名"...」を選択
-
GoogleService-Info-debug.plistを選択 - オプション設定:
- ✅ Copy items if needed: チェックを外す(既にプロジェクトルートにあるため)
- ✅ Add to targets: アプリ名にチェックを入れる
- 「Add」をクリック
同様の手順で GoogleService-Info-release.plist も追加します。
Build Phasesでのリソース確認
- TARGETS → アプリ名 → 「Build Phases」タブを選択
- 「Copy Bundle Resources」セクションを展開
- 以下のファイルが含まれているか確認:
GoogleService-Info-debug.plistGoogleService-Info-release.plist
- 含まれていない場合:
- 「+」ボタンをクリック
- ファイルを選択して追加
2-6. Schemeの確認
Debug/Release Schemeの確認
- Xcode上部のSchemeセレクターをクリック
- 「Edit Scheme...」を選択
- 左側から「Run」を選択
- 「Info」タブで Build Configuration が
Debugになっているか確認 - 左側から「Archive」を選択
-
Build Configuration が
Releaseになっているか確認
Part 3: コード実装
3-1. Firebase初期化コードの実装
AppDelegate.swift または App.swift で、環境別にplistファイルを読み込むコードを実装します。
MyApp.swift
import SwiftUI
import FirebaseCore
@main
struct MyApp: App {
init() {
configureFirebase()
}
var body: some Scene {
WindowGroup {
ContentView()
}
}
private func configureFirebase() {
let resorcePath = getResorcePath()
if let path = Bundle.main.path(forResource: resorcePath, ofType: "plist"),
let options = FirebaseOptions(contentsOfFile: path) {
FirebaseApp.configure(options: options)
} else {
FirebaseApp.configure()
}
}
private func getResorcePath() -> String {
#if DEBUG
return "GoogleService-Info-debug"
#else
return "GoogleService-Info-release"
#endif
}
}
3-2. アイコン差別化(オプション)
開発版と本番版を視覚的に区別しやすくするため、アイコンを差別化できます。
-
Assets.xcassetsを開く - 既存の
AppIconを右クリック → Duplicate - 新しいアイコンセットの名前を
AppIcon-Debugに変更 - 開発版アイコンに「DEV」バッジや色付きオーバーレイを追加
- Build Settings → Asset Catalog Compiler → Primary App Icon Set Name:
- Debug:
AppIcon-Debug - Release:
AppIcon
- Debug:
これにより、ホーム画面で一目で開発版と本番版を区別できます。
ビルド
Xcodeのschame設定を切り替えるだけでFirebaseの接続先を変更できるようになりました!
Discussion