Plugin.FirebasePushNotification for xamarin 在应用程序关闭时不起作用
Plugin.FirebasePushNotification for xamarin doesn't work when app is closed
当我的 Xamarin 应用程序关闭时,我无法使用 Plugin.FirebasePushNotification 显示推送通知。
这是我到目前为止所做的:
- 添加了 google-services.json 并将其构建操作设置为 GoogleServiceJson
MainActivity.cs
//some dependencies
using Plugin.FirebasePushNotification;
using System.Collections.Specialized;
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace MasterDetailPageNavigation.Droid
{
[Activity(Label = "app", Theme = "@style/MyTheme.Splash", MainLauncher = true, ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
const string TAG = "MainActivity";
internal static readonly string CHANNEL_ID = "my_notification_channel";
internal static readonly int NOTIFICATION_ID = 100;
protected override void OnCreate(Bundle bundle)
{
base.Window.RequestFeature(WindowFeatures.ActionBar);
base.SetTheme(Resource.Style.MainTheme);
base.OnCreate(bundle);
Xamarin.Essentials.Platform.Init(this, bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App(Param));
FirebasePushNotificationManager.ProcessIntent(this, Intent);
CrossFirebasePushNotification.Current.OnTokenRefresh += Current_OnTokenRefresh;
}
private void Current_OnTokenRefresh(object source, FirebasePushNotificationTokenEventArgs e)
{
System.Diagnostics.Debug.WriteLine("NEW TOKEN => " + e.Token);
App.TokenNotification = e.Token;
Task.Run(() => SendRegistrationToServer(e.Token));
}
Application.cs
using System;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Support.V4.App;
using Plugin.FirebasePushNotification;
using static Android.Support.V4.App.NotificationCompat;
namespace MasterDetailPageNavigation.Droid
{
[Application]
public class MainApplication : Application
{
public MainApplication(IntPtr handle, JniHandleOwnership transer) : base(handle, transer)
{
}
public override void OnCreate()
{
base.OnCreate();
//Set the default notification channel for your app when running Android Oreo
if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O)
{
//Change for your default notification channel id here
FirebasePushNotificationManager.DefaultNotificationChannelId = "FirebaseDefaultChannel";
//Change for your default notification channel name here
FirebasePushNotificationManager.DefaultNotificationChannelName = "General";
FirebasePushNotificationManager.DefaultNotificationChannelImportance = NotificationImportance.Max;
}
//If debug you should reset the token each time.
#if DEBUG
FirebasePushNotificationManager.Initialize(this,true);
#else
FirebasePushNotificationManager.Initialize(this, false);
#endif
//Handle notification when app is closed here
CrossFirebasePushNotification.Current.OnNotificationReceived += (s, p) =>
{
var intent = new Intent(this, typeof(MainActivity));
intent.AddFlags(ActivityFlags.ClearTop);
foreach (var key in p.Data.Keys)
{
Console.WriteLine("String key: " + key + " = " + p.Data[key].ToString());
intent.PutExtra(key, p.Data[key].ToString());
}
p.Data.TryGetValue("title", out object Title);
p.Data.TryGetValue("body", out object Body);
var pendingIntent = PendingIntent.GetActivity(this, MainActivity.NOTIFICATION_ID, intent, PendingIntentFlags.UpdateCurrent);
var notificationBuilder = new NotificationCompat.Builder(this, MainActivity.CHANNEL_ID)
.SetSmallIcon(Resource.Drawable.ic_launcher_round)
.SetContentTitle(Title.ToString())
.SetContentText(Body.ToString())
.SetAutoCancel(true)
.SetContentIntent(pendingIntent)
.SetPriority(PriorityHigh);
//.SetStyle(new BigPictureStyle().SetSummaryText(Body.ToString()))
var notificationManager = NotificationManagerCompat.From(this);
notificationManager.Notify(MainActivity.NOTIFICATION_ID, notificationBuilder.Build());
};
}
}
}
AndroidManifest.xml
(我想知道这是否有必要,出于测试目的我已经将其注释掉并且行为非常相同,但这是针对我的应用程序的旧版本)
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:enabled="true" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="${applicationId}" />
</intent-filter>
</receiver>
当前行为:
当应用程序在前台和后台时,我可以收到消息,但当我关闭应用程序时,消息无法传递。如果我注释掉方法“CrossFirebasePushNotification.Current.OnNotificationReceived”中的代码,一切都会停止工作(我读过它只对后台模式是必要的,但前台似乎也使用它)。我几乎要降级以使一切正常。
这里有人看到我做错了什么吗?
PS: 我正在使用 firebase 控制台发送测试消息。
刚刚在插件 FireBasePushNotification 的项目页面找到了答案:
theirs FAQ 的第 3 个点:
"3 - 如果应用程序在调试时停止,您将不会收到任何推送通知,应该重新打开并再次关闭,以便在应用程序关闭时通知工作。这是因为应用程序在停止时处于不稳定状态调试。”
所以,我所做的一切都是关闭并重新打开应用程序,仅使用 phone(不通过 visual studio 进行调试),然后宾果游戏,现在可以使用了!
当我的 Xamarin 应用程序关闭时,我无法使用 Plugin.FirebasePushNotification 显示推送通知。
这是我到目前为止所做的:
- 添加了 google-services.json 并将其构建操作设置为 GoogleServiceJson
MainActivity.cs
//some dependencies
using Plugin.FirebasePushNotification;
using System.Collections.Specialized;
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace MasterDetailPageNavigation.Droid
{
[Activity(Label = "app", Theme = "@style/MyTheme.Splash", MainLauncher = true, ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
const string TAG = "MainActivity";
internal static readonly string CHANNEL_ID = "my_notification_channel";
internal static readonly int NOTIFICATION_ID = 100;
protected override void OnCreate(Bundle bundle)
{
base.Window.RequestFeature(WindowFeatures.ActionBar);
base.SetTheme(Resource.Style.MainTheme);
base.OnCreate(bundle);
Xamarin.Essentials.Platform.Init(this, bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App(Param));
FirebasePushNotificationManager.ProcessIntent(this, Intent);
CrossFirebasePushNotification.Current.OnTokenRefresh += Current_OnTokenRefresh;
}
private void Current_OnTokenRefresh(object source, FirebasePushNotificationTokenEventArgs e)
{
System.Diagnostics.Debug.WriteLine("NEW TOKEN => " + e.Token);
App.TokenNotification = e.Token;
Task.Run(() => SendRegistrationToServer(e.Token));
}
Application.cs
using System;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Support.V4.App;
using Plugin.FirebasePushNotification;
using static Android.Support.V4.App.NotificationCompat;
namespace MasterDetailPageNavigation.Droid
{
[Application]
public class MainApplication : Application
{
public MainApplication(IntPtr handle, JniHandleOwnership transer) : base(handle, transer)
{
}
public override void OnCreate()
{
base.OnCreate();
//Set the default notification channel for your app when running Android Oreo
if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O)
{
//Change for your default notification channel id here
FirebasePushNotificationManager.DefaultNotificationChannelId = "FirebaseDefaultChannel";
//Change for your default notification channel name here
FirebasePushNotificationManager.DefaultNotificationChannelName = "General";
FirebasePushNotificationManager.DefaultNotificationChannelImportance = NotificationImportance.Max;
}
//If debug you should reset the token each time.
#if DEBUG
FirebasePushNotificationManager.Initialize(this,true);
#else
FirebasePushNotificationManager.Initialize(this, false);
#endif
//Handle notification when app is closed here
CrossFirebasePushNotification.Current.OnNotificationReceived += (s, p) =>
{
var intent = new Intent(this, typeof(MainActivity));
intent.AddFlags(ActivityFlags.ClearTop);
foreach (var key in p.Data.Keys)
{
Console.WriteLine("String key: " + key + " = " + p.Data[key].ToString());
intent.PutExtra(key, p.Data[key].ToString());
}
p.Data.TryGetValue("title", out object Title);
p.Data.TryGetValue("body", out object Body);
var pendingIntent = PendingIntent.GetActivity(this, MainActivity.NOTIFICATION_ID, intent, PendingIntentFlags.UpdateCurrent);
var notificationBuilder = new NotificationCompat.Builder(this, MainActivity.CHANNEL_ID)
.SetSmallIcon(Resource.Drawable.ic_launcher_round)
.SetContentTitle(Title.ToString())
.SetContentText(Body.ToString())
.SetAutoCancel(true)
.SetContentIntent(pendingIntent)
.SetPriority(PriorityHigh);
//.SetStyle(new BigPictureStyle().SetSummaryText(Body.ToString()))
var notificationManager = NotificationManagerCompat.From(this);
notificationManager.Notify(MainActivity.NOTIFICATION_ID, notificationBuilder.Build());
};
}
}
}
AndroidManifest.xml (我想知道这是否有必要,出于测试目的我已经将其注释掉并且行为非常相同,但这是针对我的应用程序的旧版本)
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:enabled="true" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="${applicationId}" />
</intent-filter>
</receiver>
当前行为:
当应用程序在前台和后台时,我可以收到消息,但当我关闭应用程序时,消息无法传递。如果我注释掉方法“CrossFirebasePushNotification.Current.OnNotificationReceived”中的代码,一切都会停止工作(我读过它只对后台模式是必要的,但前台似乎也使用它)。我几乎要降级以使一切正常。
这里有人看到我做错了什么吗?
PS: 我正在使用 firebase 控制台发送测试消息。
刚刚在插件 FireBasePushNotification 的项目页面找到了答案:
theirs FAQ 的第 3 个点:
"3 - 如果应用程序在调试时停止,您将不会收到任何推送通知,应该重新打开并再次关闭,以便在应用程序关闭时通知工作。这是因为应用程序在停止时处于不稳定状态调试。”
所以,我所做的一切都是关闭并重新打开应用程序,仅使用 phone(不通过 visual studio 进行调试),然后宾果游戏,现在可以使用了!