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:
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łównegobuild.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 aplikacjibuild.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:
- Swift:
FirebaseOptions(googleAppID:gcmSenderID:)
, - Android:
FirebaseOptions.Builder
- Przeglądarka:
initializeApp()
- C++:
firebase::App::Create
- Unity:
FirebaseApp.Create
- Node.js:
initializeApp
- Java:
FirebaseOptions.Builder
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:
- 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.
- 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. - 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.