Configurar vários projetos

Esta página descreve como usar mais de um projeto do Firebase no seu aplicativo.

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

  • Configurar seu ambiente de desenvolvimento para usar diferentes projetos do Firebase com base no tipo de build ou destino.
  • Acessando o conteúdo de vários projetos do Firebase no seu aplicativo.

Suporta diferentes ambientes

Um caso de uso comum é oferecer suporte a projetos separados do Firebase para seus ambientes de desenvolvimento e produção.

Os SDKs Web e Admin são configurados passando valores diretamente para suas funções de inicialização. Para esses SDKs, você pode usar uma verificação de tempo de execução para selecionar variáveis ​​de configuração de desenvolvimento ou produção.

As plataformas Android e Apple (e seus wrappers Unity e C++) normalmente carregam a configuração de um arquivo de configuração: GoogleService-Info.plist na plataforma Apple 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, a alternância entre ambientes geralmente é implementada como uma decisão em tempo de construção, por meio do uso de diferentes arquivos de configuração para cada ambiente.

Suporte a vários ambientes em seu aplicativo Apple

Por padrão, FirebaseApp.configure() carregará o arquivo GoogleService-Info.plist que acompanha o aplicativo. Se seus ambientes de desenvolvimento e produção estiverem configurados como destinos separados no Xcode, você poderá:

  • Baixe os dois arquivos GoogleService-Info.plist
  • Armazene os dois arquivos em diretórios diferentes
  • Adicione ambos ao seu projeto Xcode
  • Associe os diferentes arquivos aos diferentes destinos usando o painel Target Membership:

Painel de membros-alvo

Se as compilações fizerem parte de um único destino, a melhor opção é fornecer nomes exclusivos a ambos os arquivos de configuração (por exemplo, GoogleService-Info-Free.plist e GoogleService-Info-Paid.plist ). Em seguida, escolha em tempo de execução qual plist carregar. Isso é mostrado no exemplo a seguir:

// 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 em seu aplicativo Android

No Android, o arquivo google-services.json é processado em recursos de string do Android pelo plug-in gradle do Google Services. Você pode ver quais recursos são criados na documentação do plug-in de serviços do Google em Processamento do arquivo JSON .

Você pode ter vários arquivos google-services.json para diferentes variantes de compilação , colocando os arquivos google-services.json em diretórios dedicados nomeados para cada variante na raiz do módulo do aplicativo. Por exemplo, se você tiver sabores de compilação "desenvolvimento" e "lançamento", sua configuração poderá ser organizada assim:

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

Para saber mais, consulte a documentação do plug-in de serviços do Google sobre como adicionar o arquivo JSON .

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

Como esse provedor está apenas lendo recursos com nomes conhecidos, outra opção é adicionar os recursos de string diretamente ao seu aplicativo, em vez de usar o plug-in Gradle dos Serviços do Google. Você pode fazer isso:

  • Removendo o plugin google-services do seu build.gradle raiz
  • Excluindo google-services.json do seu projeto
  • Adicionando os recursos de string diretamente
  • Excluindo apply plugin: 'com.google.gms.google-services' do seu aplicativo build.gradle

Use vários projetos em seu aplicativo

Às vezes você precisa acessar diferentes projetos usando as mesmas APIs – por exemplo, acessando múltiplas instâncias de banco de dados. Na maioria dos casos, há um objeto de aplicativo central do Firebase que gerencia a configuração de todas as APIs do Firebase. Este objeto é inicializado como parte de sua configuração normal. No entanto, quando quiser acessar vários projetos de um único aplicativo, você precisará de um objeto de aplicativo Firebase distinto para fazer referência a cada um deles individualmente. Cabe a você inicializar essas outras instâncias.

Em ambos os casos, você precisa primeiro criar um objeto de opções do Firebase para armazenar os dados de configuração do aplicativo Firebase. A documentação completa das opções pode ser encontrada 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 nos exemplos a seguir:

Rápido

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

Rede

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

Unidade

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

Depois de inicializar esse objeto de opções, você poderá usá-lo para configurar uma instância adicional do aplicativo Firebase. Observe que em todos os exemplos mostrados abaixo usamos a string secundário . Este nome é usado para recuperar a instância do aplicativo e para distingui-la de outras instâncias, incluindo a instância padrão (denominada [DEFAULT] ). Você deve escolher uma string apropriada ao uso pretendido do outro projeto do Firebase.

Os snippets a seguir demonstram a conexão com um Realtime Database alternativo (as APIs para outros recursos do Firebase seguem o mesmo padrão).

Rápido

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

Rede

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

Unidade

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

Garanta relatórios confiáveis ​​para Analytics

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

Se a configuração do tempo de execução for necessária, observe as seguintes advertências:

  1. Se você estiver usando a AdMob e solicitar anúncios na inicialização conforme recomendado, poderá perder alguns dados do Google Analytics relacionados a anúncios para celular se não usar a abordagem de configuração baseada em recursos.
  2. Forneça apenas um único ID do Google app em cada variante distribuída do seu aplicativo. Por exemplo, se você enviar a versão 1 do seu aplicativo com um determinado GOOGLE_APP_ID na configuração e depois carregar a versão 2 com um ID diferente, isso poderá fazer com que os dados analíticos sejam descartados.
  3. Nas plataformas Apple, não adicione GoogleService-Info.plist ao seu projeto se você estiver fornecendo configurações diferentes em tempo de execução, pois isso pode resultar em uma alteração aparente do GOOGLE_APP_ID e resultar na perda do Analytics.