我制作了一个
C#
API 将通知推送到 Flutter
应用程序。
我的 API 基本上类似于下面的代码:
public async Task < IActionResult > pushNotification () {
FirebaseApp.Create(new AppOptions() {
Credential = GoogleCredential.FromFile("file.json")
});
.....
}
我在浏览器上输入了网址“domain.com/api/controller/pushNotification”,这是第一次工作。我的扑动完美地收到通知。但第二次我得到了:
System.ArgumentException: The default FirebaseApp already exists.
at FirebaseAdmin.FirebaseApp.Create(AppOptions options, String name)
at FirebaseAdmin.FirebaseApp.Create(AppOptions options)
为什么?我该如何解决这个问题?
您可以通过以下方式简单地检查是否存在 FirebaseApp 实例:
if (FirebaseApp.DefaultInstance == null)
{
App = FirebaseApp.Create(new AppOptions()
{
Credential = GoogleCredential.FromFile("file.json")
});
}
我刚刚将构造函数更改为这样并且工作完美
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);
}
您很可能只想在 Firebase 应用程序尚不存在时启动该应用程序。我相信你可以通过检查
FirebaseApp.apps
长度来做到这一点 - 你应该
第一次上班。我的扑动完美地收到通知。但第二次我就得到了您的错误消息表明您正在尝试初始化已存在的应用程序。
要解决此问题,您需要首先检查应用程序是否已初始化。在运行初始化 Firebase 应用程序的代码之前,添加一个简单的检查,例如:
public async Task < IActionResult > pushNotification () {
if(appDoesNotExistYet) {
FirebaseApp.Create(new AppOptions() {
Credential = GoogleCredential.FromFile("file.json")
});
}
.....
}
/// <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;
}
}
因此,如果您有多个要使用的应用程序(项目),那么您需要使用带有名称的重载。您可以使用名称作为 ProjectId 或任何其他标识符。
var instance = FirebaseApp.GetInstance(appOptions.ProjectId) ?? FirebaseApp.Create(appOptions, appOptions.ProjectId);
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));