Обработка android pu sh уведомлений, когда приложение не работает, как WhatsApp, Twitter, Facebook, Instagram и т. Д. - PullRequest
1 голос
/ 20 апреля 2020

Я работаю над приложением чата, например, WhatsApp. Когда приложение работает, я использую соединение через веб-сокет для обработки чатов между двумя пользователями, однако, когда приложение убито или не работает, я попытался использовать службу уведомлений FCM pu sh, чтобы уведомить пользователя о том, когда он получает сообщение, как как работает WhatsApp.

Проблема теперь заключается в том, что FCM получает уведомление pu sh, когда приложение находится на переднем плане или в фоновом режиме (скрыто из вида, но все еще в меню недавних задач), после того, как приложение удалено из меню недавних задач или вообще не запускается, уведомление не получено.

Я был здесь в течение целой недели, я искал и читал различные статьи и обсуждения сообщества на github, stackoverflow, quora и некоторых других сообщения в блоге, и я еще не нашел что-то, что работает.

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

Я имею в виду, как такие приложения, как WhatsApp, Twitter, Instagram, Facebook, Gmail, Likee, Tiktok и c обрабатывают уведомления Pu sh, так что даже хотя приложение закрыто (удалено из недавнего меню или не запущено вообще), оно все равно уведомляет об этом пользователи некоторых обновлений на сервере.

Вот мой код ... На сервере

const firebase_admin = require('firebase-admin');
var service_account = require('./service_account.json');
firebase_admin.initializeApp({
    credential: firebase_admin.credential.cert(service_account),
    databaseURL: 'https://fcm_pushnotification-b9983.firebaseio.com/'
});

app.get('/sendPushNotification', (req, res) => {
    // This registration token comes from the client FCM SDKs.
    var registrationToken = 'clIilmqTRYarMF4gcrpEeH:APA91bFjkmZP7gU836ZCAzyPZaOWU4nU4SLL5OPWNkgukt0zBe0zvn5PEQ-42g60R5UXFN0tXQISjCDcbl032j2Tc81_OZ5uAJ7Aq3_OAaIz7g56oT547LnB9wiiBIKRZhc1TWGMP7lr';

    var message = {
        notification: {
            title: 'Samuel',
            body: 'This is an urgent message!',
        },
        webpush:{
            headers:{
                Urgency:'high'
            }
        },
        android:{
            priority:'high'
        },
        token: registrationToken
    };


    // Send a message to the device corresponding to the provided
    // registration token.
    firebase_admin.messaging().send(message)
      .then((response) => {
        // Response is a message ID string.
        console.log('Successfully sent message:', response);
        res.send('Successfully sent message:- '+ response);
      })
      .catch((error) => {
        console.log('Error sending message:- ', error);
        res.send('Error sending message:'+ error);
      });
});

Мой класс обслуживания на android

public class MyFirebaseMessagingService extends FirebaseMessagingService{
    /**
     * Called if InstanceID token is updated. This may occur if the security of
     * the previous token had been compromised. Note that this is called when the InstanceID token
     * is initially generated so this is where you would retrieve the token.
     */
    @Override
    public void onNewToken(@NonNull String token) {
        Log.d(TAG, "Refreshed token: " + token);

        // If you want to send messages to this application instance or
        // manage this apps subscriptions on the server side, send the
        // Instance ID token to your app server.
        sendRegistrationToServer(token);
    }

    @Override
    public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        String title = remoteMessage.getNotification().getTitle();
        String body = remoteMessage.getNotification().getBody();
        this.sendNotification(new Notification(null, title, body, 0));
    }

    private void sendNotification(Notification notification){
    // Notification channel and notification is build here.
    }

}

Манифест

<uses-permission android:name="android.permission.INTERNET" />

        <service
            android:name=".Services.MyFirebaseMessagingService"
            android:exported="true">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

 <!-- Set custom default icon. This is used when no icon is set for incoming notification messages. -->
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@drawable/ic_heart" />
        <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
             notification message. -->
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_color"
            android:resource="@color/red" />
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_channel_id"
            android:value="@string/notification_channel_id" />

Есть ли разрешение, которое мне нужно запросить, чтобы это работало, когда приложение не запущено. Я даже установил приоритет уведомления на сервере так высоко, как это было видно. Я был разочарован этим. Пожалуйста, любая помощь приветствуется.

1 Ответ

0 голосов
/ 20 апреля 2020

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

Внесите указанные ниже изменения в метод onMessageReceived

Map<String, String> data = remoteMessage.getData().get("data");
String title = data.getOrDefault("title", "");
String body = data.getOrDefault("body", "");

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

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