我想知道在什么类中我可以指定如何处理在应用程序关闭或后台发送的通知。现在,我在本地获取通知,然后触发我的SendLocalNotification
方法,以我想要的方式构建它,这就是我希望在应用程序关闭或处于后台时对通知进行的处理。我仍然会收到后台通知,但它们不会触发任何构建它应该是什么样子的代码。
我做了一些挖掘,阅读了一些关于重写处理远程通知的方法的内容,但找不到一个好的例子,甚至找不到要重写的特定方法。
这是我的FirebaseService类中的OnMessageReceived覆盖(忽略看起来不合适的代码。我一直在处理这些东西(:
public override void OnMessageReceived(RemoteMessage message)
{
base.OnMessageReceived(message);
string messageBody = string.Empty;
if (message.GetNotification() != null)
{
switch (message.GetNotification().Title)
{
case "Load Matched":
break;
}
messageBody = message.GetNotification().Body;
}
else
{
messageBody = message.Data.Values.First();
}
try
{
MessagingCenter.Send(messageBody, "Update");
}
catch (Exception e)
{
}
SendLocalNotification(messageBody);
}
这是我的SendLocalNotification方法。我希望远程通知也能触发这个方法,这样它们看起来就一样了。
void SendLocalNotification(string body)
{
//Unique request code to avoid PendingIntent collision.
var requestCode = new Random().Next();
// accept intent
var acceptIntent = new Intent(this, typeof(MainActivity));
acceptIntent.SetAction("ACCEPT_ACTION");
var pendingIntentAccept = PendingIntent.GetActivity(this, requestCode, acceptIntent, PendingIntentFlags.OneShot);
// decline intent
var declineIntent = new Intent(this, typeof(MainActivity));
declineIntent.SetAction("DECLINE_ACTION");
var pendingIntentDecline = PendingIntent.GetActivity(this, requestCode, declineIntent, PendingIntentFlags.OneShot);
var intent = new Intent(this, typeof(MainActivity));
intent.AddFlags(ActivityFlags.SingleTop);
var notificationBuilder = new NotificationCompat.Builder(this)
.AddAction(0, "Accept", pendingIntentAccept)
.AddAction(0, "Decline", pendingIntentDecline)
.SetContentTitle("Content Title")
.SetSmallIcon(Resource.Drawable.laundry_basket_icon_15875)
.SetContentText("content text")
.SetContentInfo("content info")
.SetSubText("sub text")
.SetAutoCancel(true)
.SetShowWhen(true)
.SetContentIntent(pendingIntentAccept)
.SetContentIntent(pendingIntentDecline);
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
notificationBuilder.SetChannelId(AppConstants.NotificationChannelName);
}
var notificationManager = NotificationManager.FromContext(this);
notificationManager.Notify(0, notificationBuilder.Build());
}
编辑:这是我用来发送通知的代码。我的印象是,有一个data
标签意味着正在发送一个数据通知,然后会被OnMessageReceived
接收。
public void SendNotificationByTag(string tag, string notificationBody = "", string notificationTitle = "")
{
var url = $"{_baseUrl}/messages/?api-version=2015-01";
var client = new RestClient($"{url}");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("ServiceBusNotification-Format", "gcm");
request.AddHeader("ServiceBusNotification-Tags", $"{tag}");
request.AddHeader("Authorization", $"{NotificationHelper.CreateSasToken(url, "DefaultFullSharedAccessSignature", $"{_configuration["DefaultFullSharedAccessSignature"]}")}");
request.AddParameter("application/json", $"{{"data":nt{{ntt"gcm.notification.body":"{notificationBody}", ntt"gcm.notification.title":"{notificationTitle}",nt}}n}}", ParameterType.RequestBody);
client.Execute(request);
}
Firebase云消息支持两种主要消息类型:
通知消息,有时被认为是";显示消息"这些由FCM SDK自动处理。
数据消息,由客户端应用程序处理。
听起来像是在发送通知消息。当您的应用程序处于非活动状态时,这些应用程序将由OS/SDK自动处理,并显示在系统托盘中,而不会调用您的代码。
如果您总是希望调用OnMessageReceived
,则应该只发送数据消息。
另请参阅:如何在Firebase 中后台处理应用程序的通知
所以看起来罪魁祸首是请求中有gcm.notification.title
和gcm.notification.body
。即使它在数据标记中,看起来它仍然将其作为通知消息传递。当我用常规的标题和正文标签替换这两个键时,当应用程序在后台时,我开始点击OnMessageReceived
。