Mehrere Projekte konfigurieren

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:

Zielmitgliedschaftsbereich

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 Stammverzeichnis build.gradle entfernt
  • google-services.json aus Ihrem Projekt löschen
  • Stringressourcen direkt hinzufügen
  • apply plugin: 'com.google.gms.google-services' wird aus deiner App build.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:

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:

  1. 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.
  2. 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.
  3. 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.