Уведомление Firebase pu sh о новом сообщении чата - PullRequest
0 голосов
/ 28 мая 2020

Я создал приложение, в котором у меня есть чат.

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

Для этого я использую службу Firebase.

Теперь, когда сообщение отправлено, я вызываю этот метод: я создал следующий класс MyFirebaseMessagingService для проверки, когда он вызывается :

private class MyTask extends AsyncTask<MyTaskParams, Void, Void> {
    @Override
    protected Void doInBackground(MyTaskParams... params) {
        String userDeviceIdKey = params[0].url;
        String title = params[0].title;
        String body = params[0].body;

        String authKey = "XXXXX";   // You FCM AUTH key
        String FMCurl = "https://fcm.googleapis.com/fcm/send";
        URL url;
        try {
            url = new URL(FMCurl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            conn.setUseCaches(false);
            conn.setDoInput(true);
            conn.setDoOutput(true);

            conn.setRequestMethod("POST");
            conn.setRequestProperty("Authorization","key="+authKey);
            conn.setRequestProperty("Content-Type","application/json");

            JSONObject json = new JSONObject();
            json.put("to",userDeviceIdKey);
            json.put("priority","high");
            JSONObject info = new JSONObject();
            info.put("title", title);   // Notification title
            info.put("body", body); // Notification body
            info.put("var1", chatID);
            info.put("var2",receiverID);
            info.put("var3",itemID);
            json.put("data", info);

            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
            wr.write(json.toString());
            wr.flush();
            Log.w("", "getInstanceId failed" + json);

            conn.getInputStream();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }
}

и В моей службе я создал:

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        Log.d("TESTING_MESSAGE", "" + remoteMessage);

    }

}

Однако, похоже, я никогда не получаю это Log, когда отправляю сообщение, и оно не похоже на onMessageReceived когда-либо вызывается.

Есть ли причина?

Моя следующая цель - сделать уведомление внутри onMessageReceived, но я хочу сначала убедиться, что доберусь туда.

Мой манифест:

<service
    android:name=".service.MyFirebaseMessagingService"
    android:permission="com.google.android.c2dm.permission.SEND">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    </intent-filter>
</service>

Ответы [ 3 ]

1 голос
/ 30 мая 2020

Я делаю демонстрационное приложение с вашим кодом, и оно хорошо работает, и я вижу, что функция onMessageReceived срабатывает при получении сообщения.

Я использую версию firebase-messaging 20.1.7

implementation 'com.google.firebase:firebase-messaging:20.1.7'

, поэтому я думаю, вам следует выполнить следующую проверку:

  1. проверьте, находится ли ваше приложение на переднем плане. потому что вы не можете запустить onMessageReceived, когда приложение находится в фоновом режиме. см .: https://firebase.google.com/docs/cloud-messaging/android/receive#handling_messages

  2. проверьте, правильно ли вы написали токен устройства (ваше поле userDeviceIdKey) при отправке HTTP-запроса.

  3. проверьте, есть ли в вашем HTTP-запросе ошибка в перехвате.

надеюсь может вам помочь.

0 голосов
/ 29 мая 2020

Прежде всего проверьте, что вы отправляете: сообщение с данными или уведомление. Они могут выглядеть одинаково, но в зависимости от типа сообщения вызывается другой метод. Проверьте это: https://firebase.google.com/support/faq/#fcm - android -background

// Проверяем, содержит ли сообщение полезную нагрузку уведомления.

if (remoteMessage.getNotification() != null) {
  Map test = remoteMessage.getData();
  Log.d(TAG, "Message data payload: " + test);

// Проверяем, содержит ли сообщение полезная нагрузка данных.

 if (remoteMessage.getData().size() > 0) {
    if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Message Notification Body: " + 
           remoteMessage.getNotification().getBody());
0 голосов
/ 29 мая 2020

Метод onMessageReceived() никогда не будет вызван, если приложение будет убито. Firebase onMessageReceived не вызывается, когда приложение работает в фоновом режиме

...