このページでは、アプリで複数の Firebase プロジェクトを使用する方法について説明します。
多くのアプリは、単一の Firebase プロジェクトと、スタートガイドに記載されているデフォルトの設定のみで対応可能です。複数の Firebase プロジェクトを使用すると便利なのは次のような場合です。
- ビルドタイプやターゲットに基づいて異なる Firebase プロジェクトを使用するように開発環境をセットアップする。
- アプリで複数の Firebase プロジェクトからコンテンツにアクセスする。
異なる環境をサポートする
一般的な利用方法の 1 つとして、開発環境と本番環境それぞれに個別の Firebase プロジェクトが用意されている場合が考えられます。
ウェブ SDK と Admin SDK を構成するには、その初期化関数に値を直接渡します。こうした SDK では、ランタイム チェックを使用して、開発または本番用の構成変数を選択できます。
Android と iOS(および、その Unity ラッパーと C++ ラッパー)は、通常、構成ファイル(iOS の場合は GoogleService-Info.plist、Android の場合は google-services.json)から構成を読み込みます。こうしたファイルは、Firebase アプリケーション オブジェクト(FIRApp または FirebaseApp)によって参照されるオプション オブジェクト(FIROption または FirebaseOptions)に読み込まれます。
こうしたプラットフォームでの環境の切り換えは、通常、環境ごとにさまざまな構成ファイルを使用して、ビルド時の決定事項として実装されます。
iOS アプリケーションで複数の環境をサポートする
デフォルトでは、FirebaseApp.configure() は、アプリケーションにバンドルされている GoogleService-Info.plist ファイルを読み込みます。開発環境と本番環境が XCode で別々のターゲットとして構成されている場合は、次のことができます。
- 両方の
GoogleService-Info.plistファイルをダウンロードする - 2 つのファイルを別々のディレクトリに保存する
- 両方を XCode プロジェクトに追加する
- ターゲット メンバーパネルを使用して、さまざまなファイルをさまざまなターゲットに関連付ける

