本頁介紹如何在您的應用中使用多個 Firebase 項目。
許多應用只需要一個 Firebase 項目和入門指南中描述的默認設置。何時可以使用多個 Firebase 項目的示例包括:
- 設置您的開發環境以根據構建類型或目標使用不同的 Firebase 項目。
- 在您的應用中訪問來自多個 Firebase 項目的內容。
支持不同環境
一個常見的用例是為您的開發和生產環境支持單獨的 Firebase 項目。
Web 和 Admin SDK 是通過直接將值傳遞給它們的初始化函數來配置的。對於這些 SDK,您可以使用運行時檢查來選擇開發或生產配置變量。
Android 和 Apple 平台(及其 Unity 和 C++ 包裝器)通常從配置文件加載配置:Apple 平台上GoogleService-Info.plist
和 Android 上google-services.json
。這些文件被讀入 Firebase 應用程序對象( FIRApp
或FirebaseOptions
)引用的選項對象( FIROption
或FirebaseApp
)。
對於這些平台,通過為每個環境使用不同的配置文件,環境之間的切換通常作為構建時間決策來實現。
在您的 Apple 應用程序中支持多種環境
默認情況下, FirebaseApp.configure()
將加載與應用程序捆綁在一起的GoogleService-Info.plist
文件。如果您的開發和生產環境在 Xcode 中配置為單獨的目標,您可以:
- 下載兩個
GoogleService-Info.plist
文件 - 將兩個文件存放在不同目錄
- 將兩者都添加到您的 Xcode 項目中
- 使用 Target Membership 面板將不同的文件與不同的目標相關聯:
如果構建是單個目標的一部分,最好的選擇是為兩個配置文件指定唯一的名稱(例如GoogleService-Info-Free.plist
和GoogleService-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 服務 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 參考文檔中找到選項的完整文檔:
- 斯威夫特:
FirebaseOptions(googleAppID:gcmSenderID:)
- 安卓:
FirebaseOptions.Builder
- 網頁:
initializeApp()
- C++:
firebase::App::Create
- 統一:
FirebaseApp.Create
- Node.js:
initializeApp
應用程序 - Java:
FirebaseOptions.Builder
以下示例顯示了使用這些類來支持應用程序中的多個項目:
迅速
// 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>");
統一
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)
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);
統一
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 來存儲事件。因此,我們建議盡可能使用默認配置方法。
如果需要運行時配置,請注意以下注意事項:
- 如果您使用 AdMob 並按照建議在啟動時請求廣告,則在不使用基於資源的配置方法時,您可能會錯過一些與移動廣告相關的分析數據。
- 僅在應用的每個分佈式變體中提供一個 Google 應用 ID。例如,如果您在配置中使用特定的
GOOGLE_APP_ID
發布應用程序的版本 1,然後上傳具有不同 ID 的版本 2,則可能會導致分析數據丟失。 - 在 Apple 平台上,如果您在運行時提供不同的配置,請不要將 GoogleService-Info.plist 添加到您的項目中,因為這可能會導致
GOOGLE_APP_ID
發生明顯變化並導致 Analytics 丟失。