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 Standardeinrichtung in den Leitfäden für die ersten Schritte beschrieben. In folgenden Fällen kann es nützlich sein, mehrere Firebase-Projekte zu verwenden:
- Entwicklungsumgebung für die Verwendung verschiedener Firebase-Projekte einrichten auf Basis des Build-Typs oder Ziels.
- Sie können in Ihrer App auf Inhalte aus mehreren Firebase-Projekten zugreifen.
Verschiedene Umgebungen unterstützen
Ein häufiger Anwendungsfall ist die Unterstützung separater Firebase-Projekte für die Entwicklung und Produktionsumgebungen.
Die Web- und Admin-SDKs werden direkt von und Werte an ihre Initialisierungsfunktionen übergeben. Bei diesen SDKs können Sie mit einer Laufzeitprüfung Entwicklungs- oder Produktionskonfigurationsvariablen auswä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-Geräten. Diese Dateien werden in eine
Optionsobjekt (FIROption
oder FirebaseOptions
), auf das im
Firebase-Anwendungsobjekt (FIRApp
oder FirebaseApp
).
Für diese Plattformen wird der Wechsel zwischen Umgebungen in der Regel Zeitentscheidungen mithilfe unterschiedlicher Konfigurationsdateien zu verbessern.
Unterstützung mehrerer Umgebungen in Ihrer Apple-Anwendung
Standardmäßig lädt FirebaseApp.configure()
die Datei GoogleService-Info.plist
.
die mit der Anwendung gebündelt sind. Wenn Ihre Entwicklungs- und Produktionsumgebungen
als separate Ziele in Xcode konfiguriert, haben Sie folgende Möglichkeiten:
- Beide
GoogleService-Info.plist
-Dateien herunterladen - Beide Dateien in verschiedenen Verzeichnissen speichern
- Beide Ihrem Xcode-Projekt hinzufügen
- Verknüpfen Sie die verschiedenen Dateien mithilfe des Mitgliederbereich:
Wenn die Builds zu einem einzigen Ziel gehören,
Eindeutige Namen von Konfigurationsdateien (z.B. GoogleService-Info-Free.plist
und
GoogleService-Info-Paid.plist
). Wählen Sie dann zur Laufzeit aus, welche PLIST-Datei 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ützung mehrerer Umgebungen in Ihrer Android-App
In Android wird die Datei google-services.json
in einen Android-String verarbeitet.
Ressourcen vom Gradle-Plug-in für Google-Dienste. Sie können sehen,
Informationen dazu, welche Ressourcen in der Dokumentation zum Google Services-Plug-in unter
JSON-Datei verarbeiten
Sie können mehrere google-services.json
-Dateien für verschiedene
Build-Varianten
Indem du google-services.json
Dateien in dafür vorgesehenen Verzeichnissen platzierst, die jeweils nach dem jeweiligen Namen benannt sind
-Variante unter dem App-Modulstamm an. Wenn Sie z. B. „Entwicklung“ und
"veröffentlichung" Build-Flavor erstellen, könnte Ihre Konfiguration wie folgt organisiert werden:
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 vor dem Anwendungscode ausgeführt und Firebase APIs initialisiert für diese Werte.
Da dieser Anbieter nur Ressourcen mit bekannten Namen liest, können Sie die Stringressourcen direkt in Ihre App einfügen, Google Services Gradle-Plug-in. Dazu können Sie
- Das Plug-in
google-services
wird aus dem Stammverzeichnisbuild.gradle
entfernt google-services.json
aus Ihrem Projekt löschen- Stringressourcen direkt hinzufügen
apply plugin: 'com.google.gms.google-services'
wird aus deiner Appbuild.gradle
gelö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 Firebase-Anwendungsobjekt, das die Konfiguration für alle Firebase- APIs Dieses Objekt wird im Rahmen des normalen Setups initialisiert. Wenn Sie jedoch mehrere Projekte über eine einzige Anwendung aufrufen möchten, benötigen Sie eine Firebase-Anwendungsobjekt, um jedes einzelne Objekt zu referenzieren. Es ist zum Initialisieren der anderen Instanzen.
In beiden Fällen müssen Sie zuerst ein Firebase-Optionsobjekt für die Konfigurationsdaten für die Firebase-Anwendung. Vollständige Dokumentation finden Sie in der API-Referenzdokumentation für die folgenden Klassen:
- Swift:
FirebaseOptions(googleAppID:gcmSenderID:)
- Android-Gerät:
FirebaseOptions.Builder
- Web:
initializeApp()
- C++:
firebase::App::Create
- Einheit:
FirebaseApp.Create
- Node.js:
initializeApp
- Java:
FirebaseOptions.Builder
Es wird gezeigt, wie diese Klassen zur Unterstützung mehrerer Projekte in einer Anwendung verwendet werden. in den folgenden Beispielen:
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.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();
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 Optionsobjekt initialisiert haben, können Sie damit ein zusätzliche Firebase-Anwendungsinstanz. In allen folgenden Beispielen wird der String secondary verwendet. Dieser Name wird zum Abrufen der Anwendungsinstanz und um sie von anderen Instanzen zu unterscheiden, einschließlich der Standardinstanz (mit dem Namen [DEFAULT]) Sie sollten einen String auswählen, der die vorgesehene Nutzung des anderen Firebase-Projekts.
Die folgenden Snippets veranschaulichen das Herstellen einer Verbindung zu einer alternativen Realtime Database. 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 { 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");
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
Google Analytics erfasst Ereignisse sehr früh im App-Startvorgang, manchmal sogar noch bevor die primäre Firebase App-Instanz konfiguriert wurde. In
bezieht sich Firebase auf die Android-Ressource oder
GoogleService-Info.plist
auf Apple-Plattformen, um die richtige Google-App zu finden
ID zum Speichern von Ereignissen. Aus diesem Grund empfehlen wir, die Standardeinstellung
Konfigurationsmethoden zu verwenden.
Beachten Sie die folgenden Einschränkungen, wenn eine Laufzeitkonfiguration erforderlich ist:
- Wenn Sie AdMob verwenden und wie empfohlen Anzeigen beim Start anfordern, können Sie vermissen einige Analytics-Daten zu mobilen Anzeigen, wenn die Ressource nicht genutzt wird. Konfigurationsansatz zu testen.
- Geben Sie für jede vertriebene 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 Version 2 mit einer anderen ID hochladen, kann dies dazu führen, zu löschen. - Fügen Sie Ihrem Projekt auf Apple-Plattformen GoogleService-Info.plist nicht hinzu, wenn
Sie zur Laufzeit eine andere Konfiguration bereitstellen, da dies zu einer
Offensichtliche Änderung von
GOOGLE_APP_ID
und zum Verlust von Analytics führen.