Ir a la consola

Configura varios proyectos

En esta página se describe cómo usar más de un proyecto de Firebase en tu app.

Muchas apps solo necesitan un proyecto de Firebase y la configuración predeterminada que se describe en las guías para Comenzar. Entre los ejemplos de casos en los que puede ser útil usar varios proyectos de Firebase, se incluyen los siguientes:

  • La configuración del entorno de programación para usar diferentes proyectos de Firebase a partir del tipo de compilación o el destino
  • Acceso al contenido de varios proyectos de Firebase en la app.

Compatibilidad con diferentes entornos

Un caso práctico común es tener proyectos de Firebase independientes para los entornos de desarrollo y producción.

Los SDK Web y Admin se configuran pasando valores directamente a sus funciones de inicialización. Para estos SDK, puedes usar una verificación de tiempo de ejecución para seleccionar variables de configuración de desarrollo o de producción.

iOS y Android (y sus envoltorios Unity y C++) por lo general cargan la configuración desde un archivo de configuración: GoogleService-Info.plist en iOS y google-services.json en Android. Estos archivos se leen en un objeto de opciones (FIROption o FirebaseOptions), al que el objeto de aplicación de Firebase (FIRApp o FirebaseApp) hace referencia.

Para estas plataformas, el cambio de un entorno a otro se implementa, por lo general, como decisión en el momento de la compilación, mediante el uso de distintos archivos de configuración para cada entorno.

Compatibilidad con varios entornos en tu aplicación para iOS

De manera predeterminada, FirebaseApp.configure() cargará el archivo GoogleService-Info.plist que se incluye en la aplicación. Si tus entornos de desarrollo y producción están configurados en diferentes objetivos en Xcode, puedes hacer lo siguiente:

  • Descargar los dos archivos GoogleService-Info.plist
  • Almacenarlos en directorios diferentes
  • Agregar ambos a tu proyecto Xcode
  • Asociar los archivos correspondientes con los diferentes objetivos a través del panel Target Membership:

Panel Target Membership

Si las compilaciones corresponden a un solo objetivo, la mejor opción es definir un nombre distinto para cada archivo de configuración (p. ej., GoogleService-Info-Free.plist y GoogleService-Info-Paid.plist). Luego, elige en el tiempo de ejecución qué archivo cargar. Esto se muestra en el siguiente ejemplo:

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

Compatibilidad con varios entornos en tu aplicación para Android

En Android, el archivo google-service.json se incorpora en recursos de strings de Android mediante el complemento Gradle de Google Services. Puedes ver qué recursos se crean en la documentación del complemento de Google Services, en cómo procesar el archivo JSON.

Puedes tener varios archivos google-services.json para diferentes variantes de compilación. Si así lo deseas, debes colocar los archivos google-services.json en directorios independientes que tengan el nombre de cada variante y se ubiquen en el directorio raíz del módulo de la app. Por ejemplo, si tienes versiones “development” y “release” de la compilación, puedes organizar la configuración de la siguiente manera:

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

Para obtener más información, consulta la documentación del complemento de Google Services en cómo agregar el archivo JSON.

Luego, el FirebaseInitProvider, que se ejecuta antes que el código de tu aplicación y después inicializa las API de Firebase con esos valores, carga estos recursos.

Debido a que este proveedor simplemente lee los recursos con un nombre conocido, otra opción es agregar los recursos de strings directamente a tu app, en lugar de usar el complemento Gradle de Google Services. Para ello, tienes las siguientes opciones:

  • Quitar el complemento google-services de tu raíz build.gradle
  • Borrar google-services.json de tu proyecto
  • Agregar los recursos de strings directamente
  • Borrar apply plugin: 'com.google.gms.google-services' de tu aplicación build.gradle

Cómo usar varios proyectos en tu aplicación

A veces necesitas acceder a diferentes proyectos con las mismas API; por ejemplo, para consultar varias instancias de bases de datos. En la mayoría de los casos, existe un objeto central de aplicación de Firebase que administra la configuración de todas las API de Firebase. Este objeto se inicializa como parte de tu configuración normal. Sin embargo, cuando quieres tener acceso a varios proyectos desde una sola aplicación, necesitas un objeto de aplicación de Firebase independiente para hacer referencia a cada uno de manera individual. La decisión de inicializar estas otras instancias depende de ti.

En ambos casos, primero necesitas crear un objeto de opciones de Firebase que contenga los datos de configuración de la aplicación de Firebase. Puedes encontrar la documentación completa sobre estas opciones en la documentación de referencia de la API para los siguientes casos:

En los siguientes ejemplos, se muestra cómo usar estas clases para trabajar en varios proyectos con una aplicación:

iOS

// Configure with manual options.
let secondaryOptions = FirebaseOptions(googleAppID: "1:27992087142:ios:2a4732a34787067a", gcmSenderID: "27992087142")
secondaryOptions.bundleID = "com.google.firebase.devrel.FiroptionConfiguration"
secondaryOptions.apiKey = "AIzaSyBicqfAZPvMgC7NZkjayUEsrepxuXzZDsk"
secondaryOptions.clientID = "27992087142-ola6qe637ulk8780vl8mo5vogegkm23n.apps.googleusercontent.com"
secondaryOptions.databaseURL = "https://myproject.firebaseio.com"
secondaryOptions.storageBucket = "myproject.appspot.com"

