如何检查 Firebase 应用程序是否已在 Android 上初始化

How to check if a Firebase App is already initialized on Android

对于以下内容,第一次调用时它可以工作,但随后在 "FirebaseApp name [DEFAULT] already exists!"

的后续调用中失败
public FirebaseDatabase conn(Context c) {
         FirebaseOptions options = new FirebaseOptions.Builder()
                .setApiKey("key")
                .setDatabaseUrl("url")
                .setApplicationId("ID")
                .build();


        /////I tried Try and Catch with no success//////
        FirebaseApp app = FirebaseApp.initializeApp(c, options);

        /// for this : FirebaseApp app = FirebaseApp.initializeApp(c, options, "some_app");
        //// will fail with "FirebaseApp name some_app already exists!"
        return FirebaseDatabase.getInstance(app);
}

以上所有都是尝试连接到第二个 Firebase 应用程序。

我想你要做的是在初始化你的应用程序之前检查 运行 个应用程序的列表。每个 SDK 都有一个获取此数组的方法,在 android 中是 getApps:

https://firebase.google.com/docs/reference/android/com/google/firebase/FirebaseApp.html

然后您可以检查您的应用程序是否已经初始化。

在我的例子中,我只是检查了数组的长度(我使用的是 javascript / web sdk,所以我确信 Android 有点不同)并初始化如果为 0,则为新应用。

在 firebase web 上,您检查是否已经初始化:

if (firebase.apps.length === 0) {
    firebase.initializeApp({});
}

我遇到了类似的问题,我是这样解决的:

  1. 为应用程序创建一个 var 并用 null 初始化它
  2. 初始化时引用应用程序
  3. 再次初始化前检查

//global variable
var firebaseResumeDownloadAdd = null;

//inside function check before initializing
if(firebaseResumeDownloadAdd==null){
   firebaseResumeDownloadAdd =
   firebase.initializeApp(functions.config().firebase);
}

我遇到了类似的问题。 我通过删除已经初始化的应用程序解决了以下问题。

    // Access your firebase app
    let app = firebase.app();
    // Delete your app.
    app.delete(app);

解决方案适用于网络。

您可以尝试获取 Firebase 应用程序实例,在它的代码中,Firebase 检查它是否已初始化,如果没有,它会抛出一个 IllegalStateException.

    try{
        FirebaseApp.getInstance();
    }
    catch (IllegalStateException e)
    {
        //Firebase not initialized automatically, do it manually
        FirebaseApp.initializeApp(this);
    }

对于那些想知道如何做与接受的答案相同的人,在 Android:

if (FirebaseApp.getApps(context).isEmpty()) {
    FirebaseApp.initializeApp(context);
}

并在插桩测试环境中,使用此上下文:

InstrumentationRegistry.getContext()

在 android 中不确定,但是使用单例方法怎么样。在 JS 中你可以做到这一点。希望这对某人有帮助

// Config file
import * as firebase from "firebase";

const config = {...};

export default !firebase.apps.length ? firebase.initializeApp(config) : firebase.app();

// Other file
import firebase from '../firebase';

如果您使用 Nativescript 为 Android 构建混合移动应用 | iOS 你可以使用这个脚本:

import * as firebase from 'nativescript-plugin-firebase';

_initFirebase(): Promise<any> {
    if (!(firebase as any).initialized) {
      return firebase.init({}).then(
        () => {
          console.info('firebase started...');
        },
        (error) => console.error(error)
      );
    }
  }


import * as firebase from "firebase/app";
firebase.apps.map(e => e.name); // Give you an array of initialized apps

在 Android 中,取决于 Daniel Laurindo 的 回答:

if (FirebaseApp.getApps(context).size != 0) {

} 

在 v9 中,Firebase 已经模块化以实现更好的 tree shaking。所以我们不能再导入整个应用程序并检查 apps 属性 AFAIK。可以改用以下方法。

import { initializeApp, getApps, getApp } from "firebase/app";
getApps().length === 0 ? initializeApp(firebaseConfig) : getApp();

https://firebase.google.com/docs/reference/js/v9/app.md#getapps 用于文档

在 java 的 firebase admin SDK 中,当且仅当没有应用时才初始化应用。

if (FirebaseApp.getApps().isEmpty()) {
    FirebaseApp.initializeApp();
}

更清洁的 ES6+ 解决方案是


if (!firebase.apps.length) {
 ...
}

Firebase 版本 9

import { initializeApp, getApp } from "firebase/app";

const createFirebaseApp = (config = {}) => {
  try {
    return getApp();
  } catch () {
    return initializeApp(config);
  }
};

const firebaseApp = createFirebaseApp({/* your config */})

简单使用 Java 8 流和可选精选。

代码如下

FirebaseApp.getApps()
.stream()
.filter(firebaseApp -> 
    firebaseApp.getName().equals("APP_NAME"))
   .findFirst()
   .orElseGet(() -> FirebaseApp.initializeApp(firebaseOptions, "APP_NAME"));

对于使用 dotNet FirebaseAdmin SDK 的用户

if (FirebaseApp.GetInstance("[DEFAULT]") == null)
{
    var createdApp = FirebaseApp.Create(new AppOptions()
    {
        Credential = GoogleCredential.FromFile("private-key.json")
    });
}

第 使用平台检查根据环境进行初始化

在 firebase web 上,您检查是否已经用

初始化

启动 MYAPP() 时使用以下代码片段

import 'dart:io';

void main() async {

WidgetsFlutterBinding.ensureInitialized();

if (Platform.isAndroid || Platform.isIOS) {

await Firebase.initializeApp();

} 否则 {

if (Firebase.apps.isEmpty) {

  await Firebase.initializeApp(

      // connect for web to firebase
      options:firebaseOptions

}

} runApp(const MyApp());

}