- Оригинальный адрес:How JavaScript works: the mechanics of Web Push Notifications
- Оригинальный автор:Alexander Zlatkov
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:Starrier
- Корректор:allen,старый профессор
Это глава 9 из серии, посвященной JavaScript и его строительным блокам. В процессе определения и описания основных элементов мы также поделились тем, что создаем легкое приложение JavaScript.SessionStackНекоторые эмпирические правила, которые следует использовать, когда приложение должно быть надежным, производительным и помогать пользователям видеть и воспроизводить ошибки веб-приложений в режиме реального времени.
Если вы пропустили первые несколько глав, вы можете найти их здесь:
- Как работает JavaScript: обзор движка, среды выполнения, стека вызовов
- Как работает JavaScript: 5 советов по оптимизации кода в движке V8
- Как работает JavaScript: управление памятью + обработка 4 распространенных утечек памяти
- Как работает JavaScript: подъем петли событий и асинхронного программирования + 5 советов для лучшего кодирования с Async / ждут
- Как работает JavaScript: глубокое погружение в WebSockets и HTTP/2 с SSE и как выбрать правильный
- Как работает JavaScript: конкуренция с WebAssembly + Почему WebAssembly лучше, чем JavaScript в некоторых ситуациях
- Как работает JavaScript: внутреннее устройство веб-работника и 5 сценариев, которые вы должны использовать
- Как работает JavaScript: жизненный цикл Web Worker и варианты использования
Сегодня мы сосредоточимся на веб-push-уведомлениях: рассмотрим их составные части, изучим процесс отправки/получения уведомлений и, наконец, поделимсяSessionStackКак использовать эти функции для создания новых продуктов.
Push-уведомления широко используются в сфере мобильных телефонов. В сеть они почему-то пришли очень поздно, несмотря на долгий звонок от разработчиков.
Обзор
Веб-push-уведомления позволяют пользователям подписаться на получение обновлений в веб-приложении, которые предназначены для повторного привлечения пользовательской базы с контентом, который часто интересен, важен и актуален для пользователя.
Push на основе нашегопредыдущий постСервисные работники подробно обсуждаются в .
В этом случае причиной использования Service Workers является то, что они работают в фоновом режиме. Это полезно для push-уведомлений, потому что это означает, что их код будет выполняться только тогда, когда пользователь взаимодействует с самим уведомлением.
Push и уведомление
Push и Notification — это два разных API.
- толкать —— Вызывается, когда серверная сторона отправляет сообщение Service Worker
- Уведомление —— Это действие в Service Worker или сценарии веб-приложения, которое отображает информацию для пользователя.
толкать
Есть три шага для реализации push:
- UI—— Добавьте необходимую логику на стороне клиента, чтобы позволить пользователям подписываться на push-уведомления.Это логика JavaScript, которая нужна вашему пользовательскому интерфейсу веб-приложения, чтобы пользователи могли регистрироваться для получения push-уведомлений.
- Отправить push-сообщение —— Реализуйте вызов API на сервере, который будет запускать push-сообщение на устройство пользователя.
- Принимать push-сообщения—— Обработайте push-сообщение, как только оно достигнет браузера.
Теперь опишем весь процесс более подробно.
Обнаружение поддержки браузера
Во-первых, нам нужно проверить, поддерживает ли текущий браузер push-сообщения. Мы можем проверить, поддерживаются ли push-сообщения, двумя простыми способами:
- экзамен
navigator
на объектеserviceWorker
- экзамен
window
на объектеPushManager
Обе проверки выглядят так:
if (!('serviceWorker' in navigator)) {
// Service Worker isn't supported on this browser, disable or hide UI.
return;
}
if (!('PushManager' in window)) {
// Push isn't supported on this browser, disable or hide UI.
return;
}
Зарегистрировать сервисного работника
На данный момент мы знаем, что эта функция поддерживается. Следующим шагом будет регистрация нашего сервис-воркера.
Как зарегистрировать сервис-воркера, вы должны узнать из одной из наших предыдущих статейуже знакомый.
спросить разрешение
После регистрации сервис-воркера мы можем приступить к подписке пользователей. Для этого нам нужно его разрешение на отправку ему push-сообщений.
Получить лицензированный API относительно просто, но недостатком является то, что API ужеОт принятия обратных вызовов к возврату Promise, что создает проблему: мы не можем сказать, какую версию API реализует текущий браузер, поэтому вам нужно реализовать и обрабатывать обе версии.
Это выглядит так:
function requestPermission() {
return new Promise(function(resolve, reject) {
const permissionResult = Notification.requestPermission(function(result) {
// Handling deprecated version with callback.
resolve(result);
});
if (permissionResult) {
permissionResult.then(resolve, reject);
}
})
.then(function(permissionResult) {
if (permissionResult !== 'granted') {
throw new Error('Permission not granted.');
}
});
}
Notification.requestPermission()
Вызов отобразит следующее приглашение для пользователя:
После авторизации, закрытия или блокировки мы получим результат в строковом формате:‘granted’
,‘default’
или‘denied’
.
Помните, что если пользователь нажимаетBlock
Кнопка, ваше веб-приложение не сможет снова запросить разрешение пользователя, пока они вручную не "разблокируют" ограничения вашего приложения, изменив состояние разрешения. Эта опция скрыта в интерфейсе настроек.
Пользователь подписывается с помощью PushManager
После того, как мы зарегистрировали работника службы и получили разрешение, когда вы регистрируете своего работника службы, мы можем сделать это, позвонивregistration.pushManager.subscribe()
для подписки пользователей.
Весь фрагмент может выглядеть так (включая регистрацию сервис-воркера):
function subscribeUserToPush() {
return navigator.serviceWorker.register('service-worker.js')
.then(function(registration) {
var subscribeOptions = {
userVisibleOnly: true,
applicationServerKey: btoa(
'BEl62iUYgUivxIkv69yViEuiBIa-Ib9-SkvMeAtA3LFgDzkrxZJjSgSnfckjBJuBkr3qBUYIHBQFLXYp5Nksh8U'
)
};
return registration.pushManager.subscribe(subscribeOptions);
})
.then(function(pushSubscription) {
console.log('PushSubscription: ', JSON.stringify(pushSubscription));
return pushSubscription;
});
}
registration.pushManager.subscribe(options)
принять одинoptionsобъект, который содержит обязательные и необязательные параметры:
-
userVisibleOnly: логическое значение, указывающее, что возвращенная push-подписка будет использоваться только для сообщений, видимых пользователю. он должен быть установлен на
true
, иначе вы получите ошибку (для этого есть исторические причины). -
applicationServerKey: в кодировке Base64
DOMString
илиArrayBuffer
Содержит открытый ключ, используемый push-сервером для аутентификации сервера приложений.
Ваш сервер должен сгенерировать паруключ сервера приложений- Также известные как ключи VAPID, они уникальны для вашего сервера. Они представляют собой пару открытого и закрытого ключей. Закрытый ключ тайно хранится на вашем терминале, а открытый ключ передается клиенту. Эти ключи позволяют службе push-уведомлений узнать, какой сервер приложений подписывается на пользователя, и убедиться, что это тот же самый сервер, который инициировал push-сообщение для этого конкретного пользователя.
Вам нужно создать пару закрытый/открытый ключ только один раз для вашего приложения. Способ сделать это сделать это -web-push-codelab.glitch.me/.
Когда браузер подписывается на пользователя,applicationServerKey
(открытый ключ) к службе push-уведомлений, что означает, что служба push-уведомлений может привязать открытый ключ приложения к ключу пользователя.PushSubscription
середина.
Ситуация такова:
- Когда ваше веб-приложение загружено, вы можете вызвать
subscribe()
чтобы передать ключ вашего сервера. - Браузер делает запрос к службе push, которая генерирует конечную точку, связывает эту конечную точку с ключом и возвращает конечную точку браузеру.
- Браузеры добавляют эту конечную точку в
PushSubscription
объект, который проходит черезsubscribe()
обещания вернулся.
После этого всякий раз, когда вы хотите отправлять push-сообщения, вам нужно создатьAuthorization header. Когда служба push-уведомлений получает запрос на отправку push-сообщения, она проверяет заголовок, ища открытый ключ, который уже подключен к этой конкретной конечной точке (второй шаг).
толкать объект
PushSubscription
Содержит всю информацию, необходимую пользовательскому устройству для отправки push-сообщений. нравится:
{
"endpoint": "https://domain.pushservice.com/some-id",
"keys": {
"p256dh":
"BIPUL12DLfytvTajnryr3PJdAgXS3HGMlLqndGcJGabyhHheJYlNGCeXl1dn18gSJ1WArAPIxr4gK0_dQds4yiI=",
"auth":"FPssMOQPmLmXWmdSTdbKVw=="
}
}
endpoint
URL-адрес push-сервиса. Чтобы вызвать push-сообщение, отправьте запрос POST на этот URL-адрес.
здесьkeys
Значение объекта используется для шифрования данных сообщения, приносимых push-сообщением.
После того, как пользователь подписался, и у вас естьPushSubscription
, вам нужно отправить его на ваш сервер. Там (на сервере) вы сохраняете эту подписку в базе данных и используете ее с этого момента, если хотите отправлять сообщения этому пользователю.
Отправить push-сообщение
Если вы хотите отправлять push-сообщения пользователям, вам сначала понадобится служба push-уведомлений. Вы сообщаете службе push-уведомлений (через вызовы API), какие данные отправлять, кто будет получать данные и другие критерии того, как отправлять данные. Обычно этот вызов API выполняется на вашем сервере.
push-сервис
Служба push-уведомлений должна получить запрос, подтвердить запрос и доставить push-сообщение в соответствующий браузер.
Обратите внимание, что служба push не управляется вами - это сторонняя служба. Ваш сервер взаимодействует со службой push через API. Примером push-сервиса являетсяФКМ Google.
Служба push выполняет всю тяжелую работу, например, если браузер находится в автономном режиме, служба push ставит сообщение в очередь и ждет, пока браузер вернется в режим онлайн, прежде чем отправлять соответствующее сообщение.
Каждый браузер использует любую услугу push-уведомлений, которую он хочет, что находится вне контроля разработчика.
Однако все push-сервисы имеют одинаковый API, поэтому особых сложностей в процессе внедрения не возникает.
Чтобы получить URL-адрес для отправки push-запроса сообщения, вам необходимо проверитьPushSubscription
хранится в объектеendpoint
ценность.
API push-уведомлений
Push Service API предоставляет способ отправки сообщений пользователям. API на основеПротокол веб-передачи, который является стандартом IETF, определяющим, как выполнять вызовы API для отправки служб.
Данные, которые вы отправляете с помощью push-сообщений, должны быть зашифрованы. Это не позволяет службе push-уведомлений просматривать отправленные данные. Это важно, потому что браузер может решить, какую службу push использовать (он может использовать ненадежный и небезопасный сервер).
Для каждого push-сообщения вы также можете предоставить следующее описание:
- TTL —— Определите, как долго сообщение будет находиться в очереди.По истечении этого времени сообщение будет удалено, а не отправлено. .
- приоритет —— Определите приоритет сообщения, поскольку служба push-уведомлений отправляет только сообщения с высоким приоритетом для защиты аккумулятора устройства пользователя.
- Topic —— Дайте push-сообщениям тему, и новые сообщения заменят ожидающие сообщения с той же темой, чтобы пользователи не получали устаревшие сообщения, когда устройство активно.
Push-события в браузере
Как упоминалось выше, после того, как сообщение отправлено службе push-уведомлений, оно будет оставаться на линии до тех пор, пока не произойдет одно из следующих событий:
- Устройство находится в сети.
- Срок действия сообщения истек в очереди из-за TTL.
Когда push-сервис доставляет сообщение, браузер получает его, расшифровывает и отправляетpush
событие.
Лучше всего здесь то, что браузер может выполнять вашего сервисного работника, даже когда ваша веб-страница не открыта. Произойдут следующие вещи:
- Push-сообщение поступает в браузер, который его расшифровывает.
- Браузер будит Service Worker
-
push
События отправляются сервис-воркерам
Код для настройки прослушивателя push-событий должен быть аналогичен коду любого другого прослушивателя событий, написанного на JavaScript:
self.addEventListener('push', function(event) {
if (event.data) {
console.log('This push event has data: ', event.data.text());
} else {
console.log('This push event has no data.');
}
});
Одна вещь, которую нужно знать о Service Workers, заключается в том, что вы не можете контролировать, как долго выполняется ваш код Service Worker. Браузер решает, когда его разбудить, а когда прекратить.
В сфере обслуживания,event.waitUntil(promise)
Уведомляет браузер о том, что работа выполняется до тех пор, пока обещание не будет разрешено. Он не должен завершать работу сервисного работника, если он хочет завершить работу.
вот обработкаpush
Примеры событий:
self.addEventListener('push', function(event) {
var promise = self.registration.showNotification('Push notification!');
event.waitUntil(promise);
});
перечислитьself.registration.showNotification()
Пользователю отправляется уведомление, и возвращается обещание, которое разрешается всякий раз, когда сообщение показывает это обещание.
showNotification(title, options)
Методы могут быть визуально скорректированы в соответствии с вашими потребностями.title
параметр являетсяstring
, тогда как options — это объект, который выглядит так:
{
"//": "Visual Options",
"body": "<String>",
"icon": "<URL String>",
"image": "<URL String>",
"badge": "<URL String>",
"vibrate": "<Array of Integers>",
"sound": "<URL String>",
"dir": "<String of 'auto' | 'ltr' | 'rtl'>",
"//": "Behavioural Options",
"tag": "<String>",
"data": "<Anything>",
"requireInteraction": "<boolean>",
"renotify": "<Boolean>",
"silent": "<Boolean>",
"//": "Both Visual & Behavioural Options",
"actions": "<Array of Strings>",
"//": "Information Option. No visual affect.",
"timestamp": "<Long>"
}
Подробнее о содержании каждой опции можно прочитать здесь — developer.Mozilla.org/en-US/docs/….
Push-уведомления — отличный способ привлечь внимание пользователей, когда у них есть срочная, важная и срочная информация, которой они хотят поделиться.
Например, мы в SessionStack планируем использовать push-уведомления для оповещения пользователей о сбоях, проблемах или исключениях в их продукте. Это позволит пользователю немедленно узнать, что есть проблема. Затем они могут использовать данные, собранные нашей библиотекой (такие как модификации DOM, взаимодействия с пользователем, сетевые запросы, необработанные исключения и отладочная информация), чтобы воспроизвести проблему в виде видео и увидеть все, что в конечном итоге происходит с пользователем.
Эта функция не только помогает клиентам понять и воспроизвести любые проблемы, но и уведомляет клиентов при первом возникновении проблемы.
если ты хочешьпопробуйте SessionStack, вот бесплатный план.
ресурс
- Developers.Google.com/Web/Женщины большие…
- Developers.Google.com/Web/Женщины большие…
- Developers.Google.com/Web/Женщины большие…
- Developers.Google.com/Web/Женщины большие…
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.