DEV Community

Igor
Igor

Posted on

Progressive Web Application:: Reliable. Part II

Привет!

Мы продолжаем работу по разработке PWA и изучаем способы использования service worker (SW).

В части I мы:

  • написали свой service worker;
  • с помощью Workbox и workbox-webpack-plugin включили в приложение возможность использовать наш SW.

Регистрация service worker

В части I мы остановились на файле app.js -  точке входа в приложение, проверили возможность использовать SW и выполнили метод registerServiceWorker.

Рассмотрим файл reg_sw.js, в котором описан этот метод.

Основной метод registerServiceWorker для регистрации SW :

/**
 * регистрация service worker (любого)
 * @param serviceWorker - имя фала js являющегося service worker
 * @returns {Promise<void>}
 */
async function registerServiceWorker(serviceWorker) {
    try {
        // регистрируем service worker
        const registration = await navigator.serviceWorker.register(serviceWorker);
        console.log('ServiceWorker registered: ', registration);
        // пытаемся подписаться на PUSH уведомления
        subscribeToPushNotifications(registration);
    } catch (e) {
        // что-то пошло не так
        // скорее всего отсутствует поддержка service worker
        console.error('ServiceWorker failed', e);
    }
}

При успешной регистрации SW попытаемся подписаться на PUSH уведомления  -  метод subscribeToPushNotifications:

  • запросим доступ на получение уведомлений — метод pushStatus
  • попытаемся подписаться на уведомления
/**
 * подписка на PUSH сообщения
 * @param registration
 * @returns {Promise<void>}
 */
async function subscribeToPushNotifications(registration) {
    // проверяем возможность работать с PUSH сообщениями
    if ('pushManager' in registration) {
        // опциональные параметры для подписки на Push уведомления
        const options = {
            userVisibleOnly: true,
            applicationServerKey: urlBase64ToUint8Array('BEl62iUYgUivxIkv69yViEuiBIa-Ib9-SkvMeAtA3LFgDzkrxZJjSgSnfckjBJuBkr3qBUYIHBQFLXYp5Nksh8U'),
        };

        // проверяем разрешение от пользователя
        // обрабатывать PUSH уведомления
        const status = await pushStatus;

        if (status) {
            // разрешение на уведомления есть
            // пытаемся подписаться
            try {
                // подписка на PUSH уведомления
                const subscription = await registration.pushManager.subscribe(options);
                console.log('Push registration registered', subscription);
            } catch (e) {
                console.error('Push registration failed', e);
            }
        }
    }
}

Получение доступа к PUSH уведомлениям реализовано в методе pushStatus. Управление уведомлениями производится через интерфейс Notification из Notifications API.

const pushStatus = new Promise(resolve => {
    // смотрим права на получение уведомлений,
    // выставленные пользователем
    Notification.requestPermission(result => {
        const el = document.createElement('div');
        el.classList.add('push-info');

        if (result !== 'granted') {
            // уведомления запрещены
            el.classList.add('inactive');
            el.textContent = 'Push blocked';
            resolve(false);
        } else {
            // уведомления разрешены
            el.classList.add('active');
            el.textContent = 'Push active';
            resolve(true);
        }

        document.body.appendChild(el);
    });
});

При регистрации SW и PUSH уведомлений нужно учитывать одну важную деталь. Зарегистрировать SW возможно только в песочнице localhost, например при работе с webpack-dev-server. Для работы в production вэб-страница должна быть загружена по протоколу Https и иметь (само собой) сертификат вэб-сервера.

Заключение

Мы зарегистрировали service worker. Этот подход может использоваться для любых SW, независимо от того как они получены — сформированы workbox, написаны нами или использованы готовые.

Продолжение следует

Часть I :

  • пишем свой service worker
  • с помощью Workbox и workbox-webpack-plugin включаем в приложение возможность использовать наш service worker

Часть III:

  • жизненный цикл service worker
  • стратегии кеширования
  • использование workbox-webpack-plugin модуль GenerateSW

Исходники

Полностью с исходным кодом проекта описанного в статье можно ознакомиться на github по ссылке: https://github.com/stokaboka/pwa01

Спасибо за внимание!

Буду рад вашим замечаниям и критике. Эта статья была написана в учебных целях, чтобы разобраться с технологией PWA и Service Worker.

Top comments (0)