簡體   English   中英

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

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

對於以下內容,第一次調用它是有效的,但隨后調用“FirebaseApp 名稱 [DEFAULT] 已存在!”時失敗。

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 App。

在 firebase web 上,您檢查是否已經初始化:

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

對於那些想知道如何在 Android 中執行與已接受答案相同的操作的人:

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

在儀器化測試環境中,使用以下上下文:

InstrumentationRegistry.getContext()

您可以嘗試獲取 Firebase 應用實例,在它的代碼中,firebase 檢查它是否已初始化,如果未初始化,則拋出IllegalStateException

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

我認為您想要做的是在初始化您的應用程序之前檢查正在運行的應用程序列表。 每個 SDK 都有一個獲取這個數組的方法,在 android 中它是getApps

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

然后你可以檢查你的應用程序是否已經初始化。

在我的情況下,我最終檢查了數組的長度(我使用的是 javascript / web sdk,所以我確定它對於 Android 有點不同)並在它為 0 時初始化一個新應用程序。

在 v9 中,Firebase 已模塊化以實現更好的搖樹。 所以我們不能再導入整個應用程序並檢查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文檔

我遇到了類似的問題。 我通過刪除已經初始化的應用程序解決了以下問題。

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

解決方案適用於網絡。

在 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';
import * as firebase from "firebase/app";
firebase.apps.map(e => e.name); // Give you an array of initialized apps

在 firebase admin SDK for java 中,當且僅當沒有應用程序時才初始化應用程序。

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

Firebase 版本 9

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

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

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

我遇到了類似的問題,我解決了以下問題:

  1. 為應用程序創建一個 var 並用 null 初始化它
  2. 初始化時參考應用程序
  3. 在再次初始化之前檢查

//global variable
var firebaseResumeDownloadAdd = null;

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

您可以像下面一樣清除應用程序

if(!FirebaseApp.getApps().isEmpty()) {
        FirebaseApp.getInstance().delete();
}

在 Android 中,取決於Daniel Laurindo 的回答:

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

} 

ES6+ 的一個更干凈的解決方案是


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

簡單使用 Java 8 Stream 和 Optional 特色。

下面的代碼為

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

Th 使用平台檢查根據環境進行初始化

在 firebase web 上,您檢查是否已經初始化

在啟動 MYAPP() 時使用以下代碼片段

import 'dart:io';

void main() async {

WidgetsFlutterBinding.ensureInitialized();

如果(Platform.isAndroid || Platform.isIOS){

await Firebase.initializeApp();

} 別的 {

if (Firebase.apps.isEmpty) {

  await Firebase.initializeApp(

      // connect for web to firebase
      options:firebaseOptions

}

} runApp(const MyApp());

}

const app = !getApps().length ? initializeApp(firebaseConfig) : getApp();

對於 web,您可以使用:

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

const firebaseConfig = {/* YOUR CONFIG */}

function createFirebaseApp(config) {
    try {
        return getApp()
    } catch {
        return initializeApp(config)
    }
}

const firebaseApp = createFirebaseApp(firebaseConfig)

如果您正在使用 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)
      );
    }
  }


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM