Auf dieser Seite wird beschrieben, wie Sie mehr als ein Firebase-Projekt in Ihrer App verwenden.
Für viele Apps ist nur ein einziges Firebase-Projekt und die in den Erste Schritte-Anleitungen beschriebene Standardeinrichtung erforderlich. Beispiele für Situationen, in denen es sinnvoll sein kann, mehrere Firebase-Projekte zu verwenden:
- Einrichten der Entwicklungsumgebung für die Verwendung verschiedener Firebase-Projekte basierend auf dem Build-Typ oder dem Ziel.
- Sie greifen in Ihrer App auf Inhalte aus mehreren Firebase-Projekten zu.
Verschiedene Umgebungen unterstützen
Ein häufiger Anwendungsfall ist die Unterstützung separater Firebase-Projekte für Ihre Entwicklungs- und Produktionsumgebungen.
Die Web- und Admin-SDKs werden konfiguriert, indem Werte direkt an ihre Initialisierungsfunktionen übergeben werden. Für diese SDKs können Sie einen Laufzeitcheck verwenden, um Konfigurationsvariablen für die Entwicklung oder Produktion auszuwählen.
Auf Android- und Apple-Plattformen (und ihren Unity- und C++-Wrappern) wird die Konfiguration normalerweise aus einer Konfigurationsdatei geladen: GoogleService-Info.plist auf der Apple-Plattform und google-services.json auf Android. Diese Dateien werden in ein Optionenobjekt (FIROption oder FirebaseOptions) eingelesen, auf das vom Firebase-Anwendungsobjekt (FIRApp oder FirebaseApp) verwiesen wird.
Auf diesen Plattformen wird der Wechsel zwischen Umgebungen in der Regel als Build-Zeit-Entscheidung implementiert, indem für jede Umgebung unterschiedliche Konfigurationsdateien verwendet werden.
Unterstützung mehrerer Umgebungen in Ihrer Apple-Anwendung
Standardmäßig wird mit FirebaseApp.configure() die mit der Anwendung gebündelte Datei GoogleService-Info.plist geladen. Wenn Ihre Entwicklungs- und Produktionsumgebungen in Xcode als separate Ziele konfiguriert sind, haben Sie folgende Möglichkeiten:
- Beide
GoogleService-Info.plist-Dateien herunterladen - Die beiden Dateien in verschiedenen Verzeichnissen speichern
- Fügen Sie beide Ihrem Xcode-Projekt hinzu.
- Weisen Sie die verschiedenen Dateien den verschiedenen Zielen über das Feld „Zielmitgliedschaft“ zu:

