Phonegap Firebase Push Notification не запускает прослушиватель событий при открытии приложения или в фоновом режиме - PullRequest
7 голосов
/ 19 марта 2019

Я использую Phonegap и Firebase (fcm) для получения push-уведомлений.Для тестирования я использую Android 8.

Я хочу, чтобы мое устройство получало push-уведомление, если приложение работает на переднем плане (как всплывающее сообщение в приложении).Если приложение закрыто или находится в фоновом режиме, я хочу, чтобы сообщение отображалось как уведомление, а когда я нажимаю на уведомление, оно открывает приложение на переднем плане и вызывает функцию события уведомления.

Вот чтопроисходит до сих пор:

  • Когда приложение открыто, в приложении появляется push-уведомление и отображается - ПРАВИЛЬНО

  • Когда приложениесвернутое push-уведомление появляется в верхней панели - ПРАВИЛЬНО ... но

  • Когда я нажимаю на сообщение с уведомлением, оно открывает мое приложение / помещает его на передний план, но прослушиватель событий "уведомления"не вызывается - НЕПРАВИЛЬНО

Есть много запросов о помощи по этой проблеме, и я прошел через многие из них, но ни один из них не предлагает работающего решения для моего приложения (большинствомежду 2016 и 2018, а не 2019).

В первую очередь это должно работать для Android.Поэтому я попытался удалить полезные данные уведомлений и использовать только полезные данные.Однако это не решает проблему.

Вот моя текущая полезная нагрузка:

$notification = array
(
'body'   => 'test',
'title'     => 'test',
"icon" =>  'notification_icon',
"content_available" => true,
);

$data = array
(
"title" => "test",
"body" => "test",
"icon" => "notification_icon",
"content_available" => true,
);

$fields = array
(
'registration_ids'  => $registrationIds,
'notification'      => $notification,
'data'          => $data,
"priority" => "high",
"content_available" => true 
);

Насколько я понимаю, есть 3 способа отправить уведомление:

1) как "уведомление" .Это работает на переднем плане, если приложение в данный момент запущено, или на заднем плане в верхней панели, если приложение закрыто или свернуто (а над значком для приложения есть небольшой значок над ним, указывающий сообщение), но в фоновом режиме,когда сообщение щелкает по приложению, загружается, но функция уведомления НЕ вызывается.

2) как «данные» .Кажется, это ТОЛЬКО работает на переднем плане, без сообщения верхней панели, а значок приложения не имеет небольшой значок над ним.Если приложение находится в фоновом режиме, push-уведомление вообще отсутствует.

3) как ОБА "notificaton" и "data" .Когда в фоновом режиме значок приложения имеет значок над ним.При нажатии на сообщение в верхней строке приложение загружается, но функция уведомления НЕ вызывается.

Кроме того, даже если приложение находится в фоновом режиме, если оно получает push-уведомление и помещает приложение в всплывающее окно.уведомление не отображается.Это работает, только если приложение уже находится на переднем плане при получении уведомления.

Вот мои слушатели событий:

var app = {
initialize: function() {
    this.bindEvents();
},
bindEvents: function() {
    document.addEventListener('deviceready', this.onDeviceReady, false);
},
onDeviceReady: function() {
  console.log('Received Device Ready Event');
  app.setupPush();
},
setupPush: function() {
    var push = PushNotification.init({
      android: {
        senderID: 'XXXXXXXXXX',  
        iconColor: "#ccc",
        alert: true,
        badge: true,
        icon: 'notification_icon',
        sound: true,
        vibrate: true,
      },
      browser: {},
      ios: {
        sound: true,
        vibration: true,
        badge: true
      },
      windows: {}
    });
    console.log('after init');

    push.on('registration', function(data) {
         //[edit - script not displayed for this example, but it registers a token to enable push notifications to the device. tested and working]
    });

    push.on('error', function(e) {
      console.log('push error = ' + e.message);
    });

    push.on('notification', function(data) {
       window.alert(data.additionalData);              //Test line

      if(data.additionalData.foreground){
        window.alert(data.title+'\n'+data.message);    //Test line
      }
      if(data.additionalData.coldstart){
        window.alert("coldstart");                     //Test line
      }
      showPopup(data,"info");

    });


  }
};

//Using Sweet Alert to display messages

function showPopup(data,type){
   Swal.fire({
     type: type,
     title: data.title,
     text: data.message,
     showConfirmButton: true,
     imageUrl: data.image,
     imageWidth: 400,
     imageHeight: 200,
    imageAlt: data.title,
    animation: true,
  });
}

У кого-нибудь есть ответ на вышеприведенный вопрос, который работает для Android7 и 8?

1 Ответ

3 голосов
/ 20 мая 2019

Ваша логика отправки уведомлений солидна, но ваши опасения также справедливы. Если вы хотите узнать больше на эту тему, google notification vs data notifications, есть несколько хороших статей, объясняющих это.

Push-уведомления имеют специальный встроенный приемник при открытии, ваш WebView должен зарегистрироваться для этих событий. Однако, если вы посмотрите на источник , события открытия уведомлений не обрабатываются. Вы ничего не можете сделать, если не разветвляете хранилище.

Более того, .on('notification') события не получаются вашим WebView, когда приложение убито, потому что ... ну, ваше приложение убито. Ваше приложение не получает уведомление, когда оно убито, ОС Android получает его и решает, что с ним делать.

Что касается того, почему вы заметили проблему в Android 8, последние версии Android более агрессивно убивали приложения в фоновом режиме, чтобы сэкономить заряд батареи: Doze и Адаптивный аккумулятор . Новые приложения для Android просто убиваются раньше.

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

...