
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 в админке.
Если не авторизован и подписываешься в Яндекс Браузере, то сначала кнопка превращается в серую и потом вновь зеленая и в админке нет подписчика.
В гугл хроме аналогично если авторизован тоже.
с авторизованными есть проблема заработался и и сам себя обманул с доп проверками, прошу прощение что замику завтра постараюсь все исправить с учетом высказанного.
В яндекс браузере почему-то после подписки повторно появляется окно после перезагрузки страницы. При этом статистика защитывает каждый такой клик по кнопке.
Аналогичная ситуация