Mehrere Projekte konfigurieren

Auf dieser Seite wird beschrieben, wie Sie mehr als ein Firebase-Projekt in Ihrer App verwenden.

Viele Anwendungen benötigen nur ein einziges Projekt Firebase und den Standard in den loszulegen Führern beschrieben einrichten. Beispiele dafür, wann es sinnvoll sein kann, mehrere Firebase-Projekte zu verwenden, sind:

  • Einrichten Ihrer Entwicklungsumgebung zur Verwendung verschiedener Firebase-Projekte basierend auf Build-Typ oder Ziel.
  • Zugriff auf die Inhalte aus mehreren Firebase-Projekten 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 iOS (und ihre Einheit und C ++ Wrapper) normalerweise laden Konfiguration aus einer Konfigurationsdatei: GoogleService-Info.plist auf iOS und google-services.json auf Android. Diese Dateien werden gelesen , in einem Options Objekt ( FIROption oder FirebaseOptions ), die von der Firebase Anwendungsobjekt (verwiesen wird FIRApp oder FirebaseApp ).

Bei diesen Plattformen wird das Umschalten zwischen Umgebungen normalerweise als Entscheidung zur Erstellungszeit implementiert, indem unterschiedliche Konfigurationsdateien für jede Umgebung verwendet werden.

Unterstützen Sie mehrere Umgebungen in Ihrer iOS-Anwendung

Standardmäßig FirebaseApp.configure() wird die Last GoogleService-Info.plist Datei mit der Anwendung gebündelt. Wenn Ihre Entwicklungs- und Produktionsumgebungen als separate Ziele in XCode konfiguriert sind, können Sie:

  • Laden Sie beide GoogleService-Info.plist Dateien
  • Speichern Sie die beiden Dateien in verschiedenen Verzeichnissen
  • Fügen Sie beides zu Ihrem XCode-Projekt hinzu
  • Verknüpfen Sie die verschiedenen Dateien mit den verschiedenen Zielen über das Bedienfeld „Zielmitgliedschaft“:

Zielmitgliedschaftspanel

Wenn der Teil eines einzelnen Ziel Builds sind, die beste Option ist , um beiden Konfigurationsdateien eindeutige Namen zu geben (zB 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, die google-service.json Datei wird von der Google - Service gradle Plugin in Android String - Ressourcen verarbeitet. Sie können , welche Ressourcen werden erstellt , in der Google - Service Plugin Dokumentation sehen Verarbeitung der JSON - Datei .

Sie können mehrere haben google-services.json - Dateien für verschiedene Build - google-services.json Varianten , indem google-services.json Dateien in speziellen Verzeichnissen für jede Variante unter der App - Modul root genannt. Wenn Sie beispielsweise über die Build-Varianten "Entwicklung" und "Release" verfügen, könnte Ihre Konfiguration wie folgt organisiert werden:

app/
    google-services.json
    src/development/google-services.json
    src/release/google-services.json
    ...

Um mehr zu erfahren, finden Sie in der Google - Services Plugin - Dokumentation auf die JSON - Datei hinzufügen .

Diese Ressourcen werden dann durch die geladene FirebaseInitProvider , die vor dem Anwendungscode läuft und initialisiert Firebase APIs unter Verwendung dieser Werte.

Da dieser Anbieter nur Ressourcen mit bekannten Namen liest, besteht eine andere Möglichkeit darin, die String-Ressourcen direkt zu Ihrer App hinzuzufügen, anstatt das Gradle-Plug-in von Google Services zu verwenden. Sie können dies tun, indem Sie:

  • Das Entfernen der google-services - Plugin von Ihrem root build.gradle
  • Das Löschen des google-services.json aus Ihrem Projekt
  • String-Ressourcen direkt hinzufügen
  • Löschen apply plugin: 'com.google.gms.google-services' von Ihrer App build.gradle

Verwenden Sie mehrere Projekte in Ihrer Anwendung

Manchmal müssen Sie mit denselben APIs auf verschiedene Projekte zugreifen – zum Beispiel, um auf mehrere Datenbankinstanzen zuzugreifen. In den meisten Fällen gibt es ein zentrales Firebase-Anwendungsobjekt, das die Konfiguration für alle Firebase-APIs verwaltet. Dieses Objekt wird als Teil Ihres normalen Setups initialisiert. Wenn Sie jedoch von einer einzelnen Anwendung aus auf mehrere Projekte zugreifen möchten, benötigen Sie ein eigenes Firebase-Anwendungsobjekt, um jedes einzelne zu referenzieren. 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 zu den 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:

iOS

// 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: admin.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 in allen Beispielen unten werden wir die Zeichenfolge Zweitverwertung gezeigt. Dieser Name wird verwendet , um die Anwendungsinstanz abzurufen, und es von anderen Instanzen zu unterscheiden, einschließlich der Standardinstanz ( mit dem Namen [STANDARD]). Sie sollten eine Zeichenfolge auswählen, die für die beabsichtigte Verwendung des anderen Firebase-Projekts geeignet ist.

Die folgenden Snippets zeigen die Verbindung zu einer alternativen Echtzeitdatenbank (die APIs für andere Firebase-Funktionen folgen demselben Muster).

iOS

// 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 = admin.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 ein zuverlässiges Reporting für Analytics sicher

Google Analytics erfasst Ereignisse sehr früh im App-Startvorgang, manchmal bevor die primäre Firebase-App-Instanz konfiguriert wurde. In diesen Fällen bezieht sich Firebase auf die Android - Ressource oder GoogleService-Info.plist auf iOS die richtige Google - App - ID zu speichern Ereignisse zu suchen. Aus diesem Grund empfehlen wir, nach Möglichkeit die Standardkonfigurationsmethoden zu verwenden.

Wenn eine Laufzeitkonfiguration erforderlich ist, beachten Sie bitte die folgenden Vorbehalte:

  1. Wenn Sie AdMob verwenden und wie empfohlen beim Start Anzeigen anfordern, übersehen Sie möglicherweise einige Analytics-Daten zu Handy-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. Zum Beispiel, wenn Sie die Version 1 des App mit einem bestimmten Schiff GOOGLE_APP_ID in der Konfiguration dann lud 2 - Version mit einer anderen ID kann es Analysedaten dazu führen , fallen gelassen werden.
  3. Auf iOS - Geräten nicht GoogleService-Info.plist zu Ihrem Projekt hinzufügen , wenn Sie andere Konfiguration zur Laufzeit liefern, da dies zu einer scheinbaren Änderung führen kann GOOGLE_APP_ID und führt zu verlorenen Analytics.