Я пытаюсь отправить некоторые данные своим пользователям через новую службу уведомлений Pushbase Firebase.
Я добавляю элементы пользовательских данных "ключ-значение" с "Текст сообщения" - "dbupdate", чтобы определить, есть ли сообщение обновления или обычное push-уведомление, которое я хочу показать своим пользователям.
В моем приемнике я проверяю, есть ли пользовательские данные и запускается обновление, если это правда.
Если это не так, я показываю нормальное уведомление с текстовым сообщением.
Работает только при открытии моего приложения. Если приложение закрыто, уведомление показывается в любом случае, а моя проверка if даже не работает,
некоторый код:
public class PushMessageService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
Map<String,String> data = remoteMessage.getData();
String link = data.get("link");
String name = data.get("name");
if (link!=null) {
Log.d("link",link);
Log.d("name",name);
UpdateHelper.Go(this, link, name);
}
else {
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_shop_white_24dp)
.setAutoCancel(true)
.setContentTitle(remoteMessage.getNotification().getTitle())
.setContentText(remoteMessage.getNotification().getBody());
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(5, mBuilder.build());
}
}
}
пример notficiation
здесь
Почему это так? Что можно сделать для запуска моего кода, даже когда приложение закрыто?
Ответ 1
В соответствии с моим опытом работы с Firebase push:
Проблема: При отправке push-уведомления через "Firebase console" уведомление появляется только тогда, когда приложение находится на переднем плане. Если приложение убито или находится в фоновом режиме, уведомление отображается только в версии >= lollipop с неправильным значком уведомления и/или открытием активности запуска по умолчанию в приложении, даже если вы определили другую активность в PendingIntent.
В соответствии с документами Firebase push-сообщение разделяется на 2 пар, они их называют: Ссылка на документы здесь
- Уведомление
- полезная нагрузка данных
![введите описание изображения здесь]()
Решение:
Существует два способа отправить сообщение "Push".
1. Firebase Console
![Консоль]()
2. API обмена сообщениями. Изображение, показывающее запрос с использованием расширенного клиента REST.
![Запрос Curl]()
Push-сообщение получено в методе onMessageReceived(...)
. Firebase onMessageReceived(...)
будет не получать , если, приложение находится в фон или убито, только когда сообщение отправляется через Firebase Console.
Если вы отправляете сообщение через API, он отлично работает. Сообщение поставляется в onMessageReceived(...)
методе, находится ли приложение в фоновом режиме, переднем плане или убито. (Внимание: это нормально работает в >=Lollipop
- поведение для Android 4.4 или ниже по-прежнему непредсказуемо.
Обновление:
Вы можете отправить push-сообщение из API (firebase call it downstream msg) следующим образом: https://firebase.google.com/docs/cloud-messaging/downstream
Отправка исходящих сообщений с сервера
Для адресации или "целевого" нисходящего сообщения сервер приложений устанавливается с маркером регистрации получающего клиента. Вы можете отправлять уведомления с предопределенными полями или сообщениями настраиваемых данных; см. Уведомления и данные в полезной нагрузке сообщения для получения подробной информации о поддержке полезной нагрузки. Примеры на этой странице показывают, как отправлять сообщения данных в протоколах HTTP и XMPP.
Запрос HTTP POST
https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
{ "data": {
"score": "5x1",
"time": "15:10"
},
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}
Ответ 2
Когда приложение находится на переднем плане, уведомления будут переданы в FirebaseMessagingService.onMessageReceived()
. Когда приложение не находится на переднем плане, уведомление будет обрабатываться центром уведомлений по умолчанию.
Также смотрите:
Ответ 3
В Android, если вы хотите обновить someting в приложении, находится ли приложение в состояниях forground/background/terminated, тогда лучший способ - удалить полезную нагрузку уведомления и отправить только полезную нагрузку данных
{
"to" : "ee8....DYarin",
"data" : {
"key" : "value"
}
}
В этом случае onMessageReceived()
будет выполнен.
(В некоторых устройствах Android, таких как xiomi, вам нужно включить автозапуск приложения для обработки нажатий в состояниях с завершением)
В этом случае, как вы будете показывать уведомление пользователю? Вы можете передавать название и тело в качестве пользовательских тегов в полезной нагрузке данных и генерировать уведомление программно.
Так что в Android все идет хорошо, без полезной информации.
И если у вас есть полезная нагрузка для уведомлений в Android, тогда возникают проблемы:
- Если приложение находится в форексе, все идет хорошо, уведомление отображается
и onMessageReceived() выполняется
- Если приложение находится в состоянии background/terminated, уведомление будет отображаться на вашем устройстве, но
onMessageReceived() будет работать, только если вы нажмете на уведомление.
У пользователей есть тенденция часто их очищать, а наш код в
onMessageReceived() не будет выполнен.
Кроме того, чтобы включить эту функцию щелчка в уведомлении, полезная нагрузка уведомления должна содержать ключ с именем click_action
:
"notification":{
"title":"Prime",
"body" : "test",
"click_action": "my_click_action_name"
}
И вам нужно зарегистрировать действие как aim_filter в вашей деятельности.
<intent-filter>
<action android:name="my_click_action_name" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Когда пользователь нажимает на уведомление, вызывается метод onNewIntent()
для текущей операции, и полезная нагрузка данных доступна в текущем ответе intent.getExtras()