Google は、黒人コミュニティのための人種的公平の促進に取り組んでいます。詳細をご覧ください。

複数のプロジェクトを構成する

このページでは、アプリで複数のFirebaseプロジェクトを使用する方法について説明します。

多くのアプリは、単一のFirebaseプロジェクトと、スタートガイドで説明されているデフォルトの設定のみを必要とします。複数のFirebaseプロジェクトを使用すると便利な場合の例は次のとおりです。

  • ビルドタイプまたはターゲットに基づいてさまざまなFirebaseプロジェクトを使用するように開発環境を設定します。
  • アプリ内の複数のFirebaseプロジェクトのコンテンツにアクセスする。

さまざまな環境をサポートする

一般的なユースケースの1つは、開発環境と本番環境で別々のFirebaseプロジェクトをサポートすることです。

WebおよびAdminSDKは、初期化関数に値を直接渡すことによって構成されます。これらのSDKの場合、ランタイムチェックを使用して、開発または本番構成変数を選択できます。

AndroidおよびAppleプラットフォーム(およびそれらのUnityおよびC ++ラッパー)は通常、構成ファイルから構成をロードします。AppleプラットフォームではGoogleService-Info.plist 、Androidではgoogle-services.jsonです。これらのファイルは、Firebaseアプリケーションオブジェクト( FIRAppまたはFirebaseApp )によって参照されるオプションオブジェクト( FIROptionまたはFirebaseOptions )に読み込まれます。

これらのプラットフォームの場合、環境間の切り替えは通常、環境ごとに異なる構成ファイルを使用して、ビルド時の決定として実装されます。

Appleアプリケーションで複数の環境をサポートする

デフォルトでは、 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文字列リソースに処理されます。どのリソースが作成されているかは、JSONファイルの処理に関するGoogleサービスプラグインのドキュメントで確認できます。

アプリモジュールルートの下の各バリアントに名前が付けられた専用ディレクトリにgoogle-services.jsonファイルを配置することで、さまざまなビルドバリアントの複数のgoogle-services.jsonファイルを作成できます。たとえば、「開発」および「リリース」ビルドフレーバーがある場合、構成は次のように編成できます。

app/
    google-services.json
    src/development/google-services.json
    src/release/google-services.json
    ...

詳細については、JSONファイルの追加に関するGoogleサービスプラグインのドキュメントをご覧ください。

これらのリソースは、 FirebaseInitProviderによって読み込まれます。FirebaseInitProviderは、アプリケーションコードの前に実行され、これらの値を使用してFirebaseAPIを初期化します。

このプロバイダーは既知の名前のリソースを読み取っているだけなので、別のオプションは、Googleサービスのgradleプラグインを使用する代わりに、文字列リソースをアプリに直接追加することです。これは次の方法で実行できます。

  • ルートbuild.gradleからgoogle-servicesプラグインを削除します
  • プロジェクトからgoogle-services.jsonを削除する
  • 文字列リソースを直接追加する
  • アプリbuild.gradleからapply plugin: 'com.google.gms.google-services'

アプリケーションで複数のプロジェクトを使用する

同じAPIを使用して異なるプロジェクトにアクセスする必要がある場合があります。たとえば、複数のデータベースインスタンスにアクセスする場合などです。ほとんどの場合、すべてのFirebaseAPIの構成を管理する中央のFirebaseアプリケーションオブジェクトがあります。このオブジェクトは、通常のセットアップの一部として初期化されます。ただし、1つのアプリケーションから複数のプロジェクトにアクセスする場合は、それぞれを個別に参照するための個別のFirebaseアプリケーションオブジェクトが必要になります。これらの他のインスタンスを初期化するのはあなた次第です。

どちらの場合も、最初にFirebaseオプションオブジェクトを作成して、Firebaseアプリケーションの構成データを保持する必要があります。オプションの完全なドキュメントは、次のクラスのAPIリファレンスドキュメントにあります。

アプリケーションで複数のプロジェクトをサポートするためのこれらのクラスの使用を、次の例に示します。

迅速

// Configure with manual options. Note that projectID and apiKey, though not
// required by the initializer, are mandatory.
let secondaryOptions = FirebaseOptions(googleAppID: "1:27992087142:ios:2a4732a34787067a",
                                       gcmSenderID: "27992087142")
secondaryOptions.apiKey = "AIzaSyBicqfAZPvMgC7NZkjayUEsrepxuXzZDsk"
secondaryOptions.projectID = "projectid-12345"

// The other options are not mandatory, but may be required
// for specific Firebase products.
secondaryOptions.bundleID = "com.google.firebase.devrel.FiroptionConfiguration"
secondaryOptions.trackingID = "UA-12345678-1"
secondaryOptions.clientID = "27992087142-ola6qe637ulk8780vl8mo5vogegkm23n.apps.googleusercontent.com"
secondaryOptions.databaseURL = "https://myproject.firebaseio.com"
secondaryOptions.storageBucket = "myproject.appspot.com"
secondaryOptions.androidClientID = "12345.apps.googleusercontent.com"
secondaryOptions.deepLinkURLScheme = "myapp://"
secondaryOptions.storageBucket = "projectid-12345.appspot.com"
secondaryOptions.appGroupID = nil

