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

Нативные уведомления в браузере — Notification API

Разработчику

См. также: События · Асинхронность · BOM и navigator · Кнопка "Поделиться" · Кнопка с загрузкой в React · Web API в браузере · Web API на практике - примеры кода


Задача

Пользователь нажимает кнопку на сайте, после чего браузер показывает системное уведомление. Сценарий работает нативно через возможности браузера и операционной системы, без создания отдельного desktop-приложения.

Базовые шаги:

  1. Проверить поддержку API.
  2. Запросить разрешение у пользователя.
  3. Показать уведомление после разрешения.

Плавный старт — что считать "полезным уведомлением"

Уведомление приносит ценность, когда зовёт пользователя к конкретному действию:

  • "Отчёт готов";
  • "Платёж подтверждён";
  • "Новая заявка требует ответа".

Такой формат работает лучше общих сообщений, потому что даёт понятный контекст и следующий шаг.


Мини-кейс "до/после"

ПодходРеакция пользователя
Дочастые однотипные уведомления, разрешение быстро отключается
Послередкие и точные события, пользователь чаще открывает уведомления

Что такое Notification API

Notification API позволяет странице показывать системные уведомления, похожие на уведомления от мессенджеров и почты.

У API два основных сценария:

СценарийМетод
Страница открыта, пользователь кликнул кнопкуnew Notification(title, options)
Фоновые уведомления через Service Workerregistration.showNotification(title, options)

Для учебного старта чаще используют new Notification(...) из обработчика клика.


Проверка поддержки и разрешения

Перед запуском проверяют, существует ли глобальный объект Notification:

if (!('Notification' in window)) {
alert('Этот браузер не поддерживает Notification API');
}

Разрешение хранится в Notification.permission:

ЗначениеЧто означает
defaultпользователь ещё не принял решение
grantedпоказывать уведомления можно
deniedбраузер блокирует уведомления для сайта

Запрос разрешения:

const permission = await Notification.requestPermission();

Обычно этот вызов запускают по действию пользователя, например в click, чтобы браузер не заблокировал запрос.


Пример с кнопкой и new Notification

HTML:

<button id="notify-btn" type="button">Проверить уведомление</button>
<script src="notify.js"></script>

JavaScript (notify.js):

const button = document.querySelector('#notify-btn');
if (!button) throw new Error('Кнопка #notify-btn не найдена');

button.addEventListener('click', async () => {
if (!('Notification' in window)) {
alert('Notification API не поддерживается');
return;
}

let permission = Notification.permission;
if (permission === 'default') {
permission = await Notification.requestPermission();
}

if (permission !== 'granted') {
alert('Разрешение на уведомления не выдано');
return;
}

const notification = new Notification('Hey! 👋', {
body: 'Ваш отчет готов к скачиванию.',
icon: '/logo.png',
tag: 'report-ready',
});

notification.onclick = () => {
window.focus();
location.href = '/reports/latest';
};
});

Поля уведомления в options

ПолеНазначение
bodyдополнительный текст
iconиконка уведомления
imageкрупное изображение, если поддерживается платформой
tagидентификатор для группировки похожих уведомлений
renotifyповторный сигнал при том же tag
silentуведомление без звука
dataслужебные данные для обработки клика

Платформы показывают эти поля по-разному. Часть опций может игнорироваться на конкретном устройстве.


Ограничения и практические правила

ПравилоЧто делать
Запрашивать разрешение только в контексте действия пользователявызывать requestPermission() внутри click
Уведомления доступны в безопасном контекстеиспользовать https или localhost в разработке
Пользователь может отключить уведомления в настройкахпроверять Notification.permission перед показом
Частые уведомления раздражаютотправлять только полезные события
Разный уровень поддержки браузеровдобавлять fallback внутри UI

Fallback обычно делают через инлайн-сообщение в интерфейсе, toast или копирование ссылки в буфер.


Когда нужен Service Worker

new Notification(...) работает, пока страница активна. Для фоновых сценариев, когда вкладка закрыта или свернута, применяют связку Push API + Service Worker + showNotification(...).

Пример в Service Worker:

self.addEventListener('push', (event) => {
const data = event.data?.json() ?? { title: 'Новое событие' };

event.waitUntil(
self.registration.showNotification(data.title, {
body: data.body ?? 'Откройте приложение, чтобы посмотреть детали',
icon: '/logo.png',
data: { url: data.url ?? '/' },
})
);
});

self.addEventListener('notificationclick', (event) => {
event.notification.close();
const target = event.notification.data?.url ?? '/';
event.waitUntil(clients.openWindow(target));
});

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


Частые ошибки

СимптомПричина
requestPermission всегда возвращает deniedпользователь ранее запретил уведомления
Уведомление не показывается после new Notificationсайт открыт по http, а не https
Код работает в одном браузере и не работает в другомразличия в поддержке опций и политик
Пользователь получает много одинаковых уведомленийнет tag и дедупликации событий

Политика уведомлений в продукте

Качество уведомлений определяется не только API, но и продуктовой дисциплиной:

  • уведомление приходит по событию с ценностью для пользователя;
  • частота ограничена правилами дедупликации и quiet-hours;
  • каждое уведомление ведёт в конкретный экран действия;
  • у пользователя есть настройка отключения отдельных типов событий.

Такой подход удерживает высокий CTR и снижает вероятность полного запрета разрешения на уровне браузера.


Чек-лист внедрения Notification API

ШагЧто проверить
Проверка возможностей'Notification' in window и статус Notification.permission
Разрешениезапрос только по действию пользователя
Безопасностьзапуск через HTTPS и безопасная обработка ссылок в onclick
Дедупликацияиспользование tag для повторяющихся событий
Фоновый режимService Worker + showNotification для push-сценариев

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


Краткий итог

  1. Нативные уведомления на сайте запускают через Notification API.
  2. Перед показом уведомления проверяют поддержку и разрешение пользователя.
  3. Базовый рабочий сценарий для открытой вкладки — new Notification(title, options).
  4. Фоновые push-уведомления реализуют через Service Worker и showNotification.
  5. Надёжный UX строится на уместной частоте уведомлений и fallback внутри интерфейса.

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").