Настроить несколько проектов

На этой странице описывается, как использовать более одного проекта Firebase в вашем приложении.

Многим приложениям требуется только один проект Firebase и настройка по умолчанию, описанная в руководствах по началу работы . Примеры случаев, когда может быть полезно использовать несколько проектов Firebase, включают:

  • Настройка среды разработки для использования различных проектов Firebase в зависимости от типа сборки или цели.
  • Доступ к контенту из нескольких проектов Firebase в вашем приложении.

Поддержка различных сред

Одним из распространенных вариантов использования является поддержка отдельных проектов Firebase для вашей среды разработки и рабочей среды.

Web и Admin 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
  • Свяжите разные файлы с разными целями, используя панель 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 преобразуется в строковые ресурсы Android плагином Google Services gradle. Вы можете увидеть, какие ресурсы созданы, в документации по подключаемому модулю Google Services в разделе «Обработка файла JSON» .

Вы можете иметь несколько файлов google-services.json для разных вариантов сборки , поместив файлы google-services.json в специальные каталоги с именами для каждого варианта в корневом каталоге модуля приложения. Например, если у вас есть варианты сборки «разработка» и «выпуск», ваша конфигурация может быть организована следующим образом:

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

Дополнительные сведения см. в документации по подключаемому модулю Google Services в разделе Добавление файла JSON .

Затем эти ресурсы загружаются FirebaseInitProvider , который запускается перед кодом вашего приложения и инициализирует API Firebase, используя эти значения.

Поскольку этот провайдер просто читает ресурсы с известными именами, другой вариант — добавить строковые ресурсы непосредственно в ваше приложение, а не использовать плагин gradle Служб Google. Вы можете сделать это:

  • Удаление плагина google-services из вашего корневого build.gradle
  • Удаление google-services.json из вашего проекта
  • Добавление строковых ресурсов напрямую
  • Удаление apply plugin: 'com.google.gms.google-services' из вашего приложения build.gradle

Используйте несколько проектов в своем приложении

Иногда вам нужно получить доступ к разным проектам, используя одни и те же API, например, получить доступ к нескольким экземплярам базы данных. В большинстве случаев существует центральный объект приложения Firebase, который управляет конфигурацией всех API Firebase. Этот объект инициализируется как часть вашей обычной установки. Однако, если вы хотите получить доступ к нескольким проектам из одного приложения, вам понадобится отдельный объект приложения 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

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: "...",
};

С++

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'
};

Джава

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.

В следующих фрагментах показано подключение к альтернативной базе данных реального времени (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 { 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();

С++

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

Джава

// 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 для хранения событий. По этой причине мы рекомендуем использовать методы настройки по умолчанию везде, где это возможно.

Если требуется настройка во время выполнения, обратите внимание на следующие предостережения:

  1. Если вы используете AdMob и запрашиваете рекламу при запуске в соответствии с рекомендациями, вы можете пропустить некоторые данные Analytics, связанные с мобильными объявлениями, если не используете подход к настройке на основе ресурсов.
  2. Всегда предоставляйте только один идентификатор приложения Google в каждом распространенном варианте вашего приложения. Например, если вы отправите версию 1 своего приложения с определенным GOOGLE_APP_ID в конфигурации, а затем загрузите версию 2 с другим идентификатором, это может привести к удалению данных аналитики.
  3. На платформах Apple не добавляйте GoogleService-Info.plist в свой проект, если вы предоставляете другую конфигурацию во время выполнения, так как это может привести к явному изменению GOOGLE_APP_ID и потере Analytics.