Auf dieser Seite wird beschrieben, wie Sie mehr als ein Firebase-Projekt in Ihrer App verwenden.
Viele Apps benötigen nur ein einziges Firebase-Projekt und die in den Leitfäden „ Erste Schritte “ beschriebene Standardeinrichtung. Beispiele dafür, wann es sinnvoll sein kann, mehrere Firebase-Projekte zu verwenden, sind:
- Richten Sie Ihre Entwicklungsumgebung so ein, dass verschiedene Firebase-Projekte basierend auf Build-Typ oder Ziel verwendet werden.
- Zugriff auf den Inhalt mehrerer Firebase-Projekte in Ihrer App.
Unterstützen Sie verschiedene Umgebungen
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 eine Laufzeitprüfung verwenden, um Entwicklungs- oder Produktionskonfigurationsvariablen auszuwählen.
Android- und Apple-Plattformen (und ihre Unity- und C++-Wrapper) laden die Konfiguration normalerweise aus einer Konfigurationsdatei: GoogleService-Info.plist
auf der Apple-Plattform und google-services.json
auf Android. Diese Dateien werden in ein Optionsobjekt ( FIROption
oder FirebaseOptions
) eingelesen, auf das vom Firebase-Anwendungsobjekt ( FIRApp
oder FirebaseApp
) verwiesen wird.
Für diese Plattformen wird das Umschalten zwischen Umgebungen normalerweise als Entscheidung zur Buildzeit implementiert, indem für jede Umgebung unterschiedliche Konfigurationsdateien verwendet werden.
Unterstützen Sie mehrere Umgebungen in Ihrer Apple-Anwendung
Standardmäßig lädt FirebaseApp.configure()
die mit der Anwendung gebündelte Datei GoogleService-Info.plist
. Wenn Ihre Entwicklungs- und Produktionsumgebungen als separate Ziele in Xcode konfiguriert sind, können Sie:
- Laden Sie beide
GoogleService-Info.plist
Dateien herunter - Speichern Sie die beiden Dateien in unterschiedlichen Verzeichnissen
- Fügen Sie beide zu Ihrem Xcode-Projekt hinzu
- Ordnen Sie die verschiedenen Dateien den verschiedenen Zielen zu, indem Sie das Fenster „Zielzugehörigkeit“ verwenden:
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 gezeigt:
// 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)
Unterstützen Sie mehrere Umgebungen in Ihrer Android-Anwendung
In Android wird die Datei google-service.json
vom Gradle-Plug-in von Google Services in Android-String-Ressourcen verarbeitet. Welche Ressourcen erstellt werden, können Sie der Google Services Plugin-Dokumentation zur Verarbeitung der JSON-Datei entnehmen .
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 für jede Variante unter dem Anwendungsmodulstamm benannt sind. Wenn Sie beispielsweise die Build-Varianten „Entwicklung“ und „Release“ haben, könnte Ihre Konfiguration wie folgt organisiert sein:
app/
google-services.json
src/development/google-services.json
src/release/google-services.json
...
Weitere Informationen finden Sie in der Dokumentation zum Google-Dienste-Plug-in unter Hinzufügen der JSON-Datei .
Diese Ressourcen werden dann vom FirebaseInitProvider geladen, der vor Ihrem Anwendungscode ausgeführt wird und Firebase-APIs mit diesen Werten initialisiert.
Da dieser Anbieter nur Ressourcen mit bekannten Namen liest, besteht eine andere Möglichkeit darin, die Zeichenfolgenressourcen direkt zu Ihrer App hinzuzufügen, anstatt das Gradle-Plug-in von Google Services zu verwenden. Sie können dies tun, indem Sie:
- Entfernen des
google-services
Plug-Ins aus Ihrem rootbuild.gradle
- Löschen von
google-services.json
aus Ihrem Projekt - Direktes Hinzufügen der String-Ressourcen
- Löschen
apply plugin: 'com.google.gms.google-services'
aus Ihrer Appbuild.gradle
Verwenden Sie mehrere Projekte in Ihrer Anwendung
Manchmal müssen Sie mit denselben APIs auf verschiedene Projekte zugreifen, z. B. auf mehrere Datenbankinstanzen zugreifen. 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 Ihrer normalen Einrichtung initialisiert. Wenn Sie jedoch von einer einzelnen Anwendung aus auf mehrere Projekte zugreifen möchten, benötigen Sie ein eigenes Firebase-Anwendungsobjekt, um auf jedes einzeln zu verweisen. Es liegt an Ihnen, diese anderen Instanzen zu initialisieren.
In beiden Fällen müssen Sie zuerst ein Firebase-Optionsobjekt erstellen, um die Konfigurationsdaten für die Firebase-Anwendung zu speichern. 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
- Einheit:
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:
Schnell
// 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
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()
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();
Netz
// 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 Optionsobjekt initialisiert haben, können Sie damit eine zusätzliche Firebase-Anwendungsinstanz konfigurieren. Beachten Sie, dass wir in allen unten gezeigten Beispielen die Zeichenfolge secondary verwenden. Dieser Name wird verwendet, um die Anwendungsinstanz abzurufen und sie von anderen Instanzen zu unterscheiden, einschließlich der Standardinstanz (mit dem Namen [DEFAULT] ). Sie sollten eine Zeichenfolge auswählen, die für die beabsichtigte Verwendung des anderen Firebase-Projekts geeignet ist.
Die folgenden Snippets demonstrieren die Verbindung mit einer alternativen Echtzeitdatenbank (die APIs für andere Firebase-Funktionen folgen demselben Muster).
Schnell
// 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)
Kotlin+KTX
// 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");
Netz
// 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);
Stellen Sie zuverlässige Berichte für Analytics sicher
Google Analytics erfasst Ereignisse sehr früh im App-Startablauf, in manchen Fällen, bevor die primäre Firebase-App-Instanz konfiguriert wurde. In diesen Fällen verweist Firebase auf die Android-Ressource oder GoogleService-Info.plist
auf Apple-Plattformen, um die korrekte Google-App-ID zum Speichern von Ereignissen nachzuschlagen. Aus diesem Grund 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 wie empfohlen beim Start Anzeigen anfordern, entgehen Ihnen möglicherweise einige Analytics-Daten in Bezug auf mobile Anzeigen, wenn Sie nicht den ressourcenbasierten Konfigurationsansatz verwenden.
- Geben Sie in jeder verteilten Variante Ihrer App immer nur eine einzige Google-App-ID an. Wenn Sie beispielsweise Version 1 Ihrer App mit einer bestimmten
GOOGLE_APP_ID
in der Konfiguration ausliefern und dann Version 2 mit einer anderen ID hochladen, kann dies dazu führen, dass Analysedaten gelöscht werden. - Fügen Sie auf Apple-Plattformen nicht GoogleService-Info.plist zu Ihrem Projekt hinzu, wenn Sie zur Laufzeit eine andere Konfiguration bereitstellen, da dies zu einer offensichtlichen Änderung von
GOOGLE_APP_ID
und zum Verlust von Analytics führen kann.