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

На этой странице описано, как использовать в своем приложении несколько проектов 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.
  • Свяжите разные файлы с разными целями, используя панель Target Membership:

Панель целевого членства

Если сборки являются частью одной цели, лучший вариант — дать обоим файлам конфигурации уникальные имена (например, GoogleService-Info-Free.plist и GoogleService-Info-Paid.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-services.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 Services. Вы можете сделать это следующим образом:

  • Удаление плагина 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

// 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.

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

// 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 и потере аналитики.