設定多項專案

本頁面說明如何在應用程式中使用多個 Firebase 專案。

許多應用程式只需要單一 Firebase 專案和開始使用指南中所述的預設設定。以下列舉幾個適合使用多個 Firebase 專案的情況:

  • 設定開發環境以根據建構類型或目標使用不同的 Firebase 專案。
  • 在應用程式中存取多項 Firebase 專案的內容。

支援不同的環境

常見用途之一是針對開發環境和實際工作環境支援不同的 Firebase 專案。

網頁和 Admin SDK 是將值直接傳送至初始化函式進行設定。針對這些 SDK,您可以使用執行階段檢查來選取開發或實際工作環境設定變數。

Android 和 Apple 平台 (及其 Unity 和 C++ 包裝函式) 通常會從設定檔載入設定:Apple 平台的 GoogleService-Info.plist,Android 上的 google-services.json。這些檔案會讀取為 Firebase 應用程式物件 (FIRAppFirebaseApp) 參照的選項物件 (FIROptionFirebaseOptions)。

針對這些平台,通常藉由針對每個環境使用不同的設定檔,進行環境切換時,通常會做為建構時間的決策進行。

在 Apple 應用程式中支援多種環境

根據預設,FirebaseApp.configure() 會載入隨附應用程式的 GoogleService-Info.plist 檔案。如果您將開發和實際工作環境設為 Xcode 中的獨立目標,您可以:

  • 同時下載 GoogleService-Info.plist 個檔案
  • 將兩個檔案儲存在不同的目錄中
  • 將兩者新增至 Xcode 專案
  • 使用「目標成員資格」面板,將不同檔案與不同目標建立關聯:

目標成員資格面板

如果建構是單一目標的一部分,最佳做法是為兩個設定檔提供不重複的名稱 (例如 GoogleService-Info-Free.plistGoogleService-Info-Paid.plist)。然後在執行階段選擇要載入 plist 時。例如:

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

在 Android 應用程式中支援多種環境

在 Android 中,google-services.json 檔案是由 Google Services Gradle 外掛程式處理至 Android 字串資源。您可以在 Google 服務外掛程式說明文件處理 JSON 檔案部分查看已建立的資源。

您可以為不同的建構變數提供多個 google-services.json 檔案,只要將 google-services.json 檔案放在應用程式模組根目錄下每個變化版本命名的專屬目錄中即可。舉例來說,如果您有「Development」和「release」建構變種版本,則可按照以下方式整理設定:

app/
    google-services.json
    src/development/google-services.json
    src/release/google-services.json
    ...

詳情請參閱 Google 服務外掛程式說明文件的新增 JSON 檔案

接著,FirebaseInitProvider 會載入這些資源,並在應用程式程式碼之前執行,並使用這些值初始化 Firebase API。

由於這個供應器只會讀取已知名稱的資源,另一個選項是直接將字串資源新增至應用程式,而非使用 Google Services Gradle 外掛程式。方法如下:

  • 從根 build.gradle 移除 google-services 外掛程式
  • 從專案中刪除 google-services.json
  • 直接新增字串資源
  • 正在從您的應用程式「build.gradle」中刪除「apply plugin: 'com.google.gms.google-services'

在應用程式中使用多個專案

有時候,您會需要使用相同的 API 存取不同的專案,例如存取多個資料庫執行個體。在大部分情況下,會有一個中央 Firebase 應用程式物件,用來管理所有 Firebase API 的設定。這個物件會在一般設定中初始化。不過,若要從單一應用程式存取多項專案,就需要一個不同的 Firebase 應用程式物件來個別參照每個專案。其他執行個體是由您自行初始化。

不論是哪一種情況,您都需要先建立 Firebase 選項物件來保存 Firebase 應用程式的設定資料。您可以在下列類別的 API 參考說明文件中找到這些選項的完整說明文件:

使用這些類別支援應用程式中的多項專案,如以下範例所示:

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

網站

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

初始化此選項物件後,即可使用該物件設定其他 Firebase 應用程式執行個體。請注意,在下方所有範例中,我們都使用 secondary 字串。這個名稱可用於擷取應用程式執行個體,並與其他執行個體有所區別,包括預設執行個體 (名為 [DEFAULT])。建議您挑選適合其他 Firebase 專案用途的字串。

以下程式碼片段示範如何連線至替代即時資料庫 (其他 Firebase 功能的 API 遵循相同的模式)。

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");

網站

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

確保 Analytics (分析) 提供可靠的報表

Google Analytics (分析) 會在應用程式啟動流程的早期收集事件,有時則是在設定主要 Firebase 應用程式執行個體之前。在這種情況下,Firebase 是指 Android 資源,或 Apple 平台上的 GoogleService-Info.plist,查詢用來儲存事件的正確 Google 應用程式 ID。因此,我們建議您盡可能使用預設設定方法。

如果需要設定執行階段,請注意下列事項:

  1. 如果您使用 AdMob 並在啟動時要求廣告,如果沒有採用以資源為基礎的設定方法,就可能缺少與行動廣告相關的 Analytics (分析) 資料。
  2. 請只在應用程式的每個發布變化版本中提供一個 Google 應用程式 ID。舉例來說,如果您在設定中提供特定 GOOGLE_APP_ID 的第 1 版應用程式,並以其他 ID 上傳第 2 版,則可能會導致數據分析資料遭到捨棄。
  3. 在 Apple 平台上,如果您於執行階段提供不同的設定,請勿在專案中加入 GoogleService-Info.plist,否則可能會導致 GOOGLE_APP_ID 有重大變更,並導致 Analytics (分析) 遺失。