Skonfiguruj wiele projektów

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Na tej stronie opisano, jak korzystać z więcej niż jednego projektu Firebase w swojej aplikacji.

Wiele aplikacji wymaga tylko jednego projektu Firebase i domyślnej konfiguracji opisanej w przewodnikach dla początkujących. Przykłady sytuacji, w których warto korzystać z wielu projektów Firebase, obejmują:

  • Konfigurowanie środowiska programistycznego do korzystania z różnych projektów Firebase w zależności od typu kompilacji lub celu.
  • Uzyskiwanie dostępu do treści z wielu projektów Firebase w Twojej aplikacji.

Obsługa różnych środowisk

Jednym z typowych przypadków użycia jest obsługa oddzielnych projektów Firebase dla środowisk programistycznych i produkcyjnych.

Zestawy SDK sieci Web i Admin są konfigurowane przez bezpośrednie przekazywanie wartości do ich funkcji inicjujących. W przypadku tych zestawów SDK można użyć sprawdzenia środowiska wykonawczego, aby wybrać zmienne konfiguracji programistycznej lub produkcyjnej.

Platformy Android i Apple (oraz ich opakowania Unity i C++) zwykle ładują konfigurację z pliku konfiguracyjnego: GoogleService-Info.plist na platformie Apple i google-services.json na Androidzie. Te pliki są wczytywane do obiektu opcji ( FIROption lub FirebaseOptions ), do którego odwołuje się obiekt aplikacji Firebase ( FIRApp lub FirebaseApp ).

W przypadku tych platform przełączanie między środowiskami jest zwykle wdrażane jako decyzja w czasie kompilacji, poprzez użycie różnych plików konfiguracyjnych dla każdego środowiska.

Obsługa wielu środowisk w aplikacji Apple

Domyślnie FirebaseApp.configure() ładuje plik GoogleService-Info.plist dołączony do aplikacji. Jeśli Twoje środowiska programistyczne i produkcyjne są skonfigurowane jako oddzielne cele w Xcode, możesz:

  • Pobierz oba pliki GoogleService-Info.plist
  • Przechowuj dwa pliki w różnych katalogach
  • Dodaj oba do swojego projektu Xcode
  • Powiąż różne pliki z różnymi celami za pomocą panelu Członkostwo docelowe:

Panel członkostwa docelowego

Jeśli kompilacje są częścią jednego celu, najlepszą opcją jest nadanie obu plikom konfiguracyjnym unikalnych nazw (np GoogleService-Info-Free.plist i GoogleService-Info-Paid.plist ). Następnie wybierz w czasie wykonywania, który plik plist ma zostać załadowany. Pokazuje to następujący przykład:

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

Obsługa wielu środowisk w aplikacji na Androida

W systemie Android plik google-service.json jest przetwarzany na zasoby tekstowe systemu Android przez wtyczkę Gradle usług Google. Możesz sprawdzić, jakie zasoby zostały utworzone, w dokumentacji wtyczki usług Google dotyczącej przetwarzania pliku JSON .

Możesz mieć wiele plików google-services.json dla różnych wariantów kompilacji , umieszczając pliki google-services.json w dedykowanych katalogach nazwanych dla każdego wariantu w katalogu głównym modułu aplikacji. Na przykład, jeśli masz smaki kompilacji „do opracowywania” i „wydawania”, twoja konfiguracja może być zorganizowana w następujący sposób:

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

Aby dowiedzieć się więcej, zapoznaj się z dokumentacją wtyczki usług Google na temat dodawania pliku JSON .

Te zasoby są następnie ładowane przez FirebaseInitProvider , który jest uruchamiany przed kodem aplikacji i inicjuje interfejsy API Firebase przy użyciu tych wartości.

Ponieważ ten dostawca tylko odczytuje zasoby o znanych nazwach, inną opcją jest dodanie zasobów tekstowych bezpośrednio do aplikacji zamiast korzystania z wtyczki Gradle usług Google. Możesz to zrobić poprzez:

  • Usuwanie wtyczki google-services z katalogu głównego build.gradle
  • Usuwanie google-services.json z Twojego projektu
  • Bezpośrednie dodawanie zasobów tekstowych
  • Usuwanie apply plugin: 'com.google.gms.google-services' z Twojej aplikacji build.gradle

