Разработчики Mozilla представили [3] начальный прототип технологии Push Notifications [4], позволяющей организовать доставку уведомлений, отправляемых клиентам по инициативе сайтов. Используя представленную технологию сайт может отправить пользователю небольшое сообщение, даже когда данный сайт не открыт в браузере пользователя. В настоящее время похожие сервисы реализованы в iOS и Android, но они специфичны для каждой из этих платформ. Задачей Mozilla является создание универсальной реализации, которая могла бы выступать в роли web-стандарта. Технологию "Push Notifications" не стоит путать с механизмом "Desktop Notification", требующим для своей работы наличия открытого в браузере окна с сайтом.
Технология Push Notifications рассчитана на непосредственный вывод уведомлений пользователю (вывод уведомления осуществляет браузер) и является чем-то средним между email и системами мгновенного обмена сообщениями. В качестве областей возможного применения называется отправка webmail-системами уведомлений о получении новых email, генерация сообщений о наступлении каких-то событий, например, информации о проблемах от системы мониторинга или достижения курса валюты какого-то уровня.
Чтобы сообщения могли быть отправлены пользователю, сайт запрашивает подтверждение операции, при получении которого генерируется специальный URL-идентификатор доставки. Процесс доставки контролируется на стороне браузера, что защищает систему от возможных рассылок спама, - браузер забирает только сообщения из каналов доставки, с идентификаторами на которые явно подписался пользователь. Отменив подписку, пользователь больше не увидит сообщений, даже если сервер продолжит их отправлять.
Получив URL-идентификатор, серверное ПО сайта при необходимости отправки сообщения определённому пользователю, формирует по данному URL обычный POST-запрос с пакетом данных в json-формате (передаётся заголовок сообщения, тело сообщения, ссылка для перехода и другие информационные данные). URL-идентификаторы ссылаются на специальный промежуточный сервер нотификации (Notification Service [5]), который занимается приёмом запросов с серверов и организацией доставки сообщений клиентам. Периодически браузер проверяет наличие новых сообщений на серверах нотификации и забирает те, на которые имеется активная подписка. При этом доставка будет осуществлена даже если сообщение отправлено в момент неактивности пользователя, например, когда браузер не запущен. Способ доставки с сервера нотификации в браузер планируется реализовать с использованием методов, уже применяемых при работе функции синхронизации настроек (Firefox Sync). В качестве сервера нотификации могут выступать как централизованные службы, так и поднятое на своих мощностях специальное ПО [6].
API новой системы нотификации базируется на объекте navigator.notification. На начальном этапе подписки на уведомления, JavaScript-код сайта, который желает отправлять уведомления, вызывает метод notification.requestRemotePermission(), что приводит к выводу специального диалогового окна с вопросом о подтверждении подписки. Если подписка подтверждена на выходе формируется объект для дальнейшего слежения за событиями, связанными с оформлением подписки. Одновременно формируется запрос к серверу нотификации, в результате которого он генерирует уникальный URL-идентификатор, привязывающий сайт к пользователю. Затем данный URL-идентификатор возвращается в скрипт сайта через callback-вызов request.onsuccess, после чего передаётся на сервер, желающий отправлять сообщения.
var notification = (navigator.notification || navigator.mozNotification || navigator.webkitNotification); if (notification) { // Спрашивает подтверждения получения уведомлений var request = notification.requestRemotePermission(); request.onsuccess = function() { var url = request.result; console.log('New push URL: ' + url); // Сохраняет URL-идентификатор на своём сервере jQuery.post('/push-urls/', {url: url}); }; }
Ссылки:
[1] http://htfl.ru/cat-news-mozilla
[2] http://htfl.ru/cat-news-novosti
[3] /out.php?link=http://jbalogh.me/2012/01/30/push-notifications/
[4] /out.php?link=https://wiki.mozilla.org/Services/Notifications/Push/API
[5] /out.php?link=https://wiki.mozilla.org/Services/Notifications
[6] /out.php?link=https://github.com/jbalogh/push