Java
Android

// Manually configure Firebase Options
FirebaseOptions options = new FirebaseOptions.Builder()
        .setApplicationId("1:27992087142:android:ce3b6448250083d1") // Required for Analytics.
        .setApiKey("AIzaSyADUe90ULnQDuGShD9W23RDP0xmeDc6Mvw") // Required for Auth.
        .setDatabaseUrl("https://myproject.firebaseio.com") // Required for RTDB.
        .build();

Kotlin
Android

// Manually configure Firebase Options
val options = FirebaseOptions.Builder()
        .setApplicationId("1:27992087142:android:ce3b6448250083d1") // Required for Analytics.
        .setApiKey("AIzaSyADUe90ULnQDuGShD9W23RDP0xmeDc6Mvw") // Required for Auth.
        .setDatabaseUrl("https://myproject.firebaseio.com") // Required for RTDB.
        .build()

Web

var secondaryAppConfig = {
    apiKey: "<API_KEY>",
    authDomain: "<PROJECT_ID>.firebaseapp.com",
    databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
    storageBucket: "<BUCKET>.appspot.com",
};

C++

firebase::AppOptions secondary_app_options;
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>");

Unity

Firebase.AppOptions secondaryAppOptions = new Firebase.AppOptions {
  ApiKey = "<API_KEY>",
  AppId = "<GOOGLE_APP_ID>",
  ProjectId = "<PROJECT_ID>"
};

Node.js

var admin = require("firebase-admin");

var serviceAccount = require("path/to/serviceAccountKey.json");

var secondaryAppConfig = {
  credential: admin.credential.cert(serviceAccount),
  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();

Después de inicializar este objeto de opciones, puedes usarlo para configurar una instancia adicional de una aplicación de Firebase. Ten en cuenta que, en todos los ejemplos que se muestran a continuación, usamos la string secondary. Este nombre se usa para recuperar la instancia de la aplicación y para distinguirla de otras instancias, incluida la instancia inicial (llamada [DEFAULT]). Debes elegir una string adecuada según el uso que deseas darle al otro proyecto de Firebase.

Los siguientes fragmentos demuestran la conexión a una Realtime Database (las API para otras funciones de Firebase siguen el mismo patrón).

iOS

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

// Initialize with secondary app.
FirebaseApp.initializeApp(this /* Context */, options, "secondary");

// Retrieve secondary app.
FirebaseApp secondary = FirebaseApp.getInstance("secondary");
// Get the database for the other app.
FirebaseDatabase secondaryDatabase = FirebaseDatabase.getInstance(secondary);

Kotlin
Android

// Initialize with secondary app.
FirebaseApp.initializeApp(this /* Context */, options, "secondary")

// Retrieve secondary app.
val secondary = FirebaseApp.getInstance("secondary")
// Get the database for the other app.
val secondaryDatabase = FirebaseDatabase.getInstance(secondary)

Web

// Initialize another app with a different config
var secondary = firebase.initializeApp(secondaryAppConfig, "secondary");

// Retrieve the database.
var secondaryDatabase = secondary.database();

C++

firebase::App* secondary_app = firebase::App::Create(secondary_app_options, "Secondary");
firebase::database::Database* secondary_database = firebase::database::Database::GetInstance(secondary_app);

Unity

var secondaryApp = Firebase.FirebaseApp.Create(secondaryAppOptions, "Secondary"));
var secondaryDatabase = Firebase.Database.FirebaseDatabase.getInstance(secondaryApp);

Node.js

// Initialize another app with a different config
var secondary = firebase.initializeApp(secondaryAppConfig, "secondary");

// Retrieve the database.
var secondaryDatabase = secondary.database();

Java

// Initialize another app with a different config
FirebaseApp secondary = FirebaseApp.initializeApp(secondaryAppConfig, "secondary");

// Retrieve the database.
FirebaseDatabase otherDatabase = FirebaseDatabase.getInstance(otherApp);

Garantiza la creación de informes confiables de Analytics

Google Analytics para Firebase recopila eventos muy temprano en el flujo de inicio de la aplicación, en algunas ocasiones antes de que se haya configurado la instancia de aplicación principal de Firebase. En estos casos, Firebase hace referencia al recurso de Android o a GoogleService-Info.plist en iOS para buscar el ID correcto de la aplicación de Google a fin de almacenar eventos. Por este motivo, te recomendamos que uses los métodos de configuración predeterminados siempre que sea posible.

Si debes configurar el tiempo de ejecución, ten en cuenta los siguientes puntos:

  1. Si utilizas AdMob y solicitas anuncios en el inicio como se recomienda, es posible que se omitan algunos datos de Analytics y que se muestren los de anuncios móviles si no usas el enfoque de configuración basado en recursos.
  2. Proporciona únicamente un ID de la app de Google en cada variante distribuida de tu app. Por ejemplo, si envías la versión 1 de tu aplicación con un determinado GOOGLE_APP_ID en la configuración y, a continuación, subes la versión 2 con un ID diferente, es posible que se pierdan datos de Analytics.
  3. En iOS, no agregues GoogleService-Info.plist a tu proyecto si definiste una configuración diferente en tiempo de ejecución, ya que esto puede generar un cambio aparente de GOOGLE_APP_ID y provocar la pérdida de Analytics.