
Push-уведомления для InstantCMS 2 (обновление)
Компонент Web Push-уведомлений с полной поддержкой кроссплатформенности.
Возможности
- Подписка/отписка пользователей и гостей
- Массовая и одиночная рассылка уведомлений
- VAPID-аутентификация
- Расписание рассылок (CRON)
- Очередь отправки для больших объёмов
- Шаблоны уведомлений
- Статистика и логирование
- Привязка подписок гостей к авторизованным пользователям
- Автоматическая очистка старых логов
- Rate limiting для защиты от спама
Кроссплатформенность
Поддерживаемые браузеры
| Браузер | Windows | Linux | macOS | Android | iOS |
|---|---|---|---|---|---|
| Chrome | — | ||||
| Firefox | — | ||||
| Edge | — | — | |||
| Opera | — | ||||
| Yandex | — | ||||
| Safari | — | — | — | ||
| Samsung Internet | — | — | — | — |
iOS Safari: Apple не реализовала Web Push API. Для iOS требуется интеграция с APNs (Apple Push Notification service).
Особенности реализации
- Service Worker с кроссплатформенной обработкой push-событий
- Корректное определение браузеров: Chrome, Firefox, Edge, Opera, Yandex, Safari
- Обработка pushsubscriptionchange для автоматической реподписки
- Actions (кнопки) в уведомлениях для Chrome/Edge/Opera/Firefox
- Навигация: фокус существующей вкладки или открытие новой
Автоматические события
Компонент поддерживает 12 событий профиля пользователя:
| # | Событие | Системный хук | Статус |
|---|---|---|---|
| 1 | Новые комментарии | comment_after_add | |
| 2 | Ответы на комментарии | comment_after_add | |
| 3 | Приглашения в группы | groups_after_accept_request | |
| 4 | Новые сообщения | messages_after_send | |
| 5 | Запросы дружбы | users_add_friendship | |
| 6 | Одобренные запросы дружбы | users_add_friendship | |
| 7 | Прекращение дружбы | users_after_delete_friendship | |
| 8 | Записи на стене | wall_after_add | |
| 9 | Новые записи в подписках | notify_subscribers | |
| 10 | Оценки записей | rating_vote | |
| 11 | Скором окончании публикации | notify_expired_content_items | |
| 12 | Публикация контента | content_after_add_approve |
Другие таблицы
- push_templates — шаблоны
- push_schedule — расписание
- push_queue — очередь
- push_events — журнал событий
Привязка подписок гостей
Механизм
- Гость подписывается → генерируется UUID v4 → сохраняется в guest_id + cookie push_guest_id
- Гость авторизуется → хук auth_login → привязывает подписки к user_id → удаляет cookie
- Гость регистрируется → хук user_registered → привязывает подписки к новому user_id → удаляет cookie
Структура cookie
| Параметр | Значение |
|---|---|
| Имя | push_guest_id |
| Срок жизни | 1 год |
| HttpOnly | Да |
| SameSite | Lax |
Безопасность
- Cookie HttpOnly недоступна из JavaScript
- guest_id невозможно подделать (UUID v4)
- Привязка возможна только к авторизованному пользователю
- Подписки привязываются только один раз (cookie удаляется)
- Условие user_id = NULL предотвращает перепривязку
API для разработчиков
Фронтенд
// Проверка поддержки icmsPush.isSupported(); // true/false // Информация о браузере icmsPush.getBrowserInfo(); // { isOpera, isYandex, isChrome, isFirefox, isSafari, isIOS, isEdge, ... } // Подписаться await icmsPush.subscribe(); // Получить текущую подписку const sub = await icmsPush.getSubscription(); // Показать popup вручную icmsPush.showPrompt(); // Скрыть popup icmsPush.hidePrompt();
Payload уведомления
{ title: 'Заголовок', // до 65 символов body: 'Текст', // до 200 символов url: '/page', // ссылка при клике icon: '/icon.png', // иконка badge: '/badge.png', // бейдж tag: 'unique-id', // тег для renotify requireInteraction: false, // не закрывать автоматически silent: false, // без звука actions: [ // кнопки (Chrome/Edge/Firefox) { action: 'open', title: 'Открыть' }, { action: 'dismiss', title: 'Закрыть' } ], vibrate: [100, 50, 100], // вибрация renotify: true // повторное уведомление }
Улучшения и развитие
Высокий приоритет
- Интеграция с APNs (Apple Push Notification service)
- Поддержка iOS Safari
- Генерация Safari Push Package
- Сертификаты APNs
- Отдельный endpoint для Safari
- Проверка настроек «не беспокоить»
- Учитывать настройки пользователя в профиле
- Фильтровать получателей по настройкам уведомлений
- Повторная попытка при временных ошибках
- При network error, timeout не удалять подписку сразу
- Добавить механизм повторных попыток
- Увеличить attempts перед удалением
Средний приоритет
- Улучшенная аналитика
- Open rate (открытие уведомлений)
- Click rate (переходы по ссылкам)
- Conversion tracking
- A/B тестирование
- Разные варианты заголовков/текстов
- Время отправки
- Сегментация аудитории
- Web Panel ( административный интерфейс)
- Мониторинг в реальном времени
- Графики и дашборды
- Экспорт статистики
- Сегментация подписчиков
- По типу устройства
- По браузеру
- По дате подписки
- По активности
Низкий приоритет
- Темы уведомлений
- Разные звуки для разных типов
- Кастомные вибрации
- Цветные иконки (Android)
- Группировка уведомлений
- Не отправлять 10 уведомлений сразу
- Группировать за 5 минут
- Отправлять одно «у вас 10 новых...»
- Оптимизация доставки
- Задержка между запросами (throttling)
- Параллельная отправка
- Очередь с приоритетами
- Документация для администраторов
- Как настроить VAPID
- Как тестировать
- Troubleshooting
Требования
- PHP 8.2+
- HTTPS (обязательно для Service Worker)
- Расширение PHP: curl, json
- Composer: minishlink/web-push (включён в комплект)
- MySQL 5.7+ / MariaDB 10.2+




Купить можно автоматически если вдруг не пришел архив, напишите в ЛС или на почту support@maxicms.ru. Есть проблемы с работой почты поэтому заранее прошу прощение.
Архив получил спасибо!
Как человек и разработчик идеальный!
Дополнение решило для меня многие проблемы. Спасибо!
На странице после оплаты почему-то не подгрузидись видимо стили
Да есть проблема в работе сайте домен и NS на клаудфларе и периодически все идет не так. Пытаюсь решить эту проблему. Прошу прощение что не отправились сразу архивы я все проверяю в ручном варианте и все получат их. Прошу прощение за заминки.
Я немного ошибся в требованиях нужен php 8.2 для работы, всех кто купил и у вас стоит 7.4 отпишитесь в ЛС я сегодня завтра отправлю вам версию с поддержкой 7.4
Подписался в гугл хром. Статистика засчитала.
Подписался в Яндекс браузере — в статистике не отобразилось. Учитывается IP адрес или браузеры?
Есть такая ошибка я прошу прощение выпал из потока жизни у нас тут провайдеры видать делают настройки блокировок инет 3 дня не работал даже на сайт инстант не смог зайти причем и впн не работал прям дурдом, ТГ все умер — остался только ВК и МАкс постараюсь завтра всем отправить апдейт компонента по ошибкам.
Во во такая же фигня, скоро будем обновления почтой России на CD-болванках рассылать 😁
CD?) Флоппи дисковод уже поставил)
Шутки шутками, но в то же время сайт инстанта тоже плохо грузился из-за рубежа. Почти целый день были проблемы
В самом телеграмм сделали vpn бот. Работает. Уже неделю пользуюсь. Правда для начала пришлось через простой vpn зайти, что бы бот запустить. Группа так и называется, Бесплатный Proxy для telegram. Там есть и платная и бесплатная версии.
отправил всем обновление что было сделано кроме правок ошибок
## [1.0.3] — 2026-03-28
### Добавлено
#### Улучшения производительности
— Кеширование VAPID конфигурации (TTL 1 час) для уменьшения запросов к БД
— Метод flushVapidCache() для сброса кеша
— Автоматический сброс кеша VAPID после сохранения настроек и генерации ключей
— sendToAllAuto() — автоматическое переключение синхронной/асинхронной отправки
— createImmediateSchedule() для отправки через cron
— Константа ASYNC_THRESHOLD = 500 — если подписчиков больше, используется очередь
#### Безопасность
— Проверка CSRF токена на эндпоинтах подписки/отписки
— Замена md5() на hash('sha256') для хэширования endpoint
— Защита от XSS в хуке engine_start (htmlspecialchars)
— Защита от JS-инъекций для публичного ключа (json_encode)
#### Аналитика и статистика
— Отслеживание кликов по уведомлениям (поля clicked, clicked_at в push_logs)
— Методы trackNotificationClick(), getClickedCount(), getClickThroughRate()
— Статистика по устройствам и браузерам (поля device_type, browser в push_subscribes)
— Метод parseUserAgent() для определения устройства
— Дашборд с Chart.js с 4 наборами данных (подписки, уведомления, успех, ошибки)
— Метод getChartData() для интеграции с Chart.js
#### Шаблоны
— Система переменных шаблонов с 13 поддерживаемыми плейсхолдерами:
— {user_name}, {user_email}, {user_id}
— {site_name}, {site_url}
— {content_title}, {content_url}, {content_type}
— {comment_text}, {message_text}
— {sender_name}, {date}, {time}
— Метод renderTemplate() для подстановки переменных
— Таблица доступных переменных в редакторе шаблонов
#### Интерфейс
— Живой предпросмотр уведомления в форме отправки
— Отслеживание сообщений Service Worker
— Эндпоинт /push/track для отслеживания кликов
— Таблицы статистики устройств/браузеров в статистике
#### Ограничение частоты
— Многоуровневое ограничение частоты:
— По IP-адресу
— По авторизованному пользователю
— По endpoint
— Метод checkRateLimits() с настраиваемыми периодами
— Обновлена форма лимитов с отдельными секциями
### Изменено
— Service Worker обновлён с функцией отслеживания кликов
— Страница статистики теперь включает разбивку по устройствам/браузерам
— Форма отправки содержит живой предпросмотр уведомления
— Редактор шаблонов показывает доступные переменные
Спасибо!
Нашел уже недочет. Если во вкладке «Подписки» удалить подписавшегося, то выдает ошибка 500, а после обновления страницы выдает 404 в админке.
Если не авторизован и подписываешься в Яндекс Браузере, то сначала кнопка превращается в серую и потом вновь зеленая и в админке нет подписчика.
В гугл хроме аналогично если авторизован тоже.
с авторизованными есть проблема заработался и и сам себя обманул с доп проверками, прошу прощение что замику завтра постараюсь все исправить с учетом высказанного.
В яндекс браузере почему-то после подписки повторно появляется окно после перезагрузки страницы. При этом статистика защитывает каждый такой клик по кнопке.
Аналогичная ситуация
пока не смог отловить причину так как на маке не повторяется такое, ищу варианты как отследить проблему.