Użyj wielu projektów w swojej aplikacji

Czasami trzeba uzyskać dostęp do różnych projektów przy użyciu tych samych interfejsów API — na przykład dostęp do wielu instancji bazy danych. W większości przypadków istnieje centralny obiekt aplikacji Firebase, który zarządza konfiguracją wszystkich interfejsów API Firebase. Ten obiekt jest inicjowany jako część twojej normalnej konfiguracji. Jeśli jednak chcesz uzyskać dostęp do wielu projektów z jednej aplikacji, potrzebujesz osobnego obiektu aplikacji Firebase, aby odwoływać się do każdego z nich z osobna. Od Ciebie zależy, czy zainicjujesz te inne instancje.

W obu przypadkach musisz najpierw utworzyć obiekt opcji Firebase, aby przechowywać dane konfiguracyjne aplikacji Firebase. Pełna dokumentacja opcji znajduje się w dokumentacji referencyjnej API dla następujących klas:

Użycie tych klas do obsługi wielu projektów w aplikacji pokazano w następujących przykładach:

Szybki

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

Sieć

// 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>");

Jedność

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'
};

Jawa

FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountKey.json");

FirebaseOptions secondaryAppConfig = new FirebaseOptions.Builder()
  .setCredential(FirebaseCredentials.fromCertificate(serviceAccount))
  .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
  .build();

Po zainicjowaniu tego obiektu opcji możesz użyć go do skonfigurowania dodatkowej instancji aplikacji Firebase. Zauważ, że we wszystkich poniższych przykładach używamy string second . Ta nazwa służy do pobierania instancji aplikacji i odróżniania jej od innych instancji, w tym instancji domyślnej (o nazwie [DEFAULT] ). Wybierz ciąg odpowiedni do zamierzonego zastosowania innego projektu Firebase.

Poniższe fragmenty pokazują połączenie z alternatywną Bazą danych czasu rzeczywistego (interfejsy API dla innych funkcji Firebase są zgodne z tym samym wzorcem).

Szybki

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

Sieć

// 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);

Jedność

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

Jawa

// Initialize another app with a different config
FirebaseApp secondaryApp = FirebaseApp.initializeApp(secondaryAppConfig, "secondary");

// Retrieve the database.
FirebaseDatabase secondaryDatabase = FirebaseDatabase.getInstance(secondaryApp);

Zapewnij wiarygodne raportowanie dla Analytics

Google Analytics zbiera zdarzenia na bardzo wczesnym etapie uruchamiania aplikacji, w niektórych przypadkach przed skonfigurowaniem podstawowego wystąpienia aplikacji Firebase. W takich przypadkach Firebase odwołuje się do zasobu Androida lub GoogleService-Info.plist na platformach Apple, aby wyszukać prawidłowy identyfikator aplikacji Google do przechowywania zdarzeń. Z tego powodu zalecamy, gdy tylko jest to możliwe, używanie domyślnych metod konfiguracji.

Jeśli wymagana jest konfiguracja środowiska wykonawczego, zwróć uwagę na następujące zastrzeżenia:

  1. Jeśli korzystasz z AdMob i żądasz reklam przy uruchamianiu zgodnie z zaleceniami, możesz pominąć niektóre dane Analytics związane z reklamami mobilnymi, jeśli nie korzystasz z konfiguracji opartej na zasobach.
  2. Zawsze podawaj tylko jeden identyfikator aplikacji Google w każdym rozproszonym wariancie swojej aplikacji. Jeśli na przykład wyślesz wersję 1 swojej aplikacji z określonym GOOGLE_APP_ID w konfiguracji, a następnie prześlesz wersję 2 z innym identyfikatorem, może to spowodować utratę danych analitycznych.
  3. Na platformach Apple nie dodawaj GoogleService-Info.plist do projektu, jeśli w czasie wykonywania dostarczasz inną konfigurację, ponieważ może to spowodować widoczną zmianę GOOGLE_APP_ID i utratę danych Analytics.