Push API
========

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

Об использовании Push API
-------------------------

> 
> **Обратите внимание:** При использовании PushManager-подписок жизненно важно защищать запросы от CSRF/XSRF-атак в вашем приложении. Подробнее читайте по ссылкам:
> 
> 
> * Cross-Site Request Forgery (CSRF) Prevention Cheat Sheet
> * Preventing CSRF and XSRF Attacks
> 
> 
> 

Для получения сообщений от сервера у приложения должен быть активированный сервис-воркер. После активации у сервис-воркера появится возможность подписаться на канал для получения сообщений, используя `PushManager.subscribe()`.

В результате подписки будет получен объект `PushSubscription` (en-US) со всей необходимой информацией, которая может потребоваться приложению для обращения за сообщениями на сервер: URL-адрес и ключ шифрования.

После подписки сервис-воркеру можно добавить обработчик `ServiceWorkerGlobalScope.onpush` для получения сообщений от сервера. В качестве реакции на сообщение можно, например, обращаться к серверу за данными и показывать пользователю уведомление с помощью метода `ServiceWorkerRegistration.showNotification()`.

Для сервис-воркера каждая подписка уникальна, а её URL-адрес — уникальная специальная ссылка. Поскольку это всё, что нужно для обращения к серверу, данную ссылку нужно держать в секрете, иначе любое другое приложение сможет воспользоваться вашим сервером.

Для получения push-сообщений сервис-воркеру требуются ресурсы, что может влиять, например, на расход батареи. Во всех браузерах эти проблемы решаются по-разному, какого-то единого стандарта на этот счёт нет. Например, браузер Firefox ограничивает количество сообщений, которое можно отправить приложению, однако сообщения с показом уведомления в этот лимит не попадают. В Chrome таких ограничений нет.

Интерфейсы
----------

`PushEvent` (en-US)

Описывает действие, направленное в глобальную область видимости (en-US) `сервис-воркера`. Включает информацию, переданную сервером `подписчикам` (en-US).

`PushManager`

Предоставляет возможность подписаться на сообщения от сторонних серверов и получить URL-адрес для отправки push-уведомлений.

`PushMessageData` (en-US)

Содержит данные, отправленные сервером, и методы для управления ими.

`PushSubscription` (en-US)

Предоставляет возможность получить URL-адрес подписки, а также содержит метод для отписки.

`PushSubscriptionOptions` (en-US)

Описывает параметры конкретной подписки.

Методы сервис-воркера для работы c Push API
-------------------------------------------

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

`ServiceWorkerRegistration.pushManager` Только для чтения 

Позволяет обратиться к интерфейсу по управлению подписками `PushManager`, в том числе для добавления подписки, получения информации о текущей подписке, а также позволяет узнать о возможности отправки сообщений. Работа с push-сообщениями начинается с этого свойства сервис-воркера.

`ServiceWorkerGlobalScope.onpush`

Обработчик событий, срабатывает всякий раз, когда происходит событие `push`; то есть при получении push-сообщений от сервера.

`ServiceWorkerGlobalScope.onpushsubscriptionchange`

Обработчик событий, срабатывает всякий раз, когда происходит событие `pushsubscriptionchange`; будет полезен в ситуациях, когда подписка была просрочена или вот-вот будет просрочена (при условии, что для подписки был указан срок действия).

Примеры
-------

На сайте-инструкции по работе с сервис-воркерами от Mozilla вы найдёте множество примеров использования **Push API**.

Спецификации
------------

| Спецификация |
| --- |
| Push API |

Совместимость с браузерами
--------------------------

### api.PushEvent

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

### api.PushMessageData

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

Смотрите также
--------------

* Sending VAPID identified WebPush Notifications via Mozilla's Push Service
* Web Push Notifications: Timely, Relevant, and Precise, Joseph Medley
* Service Worker API