#android #firebase #notifications #firebase-cloud-messaging #push
#Android #firebase #уведомления #firebase-облако-обмен сообщениями #толкать
Вопрос:
Я использую FCM, все работает хорошо, уведомления отправляются с использованием «Данных», но при отображении это происходит. Я действительно больше не знаю, что делать.
public class CloudMessaging extends FirebaseMessagingService {
String NOTIFICATION_CHANNEL_ID = "Messages_Channel_ID";
@Override
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
createNotificationChannel();
Map<String, String> data = remoteMessage.getData();
final String title = data.get("title");
final String body = data.get("body");
final String conversation = data.get("conversation");
if (conversation == null) return;
NotificationCompat.Builder builder = new
NotificationCompat.Builder(getApplicationContext(), NOTIFICATION_CHANNEL_ID);
builder.setColor(Color.CYAN)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setContentText(body)
.setAutoCancel(true);
NotificationManager notificationManager = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(1, builder.build());
}
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = getString(R.string.message_channel_name);
String description = getString(R.string.message_channel_description);
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel messagesChannel = new
NotificationChannel(getString(R.string.Message_Notification_ID), name, importance);
messagesChannel.setDescription(description);
messagesChannel.enableVibration(true);
messagesChannel.setVibrationPattern(new long[]{1000, 200, 500});
messagesChannel.enableLights(true);
messagesChannel.setLightColor(Color.CYAN);
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(messagesChannel);
}
}
серверный сервер в Firebase Cloud Messaging:
const data = {
token: context.params.token,
data: {
title: document.username,
body: document.message,
conversation: document.conversationid,
},
android: {
notification: {
channel_id: "Messages_Channel_ID",
},
},
};
Все уведомления во всех sdk возвращаются следующим образом
Редактировать 1:
Делаю несколько тестов, и я понимаю, что метод onreceived никогда не вызывается, даже на заднем или переднем плане! Даже с классом, объявленным в манифесте! Но просто покажите пустое уведомление, потому что у меня также есть цвет и значок по умолчанию, объявленные в манифесте. Если оно не объявлено, вероятно, ничего не показывать.
Ответ №1:
Это очень странно, метод onMessageReceived должен вызываться хотя бы на переднем плане. Пожалуйста, проверьте стиль уведомлений и попробуйте пример кода, который у меня есть в этом репозитории.
public class PushNotificationHandbookService extends FirebaseMessagingService {
public static final String TAG = "PushHandbookService";
@Override
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
// You will receive the push notifications here!
Log.d(TAG, "From: " remoteMessage.getFrom());
// Check if message contains a notification payload.
if (remoteMessage.getNotification() != null) {
Log.d(TAG, "Title: " remoteMessage.getNotification().getTitle()
"Body: " remoteMessage.getNotification().getBody());
}
// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "Title: " remoteMessage.getData().get("title")
"Body: " remoteMessage.getData().get("body"));
sendNotification(remoteMessage);
}
}
...
private void sendNotification(RemoteMessage remoteMessage) {
String title = remoteMessage.getData().get("title");
String messageBody = remoteMessage.getData().get("body");
String score = remoteMessage.getData().get("score");
String country = remoteMessage.getData().get("country");
Intent intent = new Intent(this, PushReceiverActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("score", score);
intent.putExtra("country", country);
@SuppressLint("UnspecifiedImmutableFlag")
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
intent, PendingIntent.FLAG_ONE_SHOT);
String channelId = getString(R.string.default_notification_channel_id);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.drawable.ic_stat_name)
.setContentTitle(title)
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// Since android Oreo notification channel is needed.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(channelId,
"Channel human readable title",
NotificationManager.IMPORTANCE_DEFAULT);
notificationManager.createNotificationChannel(channel);
}
notificationManager.notify(0, notificationBuilder.build());
}
...
}
Используя сообщение, подобное этому:
var message = {
notification: {
title: title,
body: text
},
data: {
title: title,
body: text,
score: '4.5',
country: 'Canada'
},
android: {
notification: {
priority: 'high',
sound: 'default',
clickAction: '.PushReceiverActivity'
},
},
tokens: registrationTokens
};