Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

配置多個項目

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

許多應用程序只需要在使用入門指南描述了單個火力地堡項目和默認設置。何時可以使用多個 Firebase 項目的示例包括:

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

支持不同環境

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

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

Android和iOS(以及它們的統一和C ++包裝)通常從配置文件加載配置: GoogleService-Info.plist iOS和google-services.json在Android。這些文件讀入一個選項對象( FIROptionFirebaseOptions由該火力地堡應用對象(標記) FIRAppFirebaseApp )。

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

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

默認情況下, 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文件是由谷歌服務gradle這個插件加工成Android的字符串資源。你可以看到哪些資源對谷歌服務的插件文檔中創建處理JSON文件

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

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

要了解更多信息,請參閱谷歌服務插件文件添加JSON文件

這些資源隨後被裝載FirebaseInitProvider ,您的應用程序代碼之前運行,並使用初始化這些值火力地堡的API。

由於此提供程序只是讀取具有已知名稱的資源,因此另一種選擇是將字符串資源直接添加到您的應用程序中,而不是使用 Google 服務 gradle 插件。您可以通過以下方式執行此操作:

  • 刪除google-services從根插件build.gradle
  • 刪除google-services.json從項目
  • 直接添加字符串資源
  • 刪除apply plugin: 'com.google.gms.google-services'從你的應用build.gradle

在您的應用程序中使用多個項目

有時您需要使用相同的 API 訪問不同的項目——例如,訪問多個數據庫實例。在大多數情況下,有一個中央 Firebase 應用程序對象來管理所有 Firebase API 的配置。該對像作為您正常設置的一部分進行初始化。但是,當您想從單個應用程序訪問多個項目時,您需要一個不同的 Firebase 應用程序對象來單獨引用每個項目。由您來初始化這些其他實例。

在這兩種情況下,您都需要先創建一個 Firebase 選項對象來保存 Firebase 應用程序的配置數據。可以在以下類的 API 參考文檔中找到選項的完整文檔:

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

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

爪哇

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

科特林+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 應用程序實例。注意,在所有我們下面所示的例子使用的字符串次要的。該名稱用於檢索應用程序實例,並且將其與其他實例,包括默認實例區分(名為[默認])。您應該選擇一個適合其他 Firebase 項目的預期用途的字符串。

以下代碼段演示瞭如何連接到備用實時數據庫(其他 Firebase 功能的 API 遵循相同的模式)。

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)

爪哇

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

// Retrieve secondary FirebaseApp
FirebaseApp secondary = FirebaseApp.getInstance("secondary");

科特林+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 應用實例之前。在這些情況下,火力地堡指的是Android的資源或GoogleService-Info.plist iOS上正確的谷歌應用程序ID查找存儲的事件。因此,我們建議盡可能使用默認配置方法。

如果需要運行時配置,請注意以下注意事項:

  1. 如果您使用 AdMob 並按照建議在啟動時請求廣告,那麼在不使用基於資源的配置方法時,您可能會錯過一些與移動廣告相關的 Analytics 數據。
  2. 在您的應用程序的每個分佈式變體中只提供一個 Google 應用程序 ID。例如,如果您運送您的應用程序的版本1具有一定GOOGLE_APP_ID在配置然後上傳2版用不同的ID,它可能會導致分析數據被丟棄。
  3. 在iOS上,不GoogleService-的Info.plist添加到您的項目,如果你是提供在運行時不同的配置,因為這可能導致一個明顯的變化GOOGLE_APP_ID並導致丟失分析。