ビルドが単一のターゲットの一部である場合、最適なオプションは、両方の構成ファイルに一意の名前を付けることです(例: GoogleService-Info-Free.plist と GoogleService-Info-Paid.plist)。実行時にどちらの plist を読み込むかを選択します。この例を次に示します。
// Load a named file.
let filePath = Bundle.main.path(forResource: "MyGoogleService", ofType: "plist")
guard let fileopts = FirebaseOptions(contentsOfFile: filePath!)
else { assert(false, "Couldn't load config file") }
FirebaseApp.configure(options: fileopts)
Android アプリケーションで複数の環境をサポートする
Android では、google-service.json ファイルは Google サービス Gradle プラグインによって Android 文字列リソースに対して処理されます。作成されるリソースについては、Google サービス プラグインに関するドキュメントの JSON ファイルを処理するをご覧ください。
さまざまなビルド バリエーションに対して複数の google-services.json ファイルを設定するには、アプリ モジュールのルートの下に各バリエーションの名前を付けた専用のディレクトリを作成して、そこに google-services.json ファイルを配置します。たとえば、"development" および "release" ビルド フレーバーがある場合、構成を次のように編成できます。
app/
google-services.json
src/development/google-services.json
src/release/google-services.json
...
詳しくは、Google サービス プラグインに関するドキュメントの JSON ファイルを追加するをご覧ください。
その後、これらのリソースは FirebaseInitProvider によって読み込まれます。このプロバイダはアプリケーション コードの前に実行され、それらの値を使用して Firebase API を初期化します。
このプロバイダは、既知の名前を持つリソースを読み取っているだけなので、Google サービス Gradle プラグインを使用するのではなく、文字列リソースをアプリに直接追加することもできます。方法は以下のとおりです。
google-servicesプラグインをルートbuild.gradleから削除するgoogle-services.jsonをプロジェクトから削除する- 文字列リソースを直接追加する
apply plugin: 'com.google.gms.google-services'をアプリbuild.gradleから削除する
アプリケーションで複数のプロジェクトを使用する
同じ API を使ってさまざまなプロジェクトにアクセスしなければならないことがあります。たとえば、複数のデータベース インスタンスにアクセスする場合などです。ほとんどの場合、Firebase アプリケーション オブジェクトが中央に配置されており、このオブジェクトが、すべての Firebase API の設定を一元管理しています。このオブジェクトは、標準設定の一環として初期化されます。しかし、1 つのアプリケーションから複数のプロジェクトにアクセスしたい場合は、各 Firebase アプリケーション オブジェクトが個別にプロジェクトを参照する必要があります。こうした他のインスタンスを初期化するかどうかは、ユーザー次第です。
いずれの場合も、Firebase アプリケーションの構成データを保持するために、最初に Firebase オプション オブジェクトを作成する必要があります。オプションの詳細については、API リファレンスに関するドキュメントで次のクラスをご覧ください。
- iOS:
FirebaseOptions(googleAppID:gcmSenderID:) - Android:
FirebaseOptions.Builder - ウェブ:
firebase.initializeApp - C++:
firebase::App::Create - Unity:
FirebaseApp.Create - Node.js:
admin.initializeApp - Java:
FirebaseOptions.Builder
次の例では、こうしたクラスを使用して、アプリケーションで複数のプロジェクトをサポートします。
iOS
// Configure with manual options. let secondaryOptions = FirebaseOptions(googleAppID: "1:27992087142:ios:2a4732a34787067a", gcmSenderID: "27992087142") secondaryOptions.bundleID = "com.google.firebase.devrel.FiroptionConfiguration" secondaryOptions.apiKey = "AIzaSyBicqfAZPvMgC7NZkjayUEsrepxuXzZDsk" secondaryOptions.clientID = "27992087142-ola6qe637ulk8780vl8mo5vogegkm23n.apps.googleusercontent.com" secondaryOptions.databaseURL = "https://myproject.firebaseio.com" secondaryOptions.storageBucket = "myproject.appspot.com"
Java
Android
// Manually configure Firebase Options
FirebaseOptions options = new FirebaseOptions.Builder()
.setApplicationId("1:27992087142:android:ce3b6448250083d1") // Required for Analytics.
.setApiKey("AIzaSyADUe90ULnQDuGShD9W23RDP0xmeDc6Mvw") // Required for Auth.
.setDatabaseUrl("https://myproject.firebaseio.com") // Required for RTDB.
.build(); Kotlin
Android
// Manually configure Firebase Options
val options = FirebaseOptions.Builder()
.setApplicationId("1:27992087142:android:ce3b6448250083d1") // Required for Analytics.
.setApiKey("AIzaSyADUe90ULnQDuGShD9W23RDP0xmeDc6Mvw") // Required for Auth.
.setDatabaseUrl("https://myproject.firebaseio.com") // Required for RTDB.
.build()ウェブ
var secondaryAppConfig = {
apiKey: "<API_KEY>",
authDomain: "<PROJECT_ID>.firebaseapp.com",
databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
storageBucket: "<BUCKET>.appspot.com",
};
C++
firebase::AppOptions secondary_app_options;
secondary_app_options.set_api_key(<API_KEY>);
secondary_app_options.set_app_id("<GOOGLE_APP_ID>");
secondary_app_options.set_project_id("<PROJECT_ID>");
Unity
Firebase.AppOptions secondaryAppOptions = new Firebase.AppOptions {
ApiKey = "<API_KEY>",
AppId = "<GOOGLE_APP_ID>",
ProjectId = "<PROJECT_ID>"
};
Node.js
var admin = require("firebase-admin");
var serviceAccount = require("path/to/serviceAccountKey.json");
var secondaryAppConfig = {
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://<DATABASE_NAME>.firebaseio.com"
};
Java
FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountKey.json");
FirebaseOptions secondaryAppConfig = new FirebaseOptions.Builder()
.setCredential(FirebaseCredentials.fromCertificate(serviceAccount))
.setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
.build();
オプション オブジェクトを初期化したら、そのオブジェクトを使用して、追加 Firebase アプリケーション インスタンスを構成できます。以下のすべての例では、secondary という文字列を使用しています。この名前は、アプリケーション インスタンスを取得したり、そのインスタンスを他のインスタンス([DEFAULT] という名前のデフォルト インスタンスなど)と区別したりするために使用されています。他の Firebase プロジェクトの場合は、その使用目的に適した文字列を選択してください。
次のスニペットは、代替 Realtime Database に接続しています(他の Firebase 機能の API も同じパターンに従います)。
iOS
// Configure an alternative FIRApp.
FirebaseApp.configure(name: "secondary", options: secondaryOptions)
// Retrieve a previous created named app.
guard let secondary = FirebaseApp.app(name: "secondary")
else { assert(false, "Could not retrieve secondary app") }
// Retrieve a Real Time Database client configured against a specific app.
let secondaryDb = Database.database(app: secondary) Java
Android
// Initialize with secondary app.
FirebaseApp.initializeApp(this /* Context */, options, "secondary");
// Retrieve secondary app.
FirebaseApp secondary = FirebaseApp.getInstance("secondary");
// Get the database for the other app.
FirebaseDatabase secondaryDatabase = FirebaseDatabase.getInstance(secondary); Kotlin
Android
// Initialize with secondary app.
FirebaseApp.initializeApp(this /* Context */, options, "secondary")
// Retrieve secondary app.
val secondary = FirebaseApp.getInstance("secondary")
// Get the database for the other app.
val secondaryDatabase = FirebaseDatabase.getInstance(secondary)ウェブ
// Initialize another app with a different config
var secondary = firebase.initializeApp(secondaryAppConfig, "secondary");
// Retrieve the database.
var secondaryDatabase = secondary.database();
C++
firebase::App* secondary_app = firebase::App::Create(secondary_app_options, "Secondary");
firebase::database::Database* secondary_database = firebase::database::Database::GetInstance(secondary_app);
Unity
var secondaryApp = Firebase.FirebaseApp.Create(secondaryAppOptions, "Secondary"));
var secondaryDatabase = Firebase.Database.FirebaseDatabase.getInstance(secondaryApp);
Node.js
// Initialize another app with a different config
var secondary = firebase.initializeApp(secondaryAppConfig, "secondary");
// Retrieve the database.
var secondaryDatabase = secondary.database();
Java
// Initialize another app with a different config
FirebaseApp secondary = FirebaseApp.initializeApp(secondaryAppConfig, "secondary");
// Retrieve the database.
FirebaseDatabase otherDatabase = FirebaseDatabase.getInstance(otherApp);
アナリティクスのレポートの信頼性を確保する
Firebase 向け Google アナリティクスでは、アプリ起動フローの非常に早い段階でイベントが収集されます。場合によっては、メインの Firebase アプリ インスタンスが構成される前です。このような場合、Firebase は iOS 上の Android リソースまたは GoogleService-Info.plist を参照して、イベントを保存するための正しい Google アプリ ID を検索します。このため、可能な限りデフォルトの設定方法を使用することをおすすめします。
ランタイム設定が必要な場合は、次の点に注意してください。
- AdMob を使用しており、推奨に従って起動時に広告をリクエストする場合、リソースベースの構成アプローチを使用しないと、モバイル広告に関連する一部のアナリティクス データを見逃す可能性があります。
- アプリの配布される各バリエーションでは 1 つの Google アプリ ID のみを指定します。たとえば、アプリのバージョン 1 を設定で特定の
GOOGLE_APP_IDを使用して出荷し、次にバージョン 2 を異なる ID を使用してアップロードする場合、アナリティクス データが削除される場合があります。 - iOS では、実行時に別の構成を提供する場合は、GoogleService-Info.plist をプロジェクトに追加しないでください。
GOOGLE_APP_IDが明らかに変更され、アナリティクスが失われる可能性があります。

