На этой странице описано, как использовать более одного проекта Firebase в вашем приложении.
Для многих приложений достаточно одного проекта Firebase и стандартной настройки, описанной в руководствах по началу работы . Примеры ситуаций, когда может быть полезно использовать несколько проектов Firebase, включают:
- Настройка среды разработки для использования различных проектов Firebase в зависимости от типа сборки или целевой платформы.
- Доступ к содержимому из нескольких проектов Firebase в вашем приложении.
Поддержка различных сред
Один из распространенных вариантов использования — поддержка отдельных проектов Firebase для среды разработки и производственной среды.
Веб- и административные SDK настраиваются путем прямой передачи значений в их функции инициализации. Для этих SDK можно использовать проверку во время выполнения для выбора переменных конфигурации для разработки или для производственной среды.
Платформы Android и Apple (а также их оболочки Unity и C++) обычно загружают конфигурацию из конфигурационного файла: GoogleService-Info.plist на платформе Apple и на Android. Эти файлы считываются в объект параметров ( FIROption или FirebaseOptions ), на который ссылается объект приложения Firebase ( FIRApp или FirebaseApp ).
Для этих платформ переключение между средами обычно осуществляется на этапе сборки с использованием различных конфигурационных файлов для каждой среды.
Поддержка нескольких сред разработки в вашем приложении Apple
По умолчанию метод FirebaseApp.configure() загружает файл GoogleService-Info.plist входящий в состав приложения. Если ваша среда разработки и производственная среда настроены как отдельные целевые среды в Xcode, вы можете:
- Загрузите оба файла
GoogleService-Info.plist - Сохраните два файла в разных директориях.
- Добавьте оба варианта в свой проект Xcode.
- С помощью панели «Участие в целевых объектах» свяжите различные файлы с различными целевыми объектами:

Если сборки являются частью одной цели, наилучший вариант — присвоить обоим конфигурационным файлам уникальные имена (например, GoogleService-Info-Free.plist и GoogleService-Info-Paid.plist ). Затем во время выполнения выберите, какой файл plist загрузить. Это показано в следующем примере:
// Load a named file. guard let filePath = Bundle.main.path(forResource: "MyGoogleService", ofType: "plist"), let fileOptions = FirebaseOptions(contentsOfFile: filePath) else { fatalError("Couldn't load config file.") } FirebaseApp.configure(options: fileOptions)
Поддержка нескольких сред разработки в вашем Android-приложении
В проектах Android файл конфигурации обрабатывается плагином Gradle и преобразуется в строковые ресурсы Android. Подробнее о том, какие ресурсы создаются плагином, читайте в разделе «Как обрабатывается файл конфигурации JSON» .
Для каждого варианта сборки можно создать отдельный конфигурационный файл разместив его в отдельной директории, названной в честь соответствующего варианта, в корневом каталоге модуля приложения. Например, если у вас есть варианты сборки "development" и "release", ваша конфигурация может быть организована следующим образом:
app/
google-services.json
src/development/google-services.json
src/release/google-services.json
...
Для получения более подробной информации см. раздел «Добавление JSON-файла» .
Затем эти ресурсы загружаются компонентом FirebaseInitProvider , который выполняется перед кодом вашего приложения и инициализирует API Firebase, используя эти значения.
Поскольку этот провайдер считывает только ресурсы с известными именами, другой вариант — добавить строковые ресурсы непосредственно в ваше приложение, вместо использования плагина в Gradle. Это можно сделать следующим образом:
- Удаление плагина
Gradle из корневогоgoogle-services build.gradle - Удаление конфигурационного файла
из вашего проекта.google-services.json - Добавление строковых ресурсов напрямую.
- Удалите
apply plugin: 'com.google.gms.google-services'из файла `build.gradleвашего приложения.
Используйте несколько проектов в своем приложении.
Sometimes you need to access different projects using the same APIs - for example, accessing multiple database instances. In most cases there is a central Firebase application object that manages the configuration for all the Firebase APIs. This object is initialized as part of your normal setup. However, when you want to access multiple projects from a single application, you'll need a distinct Firebase application object to reference each one individually. It's up to you to initialize these other instances.
В обоих случаях сначала необходимо создать объект параметров Firebase для хранения данных конфигурации приложения Firebase. Полную документацию по параметрам можно найти в справочной документации API для следующих классов:
- Swift:
FirebaseOptions(googleAppID:gcmSenderID:) - Android:
FirebaseOptions.Builder - Веб:
initializeApp() - C++:
firebase::App::Create - Unity:
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.clientID = "27992087142-ola6qe637ulk8780vl8mo5vogegkm23n.apps.googleusercontent.com" secondaryOptions.databaseURL = "https://myproject.firebaseio.com" secondaryOptions.storageBucket = "myproject.appspot.com" secondaryOptions.deepLinkURLScheme = "myapp://" secondaryOptions.storageBucket = "projectid-12345.appspot.com" secondaryOptions.appGroupID = nil
Kotlin
// 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>"
};
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();
After you have initialized this options object, you can use it to configure an additional Firebase application instance. Note that in all the examples shown below we use the string secondary . This name is used to retrieve the application instance, and to distinguish it from other instances, including the default instance (named [DEFAULT] ). You should pick a string appropriate to the intended use of the other Firebase project.
Приведенные ниже фрагменты кода демонстрируют подключение к альтернативной Realtime Database (API для других функций Firebase следуют тому же принципу).
Быстрый
// Configure an alternative FIRApp. FirebaseApp.configure(name: "secondary", options: secondaryOptions) // Retrieve a previous created named app. guard let secondary = FirebaseApp.app(name: "secondary") else { fatalError("Could not retrieve secondary app") } // Retrieve a Real Time Database client configured against a specific app. let secondaryDb = Database.database(app: secondary)
Kotlin
// 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);
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 collects events very early in the app start up flow, in some occasions before the primary Firebase app instance has been configured. In these cases, Firebase refers to the Android resource or GoogleService-Info.plist on Apple platforms to look up the correct Google app ID to store events. For this reason, we recommend using the default configuration methods wherever possible.
Если требуется настройка во время выполнения, обратите внимание на следующие моменты:
- Если вы используете AdMob и запрашиваете показ рекламы при запуске, как рекомендуется, вы можете потерять некоторые данные аналитики, связанные с мобильной рекламой, если не используете подход с конфигурацией на основе ресурсов.
- В каждом распространяемом варианте вашего приложения указывайте только один идентификатор приложения Google (GOOGLE_APP_ID). Например, если вы выпустите версию 1 с определенным идентификатором
GOOGLE_APP_IDв конфигурации, а затем загрузите версию 2 с другим идентификатором, это может привести к потере аналитических данных. - На платформах Apple не добавляйте файл GoogleService-Info.plist в свой проект, если вы указываете другую конфигурацию во время выполнения, так как это может привести к видимому изменению
GOOGLE_APP_IDи потере данных Analytics.