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 dijelaskan dalam panduan Memulai. Contoh penggunaan beberapa project Firebase yang berguna 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 mendukung project Firebase yang terpisah untuk lingkungan pengembangan dan produksi Anda.

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

Android dan iOS (beserta wrapper Unity dan C++) biasanya memuat konfigurasi dari file konfigurasi: GoogleService-Info.plist di iOS dan google-services.json di Android. File ini dibaca ke dalam 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 pembuatan, melalui penggunaan berbagai file konfigurasi untuk setiap lingkungan.

Mendukung beberapa lingkungan dalam aplikasi iOS Anda

Secara default, FirebaseApp.configure() akan memuat file GoogleService-Info.plist yang dipaket dengan 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 Keanggotaan Target:

Panel Keanggotaan Target

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). Kemudian, saat runtime, pilih plist yang akan 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 oleh plugin gradle Layanan Google. Anda dapat melihat resource yang dibuat dalam dokumentasi Plugin Layanan Google mengenai cara Memproses file JSON.

Anda dapat memiliki beberapa file google-services.json untuk variasi build yang berlainan, dengan menempatkan file google-services.json di direktori khusus yang diberi nama untuk setiap variasi pada root modul aplikasi. Misalnya, jika Anda memiliki 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 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 root build.gradle
  • 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 dalam aplikasi

Terkadang Anda memerlukan akses ke berbagai project menggunakan API yang sama - misalnya, mengakses beberapa instance database. Dalam sebagian besar kasus, terdapat 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 sebuah aplikasi, diperlukan objek aplikasi Firebase unik untuk mereferensikan masing-masing project. Sementara itu, Anda dapat menginisialisasi instance lainnya sesuka hati.

Pada kedua kasus tersebut, Anda harus membuat objek opsi Firebase terlebih dahulu guna menahan data konfigurasi untuk aplikasi Firebase. Dokumentasi lengkap mengenai opsi ini tersedia di dokumentasi referensi API untuk class berikut:

Penggunaan kelas ini untuk mendukung beberapa project dalam aplikasi ditunjukkan dalam contoh berikut:

iOS

// Configure with manual options.
let secondaryOptions = FirebaseOptions(googleAppID: "1:27992087142:ios:2a4732a34787067a", gcmSenderID: "27992087142")
secondaryOptions.bundleID = "com.google.firebase.devrel.FiroptionConfiguration"
secondaryOptions.apiKey = "AIzaSyBicqfAZPvMgC7NZkjayUEsrepxuXzZDsk"
secondaryOptions.clientID = "27992087142-ola6qe637ulk8780vl8mo5vogegkm23n.apps.googleusercontent.com"
secondaryOptions.databaseURL = "https://myproject.firebaseio.com"
secondaryOptions.storageBucket = "myproject.appspot.com"

Java
Android

// Manually configure Firebase Options
FirebaseOptions options = new FirebaseOptions.Builder()
        .setApplicationId("1:27992087142:android:ce3b6448250083d1") // Required for Analytics.
        .setApiKey("AIzaSyADUe90ULnQDuGShD9W23RDP0xmeDc6Mvw") // Required for Auth.
        .setDatabaseUrl("https://myproject.firebaseio.com") // Required for RTDB.
        .build();

Kotlin
Android

// Manually configure Firebase Options
val options = FirebaseOptions.Builder()
        .setApplicationId("1:27992087142:android:ce3b6448250083d1") // Required for Analytics.
        .setApiKey("AIzaSyADUe90ULnQDuGShD9W23RDP0xmeDc6Mvw") // Required for Auth.
        .setDatabaseUrl("https://myproject.firebaseio.com") // Required for RTDB.
        .build()

Web

var secondaryAppConfig = {
    apiKey: "<API_KEY>",
    authDomain: "<PROJECT_ID>.firebaseapp.com",
    databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
    storageBucket: "<BUCKET>.appspot.com",
};

C++

firebase::AppOptions secondary_app_options;
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>");

Unity

Firebase.AppOptions secondaryAppOptions = new Firebase.AppOptions {
  ApiKey = "<API_KEY>",
  AppId = "<GOOGLE_APP_ID>",
  ProjectId = "<PROJECT_ID>"
};

Node.js

var admin = require("firebase-admin");

var serviceAccount = require("path/to/serviceAccountKey.json");

var secondaryAppConfig = {
  credential: admin.credential.cert(serviceAccount),
  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 terhubung ke Realtime Database (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
Android

// Initialize with secondary app.
FirebaseApp.initializeApp(this /* Context */, options, "secondary");

// Retrieve secondary app.
FirebaseApp secondary = FirebaseApp.getInstance("secondary");
// Get the database for the other app.
FirebaseDatabase secondaryDatabase = FirebaseDatabase.getInstance(secondary);

Kotlin
Android

// Initialize with secondary app.
FirebaseApp.initializeApp(this /* Context */, options, "secondary")

// Retrieve secondary app.
val secondary = FirebaseApp.getInstance("secondary")
// Get the database for the other app.
val secondaryDatabase = FirebaseDatabase.getInstance(secondary)

Web

// Initialize another app with a different config
var secondary = firebase.initializeApp(secondaryAppConfig, "secondary");

// Retrieve the database.
var secondaryDatabase = secondary.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
var secondary = firebase.initializeApp(secondaryAppConfig, "secondary");

// Retrieve the database.
var secondaryDatabase = secondary.database();

Java

// Initialize another app with a different config
FirebaseApp secondary = FirebaseApp.initializeApp(secondaryAppConfig, "secondary");

// Retrieve the database.
FirebaseDatabase otherDatabase = FirebaseDatabase.getInstance(otherApp);

Memastikan pelaporan yang andal untuk Analytics

Google Analytics untuk Firebase mengumpulkan peristiwa di awal alur aplikasi, dalam beberapa kejadian sebelum instance aplikasi Firebase yang utama dikonfigurasi. Dalam kasus ini, Firebase mengacu ke 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 hal-hal berikut:

  1. Jika Anda menggunakan AdMob dan meminta iklan pada saat startup seperti yang disarankan, Anda mungkin akan kehilangan beberapa data Analytics terkait iklan seluler saat tidak menggunakan pendekatan konfigurasi berbasis resource.
  2. Hanya berikan satu ID aplikasi Google di setiap variasi aplikasi yang terdistribusi. Misalnya, jika Anda mengirimkan versi 1 aplikasi Anda dengan GOOGLE_APP_ID tertentu di konfigurasi, lalu mengunggah versi 2 dengan ID yang lain, maka dapat menyebabkan data analytics dihapus.
  3. Di iOS, jangan tambahkan GoogleService-Info.plist ke project jika Anda memberikan konfigurasi yang berbeda saat runtime, karena hal ini dapat mengakibatkan perubahan GOOGLE_APP_ID dan hilangnya Analytics.

Kirim masukan tentang...

Butuh bantuan? Kunjungi halaman dukungan kami.