OnMessageReciveed未在后台应用程序中被解雇



我正试图通过单击不同的通知来重定向到不同的页面。当应用程序在后台运行时,只有当它在前台时,OnMessagedRecived才会被触发。

根据文档通知前台,后台是被触发的系统托盘。

所以我查了一下如何让它在后台工作,我找到了这个教程。

根据本教程:

如下所述,通过使用FCM控制台,您只能发送通知消息。通知消息可以由前台应用程序中的onMessageReceived方法处理,并在后台应用程序中传递到设备的系统托盘。用户点击通知,将打开默认的应用程序启动器。如果要在应用程序的每个状态下处理通知,则必须使用数据消息和onMessageReceived方法。

所以我查了什么是数据消息,什么是通知消息。文档

我遵循了教程,但对我不起作用。这是我的代码:

public async Task<bool> WakeUp(string[] tokens)
{
var message = new Message()
{
RegistrationID= tokens,
Notification = new Notification()
{
Title = "testing",
Body = "test"
},
Android = new AndroidConfig()
{
Notification = new AndroidNotification()
{
Color = "#FF0000",
ClickAction = "MyActivity"
}
},
Data = new Dictionary<string, string>()
{
{
"notificationType", NotificationType.WakeUp.ToString()
}
}
};
return await SendAsyncMessage(message).ConfigureAwait(false);
}

public async Task<bool> SendAsyncMessage(Message message)
{
var jsonMessage = JsonConvert.SerializeObject(message);
var request = new HttpRequestMessage(HttpMethod, FIREBASE_PUSH_NOTIFICATION_URL)
{
Content = new StringContent(jsonMessage, Encoding.UTF8, "application/json")
};
request.Headers.TryAddWithoutValidation("Authorization", $"key={ConfigurationManager.AppSettings["FirebaseNotificationServerKey"]}");
request.Headers.TryAddWithoutValidation("Sender", $"id={ConfigurationManager.AppSettings["FirebaseNotificationSenderID"]}");
HttpResponseMessage result;
using (var client = new HttpClient())
{
result = await client.SendAsync(request).ConfigureAwait(false);
}
return result.IsSuccessStatusCode;
}

这就是我在应用程序中接收代码的方式

public override void OnMessageReceived(RemoteMessage message)
{
Console.WriteLine("message recieved");
}

原始Json

{
"registration_ids":["myToken"],
"condition":null,
"data":
{
"notificationType":"WakeUp"
},
"notification":
{
"title":"testing",
"body":"test",
"image":null
},
"android":
{
"collapse_key":null,
"restricted_package_name":null,
"data":null,
"notification":
{
"title":null,
"body":null,
"icon":null,
"color":"#FF0000",
"sound":null,
"tag":null,
"image":null,
"click_action":"mActivity",
"title_loc_key":null,
"title_loc_args":null,
"body_loc_key":null,
"body_loc_args":null,
"channel_id":null
},
"fcm_options":null,
"priority":"high",
"ttl":null
},
"webpush":null,
"apns":null,
"fcm_options":null,
"topic":null

}

已收到通知,但未触发OnMessageRecived。我认为通知中心负责显示通知。

可能是什么问题?

1。为什么会发生这种情况

FCM(Firebase Cloud Messaging(中有两种类型的消息:

  1. 显示消息:只有当您的应用程序处于前台时,这些消息才会触发onMessageReceived()回调
  2. 数据消息:如果您的应用程序处于前台/后台/终止,这些消息甚至会触发onMessageReceived()回调

注意:Firebase团队尚未开发出将data-messages发送到你的设备。您应该使用您的服务器发送此类型!



2.如何

为了实现这一点,您必须对以下URL执行POST请求:

POSThttps://fcm.googleapis.com/fcm/send

标头

  • 键:Content-Type值:application/json
  • 键:Authorization值:key=<your-server-key>

身体使用主题

{
"to": "/topics/my_topic",
"data": {
"my_custom_key": "my_custom_value",
"my_custom_key2": true
}
}

或者,如果您想将其发送到特定设备

{
"data": {
"my_custom_key": "my_custom_value",
"my_custom_key2": true
},
"registration_ids": ["{device-token}","{device2-token}","{device3-token}"]
}


注意:请确保未添加JSON密钥notification
注意:要获取服务器密钥,您可以在firebase控制台中找到它:Your project -> settings -> Project settings -> Cloud messaging -> Server Key

3.如何处理推送通知消息

这就是您处理收到的消息的方式:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
Map<String, String> data = remoteMessage.getData();
String myCustomKey = data.get("my_custom_key");
// Manage data
}

这是指这里的

相关内容

  • 没有找到相关文章

最新更新