Перейти к содержимому

JavaScript Push API и уведомления

Введение в Push API в JavaScript

Push API в JavaScript — это важный инструмент для разработчиков, стремящихся улучшить веб-приложения с помощью уведомлений в реальном времени. В сочетании с API Service Workers он позволяет веб-приложениям получать сообщения, отправляемые с сервера, даже когда приложение не открыто в браузере. Эта функция имеет решающее значение для взаимодействия с пользователями с помощью своевременных обновлений и интерактивной коммуникации.

Реализация Push-уведомлений

Настройка Service Workers

Сначала нам нужно зарегистрировать service worker, который будет обрабатывать фоновые задачи по отправке уведомлений:


javascript
// Registering a service worker
if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('/service-worker.js')
        .then(function(registration) {
            console.log('Service Worker registered with scope:', registration.scope);
        }).catch(function(error) {
            console.log('Service Worker registration failed:', error);
        });
}

Запрос разрешения на уведомления

Перед отправкой уведомлений необходимо запросить разрешение у пользователя:


html
<button id="enable-notif-btn">Enable Notifications</button>
<script>
    // Asking user permission for notifications
    function requestPermission() {
        Notification.requestPermission().then(function(permission) {
            console.log('Notification permission:', permission);
        });
    }
    document.getElementById('enable-notif-btn').addEventListener('click', requestPermission);
</script>

Подписка на Push-уведомления

Получив разрешение, приложение может подписаться на push-уведомления:


html
<button id="subscribe-btn">Subscribe to Push Notifications</button>
<script>
    function subscribeToPush() {
        navigator.serviceWorker.ready.then(function(registration) {
            // Modern browsers require userVisibleOnly: true to prevent background-only subscriptions
            registration.pushManager.subscribe({
                userVisibleOnly: true,
                applicationServerKey: 'YOUR_VAPID_PUBLIC_KEY' // Replace with your actual VAPID public key
            })
            .then(function(subscription) {
                console.log('Push subscription:', subscription);
            }).catch(function(error) {
                console.log('Failed to subscribe to push:', error);
            });
        });
    }
    document.getElementById('subscribe-btn').addEventListener('click', subscribeToPush);
</script>

Этот скрипт обрабатывает процесс подписки. Рекомендуется явно устанавливать userVisibleOnly: true, чтобы обеспечить согласованное поведение в разных браузерах и соответствовать стандартам конфиденциальности.

Примечание: Для фактической доставки сообщений subscribe() обычно требует applicationServerKey (ваш открытый ключ VAPID). Соответствующий закрытый ключ используется вашим сервером для аутентификации в Push-сервисе.

Обработка входящих Push-сообщений

Для обработки входящих сообщений service worker прослушивает события push:


javascript
// Inside service-worker.js
self.addEventListener('push', function(event) {
    var options = {
        body: 'New notification.',
        icon: 'icon.png',
        vibrate: [100, 50, 100],
        data: { primaryKey: 1 }
    };

    event.waitUntil(
        self.registration.showNotification('Push Notification', options)
    );
});

self.addEventListener('notificationclick', function(event) {
    event.notification.close();
    event.waitUntil(
        clients.openWindow('https://example.com')
    );
});

self.addEventListener('pushsubscriptionchange', function(event) {
    console.log('Subscription changed, re-subscribing...');
    // Re-subscribe using the same parameters
    event.registration.pushManager.subscribe({
        userVisibleOnly: true,
        applicationServerKey: 'YOUR_VAPID_PUBLIC_KEY'
    }).then(function(newSubscription) {
        console.log('Re-subscribed:', newSubscription);
    }).catch(function(error) {
        console.error('Re-subscription failed:', error);
    });
});

Примечание: Для доставки push-сообщений требуется серверная часть, отправляющая HTTP-запросы в Push-сервис с использованием ключей VAPID. В этом руководстве основное внимание уделяется клиентской реализации.

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

Лучшие практики для Push-уведомлений

  • Вовлечение пользователей: Разрабатывайте уведомления так, чтобы они были своевременными, релевантными и точными.
  • Соблюдение конфиденциальности: Всегда убедитесь, что согласие пользователя получено перед отправкой уведомлений.
  • Производительность: Управляйте частотой и временем отправки уведомлений, чтобы не перегружать пользователя.
  • Обновление подписки: Push-подписки периодически истекают. Реализуйте клиентскую логику для проверки статуса подписки и повторной подписки при необходимости или обрабатывайте события истечения срока действия из service worker.

Заключение

Push API открывает канал для прямого взаимодействия с пользователями, предоставляя мощный инструмент для вовлечения. Используя этот API, разработчики могут обеспечить более динамичный и отзывчивый пользовательский опыт. Правильная реализация push-уведомлений может значительно улучшить функциональность и привлекательность веб-приложений, информируя пользователей и поддерживая их интерес.

Practice

Каковы возможности и требования JavaScript Push API?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.