Konfigurieren Sie mehrere Projekte

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:

Bereich Zielmitgliedschaft

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 root build.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 App build.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:

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

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()

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)

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)

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:

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