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:
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 seubuild.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 aplicativobuild.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:
- Swift:
FirebaseOptions(googleAppID:gcmSenderID:)
- Android:
FirebaseOptions.Builder
- Web:
initializeApp()
- C++:
firebase::App::Create
- Unidade:
FirebaseApp.Create
- Node.js:
initializeApp
- Java:
FirebaseOptions.Builder
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:
- 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.
- 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. - 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.