Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Mengonfigurasi beberapa project

Halaman ini menjelaskan cara menggunakan lebih dari satu project Firebase di aplikasi.

Banyak aplikasi hanya memerlukan satu project Firebase dan penyiapan default seperti yang 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.
  • Mengakses konten dari beberapa project Firebase di aplikasi.

Mendukung beragam lingkungan

Salah satu kasus penggunaan yang umum adalah untuk mendukung project Firebase yang terpisah antara lingkungan pengembangan dan produksi Anda.

Web SDK dan Admin SDK dikonfigurasikan dengan langsung meneruskan nilai ke fungsi inisialisasinya. Untuk SDK ini, Anda dapat menggunakan pemeriksaan runtime guna memilih variabel konfigurasi pengembangan atau produksi.

Android dan iOS (beserta wrapper Unity dan C++-nya) biasanya memuat konfigurasi dari file konfigurasi: GoogleService-Info.plist di iOS dan google-services.json di Android. File ini dibaca ke objek opsi (FIROption atau FirebaseOptions) yang dirujuk oleh objek aplikasi Firebase (FIRApp atau FirebaseApp).

Untuk platform ini, pengalihan antar-lingkungan biasanya diimplementasikan sebagai keputusan waktu build, dengan menggunakan file konfigurasi yang berbeda untuk setiap lingkungan.

Mendukung beberapa lingkungan di aplikasi iOS Anda

Secara default, FirebaseApp.configure() akan memuat file GoogleService-Info.plist yang dipaketkan bersama aplikasi. Jika lingkungan pengembangan dan produksi dikonfigurasi sebagai target terpisah di Xcode, Anda dapat:

  • Mendownload kedua file GoogleService-Info.plist
  • Menyimpan kedua file di direktori berbeda
  • Menambahkan keduanya ke project Xcode Anda
  • Mengaitkan file yang berbeda dengan target yang berbeda menggunakan panel Target Membership:

Panel Target Membership

Jika build adalah bagian dari satu target, opsi terbaik adalah memberi nama unik untuk kedua file konfigurasi (misalnya GoogleService-Info-Free.plist dan GoogleService-Info-Paid.plist). Lalu pilih pada runtime plist mana yang ingin dimuat. 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-service.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 di depan kode aplikasi Anda dan menginisialisasi Firebase API menggunakan nilai tersebut.

Karena penyedia ini hanya membaca resource dengan nama yang sudah diketahui, opsi lainnya adalah menambahkan resource string langsung di 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, 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 masing-masing project. Anda sendiri yang perlu menginisialisasi instance lainnya ini.

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 ini untuk mendukung beberapa project di aplikasi ditunjukkan dalam contoh berikut:

iOS

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

Web

// The following fields are REQUIRED:
//  - Project ID
//  - App ID
//  - API Key
var 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: admin.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 menginisialisasi objek opsi ini, 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 menghubungkan ke Realtime Database alternatif (API untuk fitur Firebase lainnya mengikuti pola yang sama).

iOS

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

Web

// Initialize another app with a different config
var 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 = admin.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 sangat awal pada alur pengaktifan aplikasi, dalam beberapa kasus sebelum instance aplikasi Firebase utama dikonfigurasi. Dalam kasus ini, Firebase merujuk resource Android atau GoogleService-Info.plist di iOS untuk mencari ID aplikasi Google yang benar untuk menyimpan peristiwa. Karena alasan ini, sebaiknya gunakan metode konfigurasi default jika memungkinkan.

Jika konfigurasi runtime diperlukan, perhatikan peringatan berikut:

  1. Jika Anda 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 iOS, jangan tambahkan GoogleService-Info.plist ke project jika Anda memberikan konfigurasi yang berbeda pada runtime karena hal ini seolah dapat langsung mengubah GOOGLE_APP_ID dan menghilangkan Analytics.