Mengonfigurasi beberapa project

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:

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 dari build.gradle root Anda
  • Menghapus google-services.json dari project Anda
  • Menambahkan resource string secara langsung
  • Menghapus apply plugin: 'com.google.gms.google-services' dari build.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:

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

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

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

  1. 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.
  2. Sediakan hanya satu ID aplikasi Google di setiap varian aplikasi Anda yang didistribusikan. Misalnya, jika Anda mengirimkan 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.
  3. 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.