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

Для отправки Push-уведомления нам понадобится браузер, удобный для сервис-воркеров, https для безопасности (страницы github — хороший вариант для тестирования), хотя мы можем использовать нашу локальную настройку для целей разработки. Если у вас есть общее представление о том, что такое сервис-воркеры и что они могут сделать, мы можем двигаться вперед, если вы еще не знаете, не беспокойтесь! Я бы посоветовал вам прочитать статью Мэтта Гонта о знакомстве с сервис-воркерами.

Начало работы:

У меня есть образец репозитория Push-уведомлений на моем github, чтобы вы могли начать работу.

Во-первых, мы проверим, совместим ли браузер с Service Worker. Для этого просто проверим, есть ли в навигаторе сервис-воркер:

if (‘serviceWorker’ in navigator) {
 console.log(‘Service Worker is supported’);
 }
else {
 console.log(‘Service Worker is not supported’);
}

После успешной проверки мы можем установить сервис-воркер:

this.addEventListener(‘install’, function(event) {
 self.skipWaiting();
 console.log(‘SW Installed’, event);
});
self.addEventListener(‘activate’, function(event) {
 console.log(‘SW Activated’, event);
});

Мы использовали skipWaiting, чтобы новый сервис-воркер мог легко переопределить существующий, если он уже есть, а затем активировать его, но отображая консольное сообщение.

Мы будем использовать консоль разработчика Google для аутентификации, а после активации мы создадим новый проект в консоли разработчика Google и сохраним копию номера проекта и перейдем к панели инструментов, нажмите Используйте Google API и найдите Google Cloud Messaging. Там мы можем Создать учетные данные для Ключ API и выбрать Ключ браузеразатем введите для него имя и создайте его. Запишите сгенерированный ключ API и держите его под рукой.

После того, как консоль разработчика Google будет готова, мы создадим файл манифеста приложения, в котором будет указана информация о вашем приложении, такая как его имя, gcm_sender_id, значки, ориентация… Мы можем связать манифест в индексном файле

<link rel="manifest" href="manifest.json">

В наш файл манифеста мы добавим имя и gcm_sender_id. Нашим gcm_sender_id будет номер проекта, созданный при создании нового проекта в Google Developers Console.

{
  "name": "Sample Push Notifications App",
  "gcm_sender_id": "1059485227799"
}

Следующим шагом будет попросить пользователя разрешить вам показывать уведомления, и для этого мы обновим код сервисного работника, который мы использовали для проверки присутствия сервисного работника.

if ('serviceWorker' in navigator) {
    console.log('Service Worker is supported');
    navigator.serviceWorker.register('sw.js').then(function(reg) {
        console.log(reg);
        reg.pushManager.subscribe({
            userVisibleOnly: true
        }).then(function(sub) {
            console.log('endpoint:', sub.endpoint);
        });
    }).catch(function(error) {
        console.log(error);
    });
}

Аргумент userVisibleOnly: true указывает браузеру, что уведомление всегда будет отображаться при получении push-сообщения. Обязательно показать уведомление. Теперь вы сможете увидеть уведомление в браузере с предложением разрешить или заблокировать уведомление.

В вашей консоли вы должны увидеть конечную точку, которая выглядит как

endpoint: https://android.googleapis.com/gcm/send/fVUz58zOPmc:APA91bHSTz5z8QxD_Ym-YLWNQN-tk08H0qceuTBJ88tnBXIzcVBbomq9BPvpxyusHxMIBK6d3lUhz708Dd2gEW-erDZ-Bh8b03eCdWKMGboNoDmNyc4D8oWHwxHMC00s8zkwp8nSpSF1

Мы добавим прослушиватель событий для push-уведомления, чтобы отображать уведомление всякий раз, когда push-уведомление создается.

self.addEventListener('push', function(event) {
  console.log('You received a push message', event);
  var title = 'Wohoo! You got your Push';
  event.waitUntil(
    self.registration.showNotification(title, {
      body: 'click me to take you to my site',
      icon: 'images/icon.png',
    })
  );
});

Обратите внимание, что push, который мы отправляем, будет консольным сообщением и событием push, обещание waituntil() ожидает, пока обещание showNotification() не будет разрешено.

Теперь мы перейдем к обработке события клика, т. е. когда пользователь нажмет на push-уведомление, что произойдет? Мы создали заголовок, текст и значок для push-уведомления на предыдущем шаге, и в этом случае, когда пользователь нажимает на уведомление, он будет перенаправлен на мой веб-сайт.

self.addEventListener('notificationclick', function(event) {
  event.notification.close();
  var url = 'http://www.alvimurtaza.com';
  event.waitUntil(
    clients.matchAll({
      type: 'window'
    })
    .then(function(windowClients) {
      if (clients.openWindow) {
        return clients.openWindow(url);
      }
    })
  );
});

Теперь у нас есть все настройки для запуска push-уведомления с помощью терминала.

curl --header "Authorization: key=<Your Project API key>" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send -d "{\"registration_ids\":[\"<your endpoint>\"]}"

В поле ‹Ваш ключ API проекта› напишите свой ключ API, который был сгенерирован из Google Cloud Messagingи в‹ваша конечная точка› напишите конечную точку, которая находится в консоли после https://android.googleapis.com/gcm/send/

В моем случае это

curl --header "Authorization: key=<Your Project API key>" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send -d "{\"registration_ids\":[\"fVUz58zOPmc:APA91bHSTz5z8QxD_Ym-YLWNQN-tk08H0qceuTBJ88tnBXIzcVBbomq9BPvpxyusHxMIBK6d3lUhz708Dd2gEW-erDZ-Bh8b03eCdWKMGboNoDmNyc4D8oWHwxHMC00s8zkwp8nSpSF1\"]}"

ОТЛИЧНАЯ РАБОТА! наше приложение push-уведомлений настроено, и мы получили ваш первый толчок.