Ir para o console

Configurar vários projetos

Esta página descreve como usar mais de um projeto do Firebase em seu app.

Muitos apps precisam apenas de um único projeto do Firebase e da configuração padrão descrita nos guias Primeiros passos. Exemplos de quando pode ser útil usar vários projetos do Firebase incluem:

  • configurar seu ambiente de desenvolvimento para usar projetos do Firebase diferentes com base no tipo de compilação ou no destino;
  • acessar o conteúdo de vários projetos do Firebase no seu app.

Compatibilidade com ambientes diferentes

Um caso de uso comum é oferecer compatibilidade de projetos individuais do Firebase nos seus ambientes de desenvolvimento e produção.

Os SDKs da Web e Admin são configurados ao transmitir diretamente os valores para as funções de inicialização deles. Para esse SDK, use uma verificação de tempo de execução para selecionar variáveis de configuração de desenvolvimento ou de produção.

O Android e o iOS e os wrappers Unity e C++ deles geralmente carregam a configuração de um arquivo: GoogleService-Info.plist no iOS e google-services.json no Android. Esses arquivos são lidos em um objeto de opções (FIROption ou FirebaseOptions) que é referenciado pelo objeto de aplicativo do Firebase (FIRApp ou FirebaseApp).

Para essas plataformas, alternar os ambientes é geralmente uma decisão de criação de versão, feita pelo uso de arquivos de configuração diferentes para cada ambiente.

Compatibilidade com vários ambientes no aplicativo para iOS

Por padrão, FirebaseApp.configure() carrega o arquivo GoogleService-Info.plist junto com o app. Caso seus ambientes de desenvolvimento e de produção estejam configurados como destinos separados no XCode, você pode:

  • fazer o download de ambos os arquivos GoogleService-Info.plist;
  • armazenar os dois arquivos em diretórios diferentes;
  • adicionar ambos ao seu projeto no XCode;
  • associar os arquivos distintos a destinos diferentes usando o painel "Associação de destino":

Painel "Associação de destino"

Se as versões são parte de um único destino, a melhor opção é dar nomes exclusivos aos arquivos de configuração (por exemplo, GoogleService-Info-Free.plist e GoogleService-Info-Paid.plist). Em seguida, escolha qual plist carregar no tempo de execução. Isso é mostrado neste exemplo:

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

Suporte a vários ambientes no aplicativo para Android

No Android, o arquivo google-service.json é processado em recursos de string Android pelo plug-in Gradle do Google Services. Veja quais recursos são criados em Como processar o arquivo JSON na documentação do plug-in do Google Services.

É possível ter diversos arquivos google-services.json para variantes de versão distintas. Basta colocar os arquivos google-services.json em diretórios dedicados, nomeados para cada variante na raiz do módulo do app. Por exemplo, se você tiver as variantes "development" e "release", sua configuração poderá ser organizada da seguinte maneira:

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

Para saber mais, consulte Como adicionar o arquivo JSON na documentação do plug-in do Google Services.

Esses recursos são carregados pelo FirebaseInitProvider que é executado antes do código do seu aplicativo e inicializa as Firebase APIs usando esses valores.

Como esse provedor somente lê os recursos com nomes conhecidos, outra opção é adicionar os recursos de string diretamente ao seu app em vez de usar o plug-in Gradle do Google Services. Para fazer isso basta:

  • remover o plug-in do google-services da sua raiz build.gradle;
  • excluir o google-services.json do seu projeto;
  • adicionar os recursos de string diretamente;
  • excluir apply plugin: 'com.google.gms.google-services' do seu app build.gradle.

Usar vários projetos no aplicativo

Às vezes, é necessário acessar projetos diferentes usando a mesma API, por exemplo, ao acessar várias instâncias do banco de dados. Na maioria dos casos, há um objeto central do Firebase que gerencia a configuração de todas as APIs do Firebase. Esse objeto é inicializado como parte da configuração normal. No entanto, quando você quiser acessar vários projetos a partir de um único aplicativo, precisará de um objeto distinto do aplicativo do Firebase para fazer referência a cada um individualmente. Você decide como inicializar essas outras instâncias.

Em ambos os casos, primeiro é necessário criar um objeto de opções do Firebase para guardar os dados de configuração do aplicativo do Firebase. A documentação completa das opções está disponível na documentação de referência da API para as seguintes classes:

O uso dessas classes para dar suporte a vários projetos em um aplicativo é mostrado nestes exemplos:

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

Depois de inicializar esse objeto de opções, use-o para configurar uma instância adicional do aplicativo do Firebase. Em todos os exemplos mostrados abaixo usamos a string secondary. Esse nome é usado para recuperar a instância do app e para diferenciá-la de outras instâncias, incluindo a instância padrão (chamada [DEFAULT]). Escolha uma string adequada para o uso pretendido do outro projeto do Firebase.

Os snippets a seguir demonstram a conexão a um banco de dados alternativo do Realtime Database. As APIs de outros recursos do Firebase seguem o mesmo padrão.

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

Garantir relatórios confiáveis para o Analytics

O Google Analytics para Firebase coleta eventos bem no início do fluxo de inicialização do app, em algumas ocasiões antes da principal instância do app do Firebase ter sido configurada. Nesses casos, o Firebase faz referência ao recurso Android ou ao GoogleService-Info.plist no iOS para procurar o ID do Google app correto para armazenar eventos. Por esse motivo, recomendamos usar os métodos de configuração padrão sempre que possível.

Se a configuração de tempo de execução for necessária, observe as seguintes ressalvas:

  1. Se você estiver usando a AdMob e solicitar anúncios na inicialização conforme recomendado, poderá perder alguns dados do Analytics relacionados aos anúncios para dispositivos móveis quando não estiver usando a abordagem de configuração baseada em recursos.
  2. Apenas forneça um único ID do Google app em cada variante distribuída do seu app. Por exemplo, se você enviar a versão 1 do seu app com um determinado GOOGLE_APP_ID na configuração e depois carregar a versão 2 com um código diferente, isso poderá causar o descarte dos dados do Analytics.
  3. No iOS, não adicione GoogleService-Info.plist ao projeto se você fornecer configurações diferentes no ambiente de execução, já que isso pode resultar em uma mudança aparente do GOOGLE_APP_ID e causar perdas no Analytics.