Обновление базы данных push-уведомлений Firebase

Я пытаюсь отправить некоторые данные своим пользователям через новую службу уведомлений 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()