Google 致力于为黑人社区推动种族平等。查看具体举措

配置多个项目

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

本页面介绍了如何在您的应用中使用多个 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发生明显变化并导致分析丢失。