Я работаю над приложением чата, например, 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" />
Есть ли разрешение, которое мне нужно запросить, чтобы это работало, когда приложение не запущено. Я даже установил приоритет уведомления на сервере так высоко, как это было видно. Я был разочарован этим. Пожалуйста, любая помощь приветствуется.