Halaman ini menjelaskan cara menggunakan lebih dari satu project Firebase di aplikasi.
Umumnya, aplikasi hanya memerlukan satu project Firebase, dengan penyiapan default sebagaimana dijelaskan dalam panduan Memulai. Contoh penggunaan beberapa project Firebase yang bermanfaat antara lain:
- Penyiapan lingkungan pengembangan untuk menggunakan berbagai project Firebase berdasarkan jenis atau target build.
- Pengaksesan konten dari beberapa project Firebase di aplikasi.
Mendukung beragam lingkungan
Salah satu kasus penggunaan yang umum adalah mendukung project Firebase yang terpisah antara lingkungan pengembangan dan lingkungan produksi Anda.
Web SDK dan Admin SDK dikonfigurasi dengan secara langsung meneruskan nilai ke fungsi inisialisasinya. Untuk kedua SDK ini, Anda dapat menggunakan pemeriksaan runtime guna memilih variabel konfigurasi pengembangan atau produksi.
Platform Android dan Apple (serta wrapper Unity dan C++-nya) biasanya memuat konfigurasi dari file konfigurasi: GoogleService-Info.plist
pada platform Apple dan google-services.json
pada Android. File ini dibaca ke objek opsi
(FIROption
atau FirebaseOptions
) yang dirujuk oleh objek
aplikasi Firebase (FIRApp
atau FirebaseApp
).
Untuk kedua platform ini, peralihan antarlingkungan biasanya diterapkan sebagai keputusan waktu build, melalui penggunaan file konfigurasi yang berbeda untuk setiap lingkungan.
Mendukung beberapa lingkungan di aplikasi Apple
Secara default, FirebaseApp.configure()
akan memuat file GoogleService-Info.plist
yang dipaketkan bersama aplikasi. Jika lingkungan pengembangan dan lingkungan produksi dikonfigurasi sebagai target terpisah di Xcode, Anda dapat:
- Mendownload kedua file
GoogleService-Info.plist
- Menyimpan keduanya di direktori berbeda
- Menambahkan keduanya ke project Xcode Anda
- Mengaitkan file yang berbeda tersebut dengan target yang berbeda menggunakan panel Target Membership:
Jika build adalah bagian dari satu target, opsi terbaiknya adalah memberi nama unik untuk kedua file konfigurasi (misalnya GoogleService-Info-Free.plist
dan GoogleService-Info-Paid.plist
). Lalu, pilih plist mana yang ingin dimuat saat runtime.
Hal ini ditunjukkan dalam contoh berikut:
// 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)
Mendukung beberapa lingkungan di aplikasi Android
Di Android, file google-services.json
diproses menjadi resource string
Android oleh plugin gradle Layanan Google. Anda dapat melihat resource apa saja yang dibuat di dokumentasi Plugin Layanan Google mengenai cara Memproses file JSON.
Anda dapat memiliki beberapa file google-services.json
untuk
varian build yang berbeda
dengan menempatkan file google-services.json
ke direktori tersendiri dengan nama khusus untuk setiap
varian dalam root modul aplikasi. Misalnya, jika Anda memiliki ragam build "development" dan "release", konfigurasi Anda dapat diatur seperti ini:
app/
google-services.json
src/development/google-services.json
src/release/google-services.json
...
Untuk mempelajari lebih lanjut, lihat dokumentasi Plugin Layanan Google mengenai cara Menambahkan file JSON.
Selanjutnya resource ini akan dimuat oleh FirebaseInitProvider yang berjalan sebelum kode aplikasi Anda dan menginisialisasi Firebase API menggunakan nilai tersebut.
Karena penyedia ini hanya membaca resource dengan nama yang diketahui, opsi lainnya adalah menambahkan resource string langsung ke aplikasi Anda, dan bukan menggunakan plugin gradle Layanan Google. Anda bisa melakukannya dengan:
- Menghapus plugin
google-services
daribuild.gradle
root Anda - Menghapus
google-services.json
dari project Anda - Menambahkan resource string secara langsung
- Menghapus
apply plugin: 'com.google.gms.google-services'
daribuild.gradle
aplikasi Anda
Menggunakan beberapa project di aplikasi
Terkadang Anda perlu mengakses berbagai project menggunakan API yang sama, misalnya ketika mengakses beberapa instance database. Dalam sebagian besar kasus, ada objek aplikasi Firebase pusat yang mengelola konfigurasi untuk semua Firebase API. Objek ini diinisialisasi sebagai bagian dari penyiapan normal. Namun, saat Anda ingin mengakses beberapa project dari satu aplikasi, diperlukan objek aplikasi Firebase unik untuk mereferensikan setiap project. Anda dapat menentukan untuk menginisialisasi instance lainnya ini atau tidak.
Pada kedua kasus tersebut, Anda harus membuat objek opsi Firebase terlebih dahulu guna menyimpan data konfigurasi untuk aplikasi Firebase. Dokumentasi lengkap mengenai opsi ini tersedia di dokumentasi referensi API untuk class berikut:
- Swift:
FirebaseOptions(googleAppID:gcmSenderID:)
- Android:
FirebaseOptions.Builder
- Web:
initializeApp()
- C++:
firebase::App::Create
- Unity:
FirebaseApp.Create
- Node.js:
initializeApp
- Java:
FirebaseOptions.Builder
Penggunaan class di atas untuk mendukung beberapa project di aplikasi ditunjukkan dalam contoh berikut:
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();
Web
// 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();
Setelah objek opsi ini diinisialisasi, Anda dapat menggunakannya untuk mengonfigurasi instance aplikasi Firebase tambahan. Perlu diperhatikan bahwa semua contoh yang ditunjukkan di bawah menggunakan string secondary. Nama ini digunakan untuk mengambil instance aplikasi, dan untuk membedakannya dari instance lain, termasuk instance default (bernama [DEFAULT]). Sebaiknya pilih string yang sesuai dengan tujuan penggunaan project Firebase lainnya tersebut.
Cuplikan berikut menunjukkan proses penghubungan ke Realtime Database alternatif (API untuk fitur Firebase lainnya mengikuti pola yang sama).
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");
Web
// 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);
Memastikan pelaporan yang andal untuk Analytics
Google Analytics mengumpulkan peristiwa di awal alur pengaktifan aplikasi, dalam
beberapa kasus sebelum instance aplikasi Firebase utama dikonfigurasi. Dalam kasus ini, Firebase merujuk ke resource Android atau GoogleService-Info.plist
di platform Apple untuk mencari ID aplikasi Google yang benar guna menyimpan peristiwa. Karena alasan ini, sebaiknya gunakan metode konfigurasi default jika memungkinkan.
Jika konfigurasi runtime diperlukan, perhatikan peringatan berikut:
- Jika menggunakan AdMob dan meminta iklan pada saat pengaktifan seperti yang disarankan, Anda mungkin akan kehilangan beberapa data Analytics terkait iklan seluler saat tidak menggunakan pendekatan konfigurasi berbasis resource.
- Sediakan hanya satu ID aplikasi Google di setiap varian aplikasi Anda yang didistribusikan. Misalnya, jika Anda mengupload versi 1 aplikasi dengan
GOOGLE_APP_ID
tertentu dalam konfigurasi, lalu mengupload versi 2 dengan ID yang berbeda, tindakan tersebut dapat menyebabkan data analisis dihapus. - Di platform Apple, jangan tambahkan GoogleService-Info.plist ke project jika Anda memberikan konfigurasi yang berbeda pada runtime karena hal ini dapat mengubah
GOOGLE_APP_ID
secara signifikan dan menyebabkan hilangnya Analytics.