Push-уведомления в приложениях на базе Quasar реализуются через интеграцию с внешними сервисами доставки сообщений и нативными API платформ. В зависимости от целевой среды (SPA, PWA, Cordova, Capacitor, Electron) используются разные механизмы:
Ключевые компоненты системы:
Quasar автоматически генерирует Service Worker при использовании режима PWA. Для работы с push необходимо расширить файл:
/src-pwa/custom-service-worker.js
Пример обработки события push:
self.addEventListener('push', event => {
const data = event.data.json()
const options = {
body: data.body,
icon: 'icons/icon-128x128.png',
badge: 'icons/icon-128x128.png',
data: {
url: data.url
}
}
event.waitUntil(
self.registration.showNotification(data.title, options)
)
})
self.addEventListener('notificationclick', event => {
event.notification.close()
const url = event.notification.data.url
event.waitUntil(
clients.openWindow(url)
)
})
В клиентском коде (например, boot-файл Quasar):
async function subscribeUser () {
const registration = await navigator.serviceWorker.ready
const subscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: '<VAPID_PUBLIC_KEY>'
})
return subscription
}
Ключевые моменты:
userVisibleOnly: true — обязательное требование
браузеровapplicationServerKey — публичный VAPID ключДля Web Push используется механизм VAPID (Voluntary Application Server Identification):
Пример генерации (Node.js):
npx web-push generate-vapid-keys
Пример на Node.js с использованием библиотеки
web-push:
const webpush = require('web-push')
webpush.setVapidDetails(
'mailto:example@domain.com',
VAPID_PUBLIC_KEY,
VAPID_PRIVATE_KEY
)
const payload = JSON.stringify({
title: 'Новое сообщение',
body: 'У вас есть обновление',
url: 'https://example.com'
})
webpush.sendNotification(subscription, payload)
Для мобильных приложений Quasar (через Capacitor или Cordova) чаще используется FCM.
npm install @capacitor/push-notifications
npx cap sync
import { PushNotifications } from '@capacitor/push-notifications'
PushNotifications.requestPermissions().then(result => {
if (result.receive === 'granted') {
PushNotifications.register()
}
})
PushNotifications.addListener('registration', token => {
console.log('Token:', token.value)
})
PushNotifications.addListener('pushNotificationReceived', notification => {
console.log('Получено уведомление:', notification)
})
Обработка клика:
PushNotifications.addListener('pushNotificationActionPerformed', action => {
console.log('Действие:', action)
})
Сервер должен хранить:
Рекомендуется:
Пример структуры:
{
"userId": "123",
"platform": "web",
"subscription": { ... }
}
Quasar предоставляет UI-утилиту Notify:
import { Notify } from 'quasar'
Notify.create({
message: 'Новое сообщение',
color: 'primary',
position: 'top'
})
Сценарии использования:
Для мобильных приложений можно использовать локальные уведомления:
npm install @capacitor/local-notifications
Пример:
import { LocalNotifications } from '@capacitor/local-notifications'
await LocalNotifications.schedule({
notifications: [
{
title: 'Напоминание',
body: 'Проверить данные',
id: 1,
schedule: { at: new Date(Date.now() + 10000) }
}
]
})
Notification.requestPermission().then(permission => {
if (permission === 'granted') {
// можно подписываться
}
})
Разрешения обрабатываются через API плагинов (Capacitor / Cordova).
Используются системные уведомления:
new Notification('Заголовок', {
body: 'Текст уведомления'
})
Push-уведомления ведут себя по-разному:
| Состояние | Поведение |
|---|---|
| Активное | Обрабатывается в приложении |
| Фоновое | Показывается системой |
| Закрыто | Запускает приложение |
Важно:
Push-уведомления часто содержат ссылку:
{
"url": "/messages/42"
}
Обработка:
router.push(notification.data.url)
Минимизация спама
Размер payload
Fallback
Сегментация
navigator.serviceWorker.ready.then(reg => {
reg.pushManager.getSubscription().then(console.log)
})
1. Отсутствие HTTPS
2. Неверный VAPID ключ
3. Service Worker не зарегистрирован
4. Токен устарел
Action-кнопки в уведомлениях
actions: [
{ action: 'open', title: 'Открыть' },
{ action: 'close', title: 'Закрыть' }
]
Группировка уведомлений
tag: 'messages'
Silent push (ограниченно)
Push-уведомления часто используются вместе с:
Пример сценария:
При большом количестве пользователей:
Push-уведомления органично дополняют:
Это позволяет строить полноценные реактивные интерфейсы, синхронизированные с сервером в реальном времени.