Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

配置多個項目

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

本頁面介紹瞭如何在您的應用中使用多個 Firebase 項目。

許多應用只需要一個 Firebase 項目和入門指南中描述的默認設置。使用多個 Firebase 項目可能有用的示例包括:

  • 根據構建類型或目標設置您的開發環境以使用不同的 Firebase 項目。
  • 訪問您應用中多個 Firebase 項目的內容。

支持不同的環境

一種常見的用例是為您的開發和生產環境支持單獨的 Firebase 項目。

Web 和 Admin SDK 是通過直接將值傳遞給它們的初始化函數來配置的。對於這些 SDK,您可以使用運行時檢查來選擇開發或生產配置變量。

Android 和 Apple 平台(以及它們的 Unity 和 C++ 包裝器)通常從配置文件加載配置:Apple 平台上GoogleService-Info.plist和 Android 上google-services.json 。這些文件被讀入由 Firebase 應用程序對象( FIRAppFirebaseOptions )引用的選項對象( FIROptionFirebaseApp )。

對於這些平台,環境之間的切換通常作為構建時間決策來實現,通過為每個環境使用不同的配置文件。

在您的 Apple 應用程序中支持多種環境

默認情況下, FirebaseApp.configure()將加載與應用程序捆綁在一起的GoogleService-Info.plist文件。如果您的開發和生產環境在 Xcode 中配置為單獨的目標,您可以:

  • 下載兩個GoogleService-Info.plist文件
  • 將兩個文件存放在不同的目錄中
  • 將兩者都添加到您的 Xcode 項目中
  • 使用 Target Membership 面板將不同的文件與不同的目標相關聯:

目標會員面板

如果構建是單個目標的一部分,最好的選擇是為兩個配置文件指定唯一的名稱(例如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-service.json文件由 Google Services gradle 插件處理成 Android 字符串資源。您可以在處理 JSON 文件的 Google 服務插件文檔中查看創建了哪些資源。

通過將google-services.json文件放置在應用模塊根目錄下為每個變體命名的專用目錄中,您可以為不同的構建變體創建多個google-services.json文件。例如,如果您有“開發”和“發布”構建風格,您的配置可以這樣組織:

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

要了解更多信息,請參閱有關添加 JSON 文件的 Google 服務插件文檔。

然後這些資源由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 參考文檔中找到:

以下示例顯示了使用這些類來支持應用程序中的多個項目:

迅速

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

網絡

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

統一

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

節點.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'
};

爪哇

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 遵循相同的模式)。

迅速

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

網絡

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

統一

var secondaryApp = Firebase.FirebaseApp.Create(secondaryAppOptions, "Secondary"));
var secondaryDatabase = Firebase.Database.FirebaseDatabase.getInstance(secondaryApp);

節點.js

// Initialize another app with a different config
const secondary = initializeApp(secondaryAppConfig, 'secondary');
// Access services, such as the Realtime Database
// const secondaryDatabase = secondary.database();

爪哇

// 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發生明顯變化並導致分析丟失。