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 „Erste Schritte“ -Anleitungen beschriebene Standardeinrichtung. Beispiele dafür, wann es nützlich sein kann, mehrere Firebase-Projekte zu verwenden, sind:

  • Richten Sie Ihre Entwicklungsumgebung so ein, dass je nach Build-Typ oder Ziel unterschiedliche Firebase-Projekte 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 durch direkte Übergabe von Werten an ihre Initialisierungsfunktionen konfiguriert. 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.

Bei diesen Plattformen wird der Wechsel zwischen Umgebungen normalerweise als Build-Zeit-Entscheidung 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 in Xcode als separate Ziele 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 mithilfe des Bereichs „Zielmitgliedschaft“ den verschiedenen Zielen zu:

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-services.json vom Google Services Gradle-Plugin in Android-String-Ressourcen verarbeitet. Welche Ressourcen erstellt werden, können Sie in der Dokumentation zum Google Services Plugin zur Verarbeitung der JSON-Datei sehen.

Sie können mehrere google-services.json Dateien für verschiedene Build-Varianten haben, indem Sie google-services.json Dateien in speziellen Verzeichnissen ablegen, die für jede Variante im Stammverzeichnis des App-Moduls benannt sind. Wenn Sie beispielsweise über die Build-Varianten „Entwicklung“ und „Release“ verfügen, 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 Services Plugin zum Hinzufügen der JSON-Datei .

Diese Ressourcen werden dann vom FirebaseInitProvider geladen, der vor Ihrem Anwendungscode ausgeführt wird und Firebase-APIs mithilfe dieser Werte 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-Plugin von Google Services zu verwenden. Sie können dies tun, indem Sie:

  • Entfernen des google-services -Plugins aus Ihrem Root- build.gradle
  • Löschen Sie die google-services.json aus Ihrem Projekt
  • Direktes Hinzufügen der String-Ressourcen
  • apply plugin: 'com.google.gms.google-services' wird aus Ihrer App build.gradle gelöscht

Verwenden Sie mehrere Projekte in Ihrer Anwendung

Manchmal müssen Sie über dieselben APIs auf verschiedene Projekte zugreifen, beispielsweise 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 Ihres normalen Setups initialisiert. Wenn Sie jedoch von einer einzigen Anwendung aus auf mehrere Projekte zugreifen möchten, benötigen Sie ein eigenes Firebase-Anwendungsobjekt, um jedes einzeln zu referenzieren. Es liegt an Ihnen, diese anderen Instanzen zu initialisieren.

In beiden Fällen müssen Sie zunächst ein Firebase-Optionsobjekt erstellen, um die Konfigurationsdaten für die Firebase-Anwendung zu speichern. Die vollständige Dokumentation der 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

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 „sekundär“ verwenden. Dieser Name wird verwendet, um die Anwendungsinstanz abzurufen und sie von anderen Instanzen, einschließlich der Standardinstanz (mit dem Namen [DEFAULT] ), zu unterscheiden. Sie sollten eine Zeichenfolge auswählen, die für die beabsichtigte Verwendung des anderen Firebase-Projekts geeignet ist.

Die folgenden Snippets veranschaulichen die Verbindung zu 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);

Sorgen Sie für zuverlässige Berichte für Analytics

Google Analytics erfasst Ereignisse sehr früh im Startvorgang der App, in manchen Fällen bereits bevor die primäre Firebase-App-Instanz konfiguriert wurde. In diesen Fällen greift Firebase auf die Android-Ressource oder GoogleService-Info.plist auf Apple-Plattformen zu, um die richtige Google-App-ID zum Speichern von Ereignissen zu finden. 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 Anzeigen beim Start anfordern, fehlen Ihnen möglicherweise einige Analytics-Daten im Zusammenhang mit mobilen 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 GoogleService-Info.plist nicht 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.