如何检查 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({});
}
我遇到了类似的问题,我是这样解决的:
- 为应用程序创建一个 var 并用 null 初始化它
- 初始化时引用应用程序
- 再次初始化前检查
//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());
}
对于以下内容,第一次调用时它可以工作,但随后在 "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({});
}
我遇到了类似的问题,我是这样解决的:
- 为应用程序创建一个 var 并用 null 初始化它
- 初始化时引用应用程序
- 再次初始化前检查
//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());
}