Java

// Manually configure Firebase Options. The following fields are REQUIRED:
//   - Project ID
//   - App ID
//   - API Key
FirebaseOptions options = new FirebaseOptions.Builder()
        .setProjectId("my-firebase-project")
        .setApplicationId("1:27992087142:android:ce3b6448250083d1")
        .setApiKey("AIzaSyADUe90ULnQDuGShD9W23RDP0xmeDc6Mvw")
        // setDatabaseURL(...)
        // setStorageBucket(...)
        .build();

Kotlin+KTX

// Manually configure Firebase Options. The following fields are REQUIRED:
//   - Project ID
//   - App ID
//   - API Key
val options = FirebaseOptions.Builder()
        .setProjectId("my-firebase-project")
        .setApplicationId("1:27992087142:android:ce3b6448250083d1")
        .setApiKey("AIzaSyADUe90ULnQDuGShD9W23RDP0xmeDc6Mvw")
        // .setDatabaseUrl(...)
        // .setStorageBucket(...)
        .build()

ウェブ

// The following fields are REQUIRED:
//  - Project ID
//  - App ID
//  - API Key
const secondaryAppConfig = {
    projectId: "<PROJECT_ID>",
    appId: "<APP_ID>",
    apiKey: "<API_KEY>",
    // databaseURL: "...",
    // storageBucket: "...",
};

C ++

firebase::AppOptions secondary_app_options;

// API key, app ID, and project ID are always required.
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>");

// The following options are specific to individual Firebase products
// and may not always be required.
secondary_app_options.set_database_url("<DATABASE_URL>");
secondary_app_options.set_messaging_sender_id("<SENDER_ID>");
secondary_app_options.set_storage_bucket("<STORAGE_BUCKET>");

団結

Firebase.AppOptions secondaryAppOptions = new Firebase.AppOptions {
  ApiKey = "<API_KEY>",
  AppId = "<GOOGLE_APP_ID>",
  ProjectId = "<PROJECT_ID>"
};

Node.js

const secondaryServiceAccount = require('./path/to/serviceAccountKey.json');

// All required options are specified by the service account,
// add service-specific configuration like databaseURL as needed.
const secondaryAppConfig = {
    credential: cert(secondaryServiceAccount),
    // 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は同じパターンに従います)。

迅速

// 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

// Initialize with secondary app
FirebaseApp.initializeApp(this /* Context */, options, "secondary");

// Retrieve secondary FirebaseApp
FirebaseApp secondary = FirebaseApp.getInstance("secondary");

Kotlin+KTX

// Initialize secondary FirebaseApp.
Firebase.initialize(this /* Context */, options, "secondary")

// Retrieve secondary FirebaseApp.
val secondary = Firebase.app("secondary")
// Get the database for the other app.
val secondaryDatabase = Firebase.database(secondary)

ウェブ

// Initialize another app with a different config
const secondaryApp = firebase.initializeApp(secondaryAppConfig, "secondary");
// Access services, such as the Realtime Database
// secondaryApp.database();

C ++

firebase::App* secondary_app = firebase::App::Create(secondary_app_options, "Secondary");
firebase::database::Database* secondary_database = firebase::database::Database::GetInstance(secondary_app);

団結

var secondaryApp = Firebase.FirebaseApp.Create(secondaryAppOptions, "Secondary"));
var secondaryDatabase = Firebase.Database.FirebaseDatabase.getInstance(secondaryApp);

Node.js

// Initialize another app with a different config
const secondary = initializeApp(secondaryAppConfig, 'secondary');
// Access services, such as the Realtime Database
// const secondaryDatabase = secondary.database();

Java

// Initialize another app with a different config
FirebaseApp secondaryApp = FirebaseApp.initializeApp(secondaryAppConfig, "secondary");

// Retrieve the database.
FirebaseDatabase secondaryDatabase = FirebaseDatabase.getInstance(secondaryApp);

アナリティクスの信頼できるレポートを確保する

Googleアナリティクスは、アプリの起動フローの非常に早い段階で、場合によってはプライマリFirebaseアプリインスタンスが構成される前にイベントを収集します。このような場合、FirebaseはAppleプラットフォーム上のAndroidリソースまたはGoogleService-Info.plistを参照して、イベントを保存するための正しいGoogleアプリIDを検索します。このため、可能な限りデフォルトの構成方法を使用することをお勧めします。

ランタイム構成が必要な場合は、次の注意事項に注意してください。

  1. AdMobを使用していて、推奨どおりに起動時に広告をリクエストする場合、リソースベースの構成アプローチを使用しないと、モバイル広告に関連するアナリティクスデータが失われる可能性があります。
  2. アプリの分散バリアントごとに1つのGoogleアプリIDのみを指定してください。たとえば、構成に特定のGOOGLE_APP_IDを含むバージョン1のアプリを出荷し、別のIDを使用してバージョン2をアップロードすると、分析データがドロップされる可能性があります。
  3. Appleプラットフォームでは、実行時に異なる構成を提供する場合は、プロジェクトにGoogleService-Info.plistを追加しないでください。これにより、 GOOGLE_APP_IDが明らかに変更され、Analyticsが失われる可能性があります。