На этой странице описано, как использовать более одного проекта Firebase в вашем приложении.
Для многих приложений достаточно одного проекта Firebase и стандартной настройки, описанной в руководствах по началу работы . Примеры ситуаций, когда может быть полезно использовать несколько проектов Firebase, включают:
- Настройка среды разработки для использования различных проектов Firebase в зависимости от типа сборки или целевой платформы.
- Доступ к содержимому из нескольких проектов Firebase в вашем приложении.
Поддержка различных сред
Один из распространенных вариантов использования — поддержка отдельных проектов Firebase для среды разработки и производственной среды.
Веб- и административные SDK настраиваются путем прямой передачи значений в их функции инициализации. Для этих SDK можно использовать проверку во время выполнения для выбора переменных конфигурации для разработки или для производственной среды.
Платформы Android и Apple (а также их оболочки Unity и C++) обычно загружают конфигурацию из конфигурационного файла: GoogleService-Info.plist на платформе Apple и google-services.json на 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 файл google-services.json обрабатывается плагином Google Services Gradle и преобразуется в строковые ресурсы Android. Список создаваемых ресурсов можно посмотреть в документации по плагину Google Services в разделе «Обработка JSON-файла» .
Для разных вариантов сборки можно создать несколько файлов google-services.json google-services.json разместив их в отдельных каталогах, названных для каждого варианта, в корневом каталоге модуля приложения. Например, если у вас есть варианты сборки «development» и «release», ваша конфигурация может быть организована следующим образом:
app/
google-services.json
src/development/google-services.json
src/release/google-services.json
...
Для получения более подробной информации см. документацию по плагину Google Services, раздел «Добавление JSON-файла» .
Затем эти ресурсы загружаются компонентом FirebaseInitProvider , который выполняется перед кодом вашего приложения и инициализирует API Firebase, используя эти значения.
Поскольку этот провайдер считывает только ресурсы с известными именами, есть и другой вариант: добавить строковые ресурсы непосредственно в ваше приложение, вместо использования плагина Google Services для Gradle. Это можно сделать следующим образом:
- Удалите плагин
google-servicesиз корневого файлаbuild.gradle - Удалите файл
google-services.jsonиз вашего проекта. - Добавление строковых ресурсов напрямую.
- Удалите
apply plugin: 'com.google.gms.google-services'из файла `build.gradleвашего приложения.
Используйте несколько проектов в своем приложении.
Иногда вам необходимо получить доступ к разным проектам, используя одни и те же API — например, к нескольким экземплярам базы данных. В большинстве случаев существует центральный объект приложения Firebase, который управляет конфигурацией всех API Firebase. Этот объект инициализируется в рамках обычной настройки. Однако, если вы хотите получить доступ к нескольким проектам из одного приложения, вам потребуется отдельный объект приложения Firebase для ссылки на каждый из них по отдельности. Инициализацию этих дополнительных экземпляров вы должны выполнить самостоятельно.
В обоих случаях сначала необходимо создать объект параметров 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();
После инициализации этого объекта параметров вы можете использовать его для настройки дополнительного экземпляра приложения Firebase. Обратите внимание, что во всех приведенных ниже примерах мы используем строку secondary . Это имя используется для получения экземпляра приложения и для его отличия от других экземпляров, включая экземпляр по умолчанию (с именем [DEFAULT] ). Вам следует выбрать строку, соответствующую предполагаемому использованию другого проекта Firebase.
Приведенные ниже фрагменты кода демонстрируют подключение к альтернативной 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 собирает события на очень раннем этапе запуска приложения, в некоторых случаях еще до настройки основного экземпляра приложения Firebase. В таких случаях Firebase обращается к ресурсу Android или GoogleService-Info.plist на платформах Apple, чтобы найти правильный идентификатор приложения Google для хранения событий. По этой причине мы рекомендуем использовать методы настройки по умолчанию везде, где это возможно.
Если требуется настройка во время выполнения, обратите внимание на следующие моменты:
- Если вы используете AdMob и запрашиваете показ рекламы при запуске, как рекомендуется, вы можете потерять некоторые данные аналитики, связанные с мобильной рекламой, если не используете подход с конфигурацией на основе ресурсов.
- В каждом распространяемом варианте вашего приложения указывайте только один идентификатор приложения Google (GOOGLE_APP_ID). Например, если вы выпустите версию 1 с определенным идентификатором
GOOGLE_APP_IDв конфигурации, а затем загрузите версию 2 с другим идентификатором, это может привести к потере аналитических данных. - На платформах Apple не добавляйте файл GoogleService-Info.plist в свой проект, если вы указываете другую конфигурацию во время выполнения, так как это может привести к видимому изменению
GOOGLE_APP_IDи потере данных Analytics.