Как заставить работника службы обрабатывать push, когда приложение работает в фоновом режиме? - PullRequest
0 голосов
/ 16 мая 2019

Я использую Firebase для отправки сообщений пользователям моего сайта, используя GuzzleHTTP из моего приложения laravel.Из того, что я понимаю, есть два способа обработки push: один использует сообщение notification, а другой заключает объект notification в data.notification использует FirebaseAPI, но, похоже, он не работает в фоновом режиме.Это работает только тогда, когда пользователь открыл PWA за последние несколько минут.Я хочу отправлять пользователям уведомления независимо от того, когда они последний раз открывали свой браузер.Я понимаю, что для этого мне следует использовать push eventListener, и я поместил код для него, но я всегда, кажется, получаю либо уведомление API firebase (когда сайт был открыт недавно), либо вообще никакого уведомления.

Вот мой обработчик сообщений firebase

messaging.setBackgroundMessageHandler(function(payload) {
  // Customize notification here
  var recep = JSON.stringify(payload);
  recep = JSON.parse(recep);
  var notification = recep.notification;
  //notification = JSON.stringify(notification);
  message = JSON.parse(notification);
  const notificationTitle = message.title;
  const notificationOptions = {
    body: message.body,
    icon: message.icon,
    badge: '/img/favicon.png',
    click_action: messaging.click_action
  };

  return self.registration.showNotification(notificationTitle,
      notificationOptions);
});

А вот мой обработчик сообщений или обработчик push:

self.addEventListener('push', function(e) {
  var body;

  if (e.data) {
    body = e.data.json().notification.body;
  } else {
    body = 'Alert from AppMate.Open the app to view details!';
  }

  var options = {
    body: body,
    icon: 'img/favicon.png',
    badge: 'img/favicon.png',
    vibrate: [100, 50, 100],
    data: {
      dateOfArrival: Date.now(),
      primaryKey: 1
    },
    actions: [
      {action: 'ap-mate', title: 'Visit AppMate!'}
    ]
  };
  e.waitUntil(
    self.registration.showNotification('Appmate Notification', options)
  );
});

А вот запрос, отправленный на конечную точку через GuzzleHTTP:

        $message = [
            'data' => [
               'notification' => [
                 'title' => $title,
                 'body' => $body,
                 'icon' => 'img/favicon.png',
                 'badge' => 'img/favicon.png'
             ],
            ],
            'notification' => [
                'title' => $title,
                'body' => $body,
                'icon' => 'img/favicon.png',
                'badge' => 'img/favicon.png',
                'click_action' => $action
            ],
            'to' => $reg_id
        ];
        $client = new Client([
            'headers' => [
                'Content-Type' => 'application/json',
                'Authorization' => 'key='.$access_token,
            ]
        ]);
        $response = $client->post('https://fcm.googleapis.com/fcm/send',
            ['body' => json_encode($message)]
        );
        return $response->getBody();
...