OnMessageRecieved不会在后台应用程序中被触发

问题描述 投票:0回答:1

我正在尝试重定向到点击其他通知后显示的其他页面。当应用程序在后台运行时,仅当其在前台运行时,才会触发OnMessagedRecieved。

根据文档notification foreground, background,将触发其系统托盘。

所以我查找了如何使其在后台运行,我发现了此tutorial

根据本教程:

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

所以我查找了确切的数据消息和通知消息。 Documentation

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

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");
    }

Raw 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

}

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

可能是什么问题?

android firebase push-notification xamarin.android firebase-cloud-messaging
1个回答
0
投票

1。为什么会这样?

FCM(Firebase云消息传递)中有两种消息:

  1. Display Messages:仅当您的应用程序位于foreground
  2. 中时,这些消息才触发onMessageReceived()回调
  3. 数据消息:如果您的应用程序位于前景/背景/被杀死中,这些消息将触发onMessageReceived()回调even

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

2。怎么做?

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

[POST https://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}"]
}

NOTE:确保您未添加 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
}

这是指here

© www.soinside.com 2019 - 2024. All rights reserved.