Skonfiguruj wiele projektów

Z tego artykułu dowiesz się, jak korzystać w swojej aplikacji z więcej niż 1 projektu Firebase.

Wiele aplikacji wymaga tylko jednego projektu Firebase i domyślnej konfiguracji opisane w przewodnikach Pierwsze kroki. Przykłady zastosowania tej funkcji aby korzystać z wielu projektów Firebase, należy:

  • Konfigurowanie środowiska programistycznego pod kątem korzystania z różnych projektów Firebase na podstawie typu kompilacji lub celu.
  • dostęp do treści z wielu projektów Firebase w Twojej aplikacji;

Obsługa różnych środowisk

Jednym z częstych przypadków użycia jest obsługa osobnych projektów Firebase podczas programowania. oraz środowiska produkcyjne.

Internetowe i administracyjne pakiety SDK są konfigurowane bezpośrednio i przekazuje wartości do swoich funkcji inicjowania. W przypadku tych pakietów SDK możesz użyć w czasie działania i w celu wyboru zmiennych konfiguracji programistycznej lub produkcyjnej.

Platformy Android i Apple (oraz ich kody Unity i C++) normalnie są wczytywane z pliku konfiguracji: GoogleService-Info.plist w Apple i google-services.json na Androidzie. Pliki te są odczytywane w obiekt opcji (FIROption lub FirebaseOptions), do którego odwołuje się funkcja Obiekt aplikacji Firebase (FIRApp lub FirebaseApp).

W przypadku takich platform przełączanie się między środowiskami jest zwykle implementowane jako decyzji w czasie kompilacji, przez wykorzystanie różnych plików konfiguracji dla każdego dla środowiska.

Obsługa wielu środowisk w aplikacji Apple

Domyślnie FirebaseApp.configure() wczyta plik GoogleService-Info.plist w pakiecie z aplikacją. Jeśli Twoje środowiska programistyczne i produkcyjne są skonfigurowane jako osobne cele w Xcode, możesz:

  • Pobierz oba pliki (GoogleService-Info.plist)
  • Umieść oba pliki w różnych katalogach.
  • Dodaj oba te elementy do projektu Xcode
  • Powiąż poszczególne pliki z różnymi środowiskami docelowymi za pomocą elementu docelowego Panel członkostwa:

Panel członkostwa docelowego

Jeśli kompilacje są częścią jednego środowiska docelowego, najlepszym rozwiązaniem jest przypisanie obu unikalne nazwy plików konfiguracji (np. GoogleService-Info-Free.plist i GoogleService-Info-Paid.plist). Następnie wybierz w czasie działania plik plist do wczytania. Widać to w tym przykładzie:

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

Na Androidzie plik google-services.json jest przetwarzany jako ciąg tekstowy Androida. za pomocą wtyczki Gradle usług Google. Możesz zobaczyć, jakie zasoby są tworzone w dokumentacji wtyczki Google Services na stronie Przetwarzam plik JSON.

Możesz mieć kilka plików google-services.json dla różnych utwórz warianty umieszczając google-services.json plik w specjalnych katalogach z nazwami w katalogu głównym modułu aplikacji. Na przykład, jeśli masz „Rozwój” oraz „release” w różnych rodzajach kompilacji, konfiguracja może być uporządkowana w następujący sposób:

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

Więcej informacji znajdziesz w dokumentacji wtyczki Google Services na stronie Dodaję plik JSON.

Zasoby te są następnie wczytywane przez FirebaseInitProvider, który działa przed kodem aplikacji i inicjuje interfejsy Firebase API za pomocą tych wartości.

Ponieważ ten dostawca czyta tylko zasoby o znanych nazwach, inny dostawca możesz dodać zasoby ciągu znaków bezpośrednio do aplikacji, zamiast używać za pomocą wtyczki Gradle usług Google. Możesz to zrobić w następujący sposób:

  • Usuwam wtyczkę google-services z katalogu głównego build.gradle
  • Usuwam google-services.json z projektu
  • Bezpośrednie dodawanie zasobów ciągu znaków
  • Usuwam pulę pamięci masowej apply plugin: 'com.google.gms.google-services' z aplikacji build.gradle

Używaj wielu projektów w swojej aplikacji

Czasami trzeba uzyskać dostęp do różnych projektów przy użyciu tych samych interfejsów API. np. dostępu do wielu instancji bazy danych. W większości przypadków Obiekt aplikacji Firebase, który zarządza konfiguracją wszystkich aplikacji Firebase API. Ten obiekt jest inicjowany w ramach standardowej konfiguracji. Gdy jednak jeśli chcesz mieć 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. Jest do Ciebie, aby zainicjować te inne instancje.

W obu przypadkach musisz najpierw utworzyć obiekt opcji Firebase do przechowywania dane konfiguracyjne aplikacji Firebase. Pełna dokumentacja dotyczące tych opcji można znaleźć w dokumentacji referencyjnej API dotyczącej następujące klasy:

Widoczne jest użycie tych klas do obsługi wielu projektów w aplikacji w tych przykładach:

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

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

Unity

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

Po zainicjowaniu tego obiektu opcji możesz użyć go do skonfigurowania instancji aplikacji Firebase. Pamiętaj, że we wszystkich pokazanych przykładach W tym przykładzie użyjemy ciągu dodatkowego. Ta nazwa służy do pobierania instancji aplikacji, oraz aby odróżniać ją od innych instancji, w tym instancję domyślną (o nazwie [DEFAULT]). Wybierz ciąg odpowiedni do do zamierzonego wykorzystania drugiego projektu Firebase.

Te fragmenty kodu ilustrują połączenie z alternatywnym elementem Realtime Database (interfejsy API innych funkcji Firebase opierają się na tym samym wzorcu).

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

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

Unity

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

Zadbaj o wiarygodność raportów dotyczących usługi Analytics

Google Analytics rejestruje zdarzenia na bardzo wczesnym etapie uruchamiania aplikacji, czyli w kilku przypadkach przed skonfigurowaniem głównej instancji aplikacji Firebase. W w tych przypadkach Firebase odnosi się do zasobu Androida lub GoogleService-Info.plist na platformach Apple, aby wyszukać odpowiednią aplikację Google Identyfikator zapisu zdarzeń. Z tego powodu zalecamy użycie domyślnej i metod konfiguracji.

Jeśli wymagana jest konfiguracja środowiska wykonawczego, pamiętaj o tych kwestiach:

  1. Jeśli używasz interfejsu AdMob i wysyłasz żądania reklam przy uruchamianiu zgodnie z zaleceniami, możesz: brakuje niektórych danych Analytics związanych z reklamami mobilnymi, gdy nie są wykorzystywane zasoby konfiguracji opartej na konfiguracji.
  2. Nigdy nie podawaj tylko jednego identyfikatora aplikacji Google w każdym rozproszonym wariancie aplikacji. Jeśli na przykład wysyłasz wersję 1 aplikacji z określoną wartością GOOGLE_APP_ID w lub prześlij do konfiguracji wersję 2 z innym identyfikatorem, może to spowodować do pomijania danych analitycznych.
  3. Na platformach Apple nie dodawaj do projektu pliku GoogleService-Info.plist, jeśli dostarczasz inną konfigurację w czasie wykonywania, co może spowodować pozorną zmianę o GOOGLE_APP_ID i skutkują utratą Analytics.