Wenn die Builds Teil eines einzelnen Ziels sind, ist es am besten, beiden Konfigurationsdateien eindeutige Namen zu geben (z.B. GoogleService-Info-Free.plist und GoogleService-Info-Paid.plist). Wählen Sie dann zur Laufzeit aus, welche PLIST geladen werden soll.
Dies wird im folgenden Beispiel veranschaulicht:
// Load a named file. guard let filePath = Bundle.main.path(forResource: "MyGoogleService", ofType: "plist"), let fileOptions = FirebaseOptions(contentsOfFile: filePath) else { fatalError("Couldn't load config file.") } FirebaseApp.configure(options: fileOptions)
Mehrere Umgebungen in Ihrer Android-App unterstützen
In Android wird die Datei google-services.json vom Google Services Gradle-Plug-in in Android-Stringressourcen verarbeitet. In der Dokumentation zum Google Services-Plug-in unter JSON-Datei verarbeiten finden Sie Informationen dazu, welche Ressourcen erstellt werden.
Sie können mehrere google-services.json-Dateien für verschiedene Build-Varianten haben, indem Sie google-services.json-Dateien in dedizierten Verzeichnissen platzieren, die nach jeder Variante unter dem Stammverzeichnis des App-Moduls benannt sind. Wenn Sie beispielsweise die Build-Varianten „development“ und „release“ haben, könnte Ihre Konfiguration so aussehen:
app/
google-services.json
src/development/google-services.json
src/release/google-services.json
...
Weitere Informationen finden Sie in der Dokumentation zum Google Services-Plug-in unter JSON-Datei hinzufügen.
Diese Ressourcen werden dann vom FirebaseInitProvider geladen, der vor dem Anwendungscode ausgeführt wird und die Firebase APIs mit diesen Werten initialisiert.
Da dieser Anbieter nur Ressourcen mit bekannten Namen liest, können Sie die String-Ressourcen auch direkt zu Ihrer App hinzufügen, anstatt das Gradle-Plug-in für Google-Dienste zu verwenden. Dazu können Sie
google-services-Plug-in aus dem Stammverzeichnisbuild.gradleentfernengoogle-services.jsonaus dem Projekt löschen- String-Ressourcen direkt hinzufügen
apply plugin: 'com.google.gms.google-services'wird aus Ihrer Appbuild.gradlegelöscht
Mehrere Projekte in Ihrer Anwendung verwenden
Manchmal müssen Sie mit denselben APIs auf verschiedene Projekte zugreifen, z. B. auf mehrere Datenbankinstanzen. In den meisten Fällen gibt es ein zentrales Firebase-Anwendungsobjekt, das die Konfiguration für alle Firebase-APIs verwaltet. Dieses Objekt wird im Rahmen der normalen Einrichtung initialisiert. Wenn Sie jedoch von einer einzelnen Anwendung aus auf mehrere Projekte zugreifen möchten, benötigen Sie ein separates Firebase-Anwendungsobjekt, um auf jedes Projekt einzeln zu verweisen. Sie müssen diese anderen Instanzen initialisieren.
In beiden Fällen müssen Sie zuerst ein Firebase-Options-Objekt erstellen, das die Konfigurationsdaten für die Firebase-Anwendung enthält. Die vollständige Dokumentation für die Optionen finden Sie in der API-Referenzdokumentation für die folgenden Klassen:
- Swift:
FirebaseOptions(googleAppID:gcmSenderID:) - Android:
FirebaseOptions.Builder - Web:
initializeApp() - C++:
firebase::App::Create - Unity:
FirebaseApp.Create - Node.js:
initializeApp - Java:
FirebaseOptions.Builder
Die Verwendung dieser Klassen zur Unterstützung mehrerer Projekte in einer Anwendung wird in den folgenden Beispielen gezeigt:
Swift
// 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.clientID = "27992087142-ola6qe637ulk8780vl8mo5vogegkm23n.apps.googleusercontent.com" secondaryOptions.databaseURL = "https://myproject.firebaseio.com" secondaryOptions.storageBucket = "myproject.appspot.com" secondaryOptions.deepLinkURLScheme = "myapp://" secondaryOptions.storageBucket = "projectid-12345.appspot.com" secondaryOptions.appGroupID = nil
Kotlin
// 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()
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();
Web
// 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>");
Einheit
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();
Nachdem Sie dieses Optionenobjekt initialisiert haben, können Sie es verwenden, um eine zusätzliche Firebase-Anwendungsinstanz zu konfigurieren. Beachten Sie, dass in allen unten gezeigten Beispielen der String secondary verwendet wird. Dieser Name wird verwendet, um die Anwendungsinstanz abzurufen und sie von anderen Instanzen zu unterscheiden, einschließlich der Standardinstanz (mit dem Namen [DEFAULT]). Wählen Sie einen String aus, der dem vorgesehenen Zweck des anderen Firebase-Projekts entspricht.
Die folgenden Snippets zeigen, wie Sie eine Verbindung zu einem alternativen Realtime Database herstellen. Die APIs für andere Firebase-Funktionen folgen demselben Muster.
Swift
// Configure an alternative FIRApp. FirebaseApp.configure(name: "secondary", options: secondaryOptions) // Retrieve a previous created named app. guard let secondary = FirebaseApp.app(name: "secondary") else { fatalError("Could not retrieve secondary app") } // Retrieve a Real Time Database client configured against a specific app. let secondaryDb = Database.database(app: secondary)
Kotlin
// Initialize secondary FirebaseApp. Firebase.initialize(context = this, options, "secondary") // Retrieve secondary FirebaseApp. val secondary = Firebase.app("secondary") // Get the database for the other app. val secondaryDatabase = Firebase.database(secondary)
Java
// Initialize with secondary app FirebaseApp.initializeApp(this /* Context */, options, "secondary"); // Retrieve secondary FirebaseApp FirebaseApp secondary = FirebaseApp.getInstance("secondary");
Web
// 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);
Einheit
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);
Zuverlässige Berichte für Analytics erstellen
Google Analytics erfasst Ereignisse sehr früh im Startvorgang der App, manchmal bevor die primäre Firebase-App-Instanz konfiguriert wurde. In diesen Fällen wird in Firebase auf die Android-Ressource oder GoogleService-Info.plist auf Apple-Plattformen verwiesen, um die richtige Google-App-ID zum Speichern von Ereignissen zu ermitteln. Daher empfehlen wir, nach Möglichkeit die Standardkonfigurationsmethoden zu verwenden.
Wenn eine Laufzeitkonfiguration erforderlich ist, beachten Sie bitte die folgenden Einschränkungen:
- Wenn Sie AdMob verwenden und Anzeigen wie empfohlen beim Start anfordern, fehlen Ihnen möglicherweise einige Analytics-Daten zu mobilen Anzeigen, wenn Sie nicht den ressourcenbasierten Konfigurationsansatz verwenden.
- Geben Sie in jeder verteilten Variante Ihrer App nur eine Google-App-ID an.
Wenn Sie beispielsweise Version 1 Ihrer App mit einer bestimmten
GOOGLE_APP_IDin der Konfiguration bereitstellen und dann Version 2 mit einer anderen ID hochladen, können Analysedaten verloren gehen. - Fügen Sie auf Apple-Plattformen die Datei „GoogleService-Info.plist“ nicht Ihrem Projekt hinzu, wenn Sie zur Laufzeit eine andere Konfiguration angeben, da dies zu einer scheinbaren Änderung von
GOOGLE_APP_IDund zu Verlusten bei Analytics führen kann.