默认FirebaseApp已经存在

d7v8vwbk  于 2023-10-22  发布在  其他
关注(0)|答案(6)|浏览(94)

我做了一个C# API来推送通知到Flutter应用。
我的API基本上像下面的代码:

public async Task < IActionResult > pushNotification () {
  FirebaseApp.Create(new AppOptions() {
    Credential = GoogleCredential.FromFile("file.json")
  });
  .....
}

我过去的网址“domain.com/api/controller/pushNotification“在我的浏览器上,第一次它的工作。我的Flutter收到通知完美。但第二次我得到了:

System.ArgumentException: The default FirebaseApp already exists.
   at FirebaseAdmin.FirebaseApp.Create(AppOptions options, String name)
   at FirebaseAdmin.FirebaseApp.Create(AppOptions options)

为什么?我该怎么弥补?

n9vozmp4

n9vozmp41#

您可以通过以下方式简单地检查是否存在FirebaseApp示例

if (FirebaseApp.DefaultInstance == null)
    {
        App = FirebaseApp.Create(new AppOptions()
        {
            Credential = GoogleCredential.FromFile("file.json")
        });
    }
lokaqttq

lokaqttq2#

Carset的回答让我非常接近我所需要的。
我只是改变了我的构造函数看起来这样,工作完美

public MobileMessagingClient()
    {
        var app = FirebaseApp.DefaultInstance;
        if (FirebaseApp.DefaultInstance == null)
        {
            app = FirebaseApp.Create(new AppOptions()
            {
                Credential = GoogleCredential.FromFile(HttpContext.Current.Server.MapPath("~/file.json"))
            .CreateScoped("https://www.googleapis.com/auth/firebase.messaging")
            });
        }            
        messaging = FirebaseMessaging.GetMessaging(app);
    }
guykilcj

guykilcj3#

Firebase在内部管理自己的客户端,您可以通过调用Firebase的方法来引用它,这些方法会向定义的或默认的“App”发出请求,因为您可以在技术上拥有多个App。
您很可能只想在Firebase应用程序不存在的情况下启动Firebase应用程序。我相信你可以通过检查FirebaseApp.apps长度来做到这一点-你应该

yqyhoc1h

yqyhoc1h4#

第一次是工作。我的Flutter收到通知完美。但第二次我得到了
你的错误消息是说你正在尝试初始化一个已经存在的应用程序。
要解决此问题,您需要首先检查应用程序是否已初始化。在运行用于验证Firebase应用的代码之前,请添加一个简单的检查,例如:

public async Task < IActionResult > pushNotification () {
if(appDoesNotExistYet) {
  FirebaseApp.Create(new AppOptions() {
    Credential = GoogleCredential.FromFile("file.json")
  });
}

  .....
}
8tntrjer

8tntrjer5#

如果你使用默认的构造函数而不使用名字,它会创建默认的示例。

/// <summary>Creates an app with the specified name and options.</summary>
    /// <returns>The newly created <see cref="T:FirebaseAdmin.FirebaseApp" /> instance.</returns>
    /// <exception cref="T:System.ArgumentException">If the default app instance already
    /// exists.</exception>
    /// <param name="options">Options to create the app with. Must at least contain the
    /// <c>Credential</c>.</param>
    /// <param name="name">Name of the app.</param>
    public static FirebaseApp Create(AppOptions options, string name)
    {
      if (string.IsNullOrEmpty(name))
        throw new ArgumentException("App name must not be null or empty");
      options = options ?? FirebaseApp.GetOptionsFromEnvironment();
      lock (FirebaseApp.Apps)
      {
        if (FirebaseApp.Apps.ContainsKey(name))
        {
          if (name == "[DEFAULT]")
            throw new ArgumentException("The default FirebaseApp already exists.");
          throw new ArgumentException("FirebaseApp named " + name + " already exists.");
        }
        FirebaseApp firebaseApp = new FirebaseApp(options, name);
        FirebaseApp.Apps.Add(name, firebaseApp);
        return firebaseApp;
      }
    }

因此,如果你想使用多个应用程序(项目),那么你需要使用带name的重载。您可以使用名称作为ProjectId或任何其他标识符。

var instance = FirebaseApp.GetInstance(appOptions.ProjectId) ?? FirebaseApp.Create(appOptions, appOptions.ProjectId);
2j4z5cfb

2j4z5cfb6#

第一次创建后FirebaseApp存储在DefaultInstance中

FirebaseApp app;
    if (FirebaseApp.DefaultInstance == null)
    {
        var file = Server.MapPath("your-acc.json");
        app = FirebaseApp.Create(new AppOptions() { Credential = GoogleCredential.FromFile(file).CreateScoped("https://www.googleapis.com/auth/firebase.messaging") });
    }else
    {
        app = FirebaseApp.DefaultInstance;
    }    
        
    FirebaseMessaging messaging = FirebaseMessaging.GetMessaging(app);
    var result = await messaging.SendAsync(CreateNotification(title, msg, DeviceToken));

相关问题