OnMessageRecured не срабатывает в фоновом приложении - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь перенаправить на другую страницу, нажимаемую на различные уведомления. OnMessagedRectained не запускается, когда приложение работает в фоновом режиме, только когда оно находится на переднем плане.

В соответствии с документацией передний план уведомления, фон - это системный трей, который запускается.

Итак, я посмотрел, как заставить его работать в фоновом режиме, я нашел этот учебник .

В соответствии с этим учебником:

Как объясняется ниже, с помощью консоли 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");
    }

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

}

Уведомление получено, но OnMessageReceded не сработало. Я думаю, что центр уведомлений является ответственным за отображение уведомлений.

В чем может быть проблема?

1 Ответ

1 голос
/ 12 марта 2020

1. Почему это происходит?

В FCM (Firebase Cloud Messaging) есть два типа сообщений:

  1. Отображение сообщений : эти сообщения вызывают onMessageReceived() обратный вызов только тогда, когда ваше приложение находится на переднем плане
  2. сообщения данных : эти сообщения вызывают onMessageReceived() обратный вызов даже , если ваше приложение находится на передний план / фон / убит

ПРИМЕЧАНИЕ: Команда Firebase еще не разработала пользовательский интерфейс для отправки data-messages на ваши устройства. Вы должны использовать свой сервер для отправки этого типа!



2. Как?

Для этого необходимо выполнить POST запрос на следующий URL:

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
     }
}

Или, если вы хотите отправить его на указанный c устройств

{
    "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. Как обработать сообщение уведомления pu sh?

Вот как вы обрабатываете полученное сообщение:

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

     // Manage data
}

это относится к здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...