iPush - push-уведомления (обновление)

+8
516
iPush - push-уведомления (обновление)

Push-уведомления для InstantCMS 2 (обновление)

Компонент Web Push-уведомлений с полной поддержкой кроссплатформенности.


Возможности

  • Подписка/отписка пользователей и гостей
  • Массовая и одиночная рассылка уведомлений
  • VAPID-аутентификация
  • Расписание рассылок (CRON)
  • Очередь отправки для больших объёмов
  • Шаблоны уведомлений
  • Статистика и логирование
  • Привязка подписок гостей к авторизованным пользователям
  • Автоматическая очистка старых логов
  • Rate limiting для защиты от спама

Кроссплатформенность

Поддерживаемые браузеры

БраузерWindowsLinuxmacOSAndroidiOS
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 — журнал событий

Привязка подписок гостей

Механизм

  1. Гость подписывается → генерируется UUID v4 → сохраняется в guest_id + cookie push_guest_id
  2. Гость авторизуется → хук auth_login → привязывает подписки к user_id → удаляет cookie
  3. Гость регистрируется → хук user_registered → привязывает подписки к новому user_id → удаляет cookie

Структура cookie

ПараметрЗначение
Имяpush_guest_id
Срок жизни1 год
HttpOnlyДа
SameSiteLax

Безопасность

  • Cookie HttpOnly недоступна из JavaScript
  • guest_id невозможно подделать (UUID v4)
  • Привязка возможна только к авторизованному пользователю
  • Подписки привязываются только один раз (cookie удаляется)
  • Условие user_id = NULL предотвращает перепривязку

API для разработчиков

Фронтенд

  1. // Проверка поддержки
  2. icmsPush.isSupported(); // true/false
  3. // Информация о браузере
  4. icmsPush.getBrowserInfo();
  5. // { isOpera, isYandex, isChrome, isFirefox, isSafari, isIOS, isEdge, ... }
  6. // Подписаться
  7. await icmsPush.subscribe();
  8. // Получить текущую подписку
  9. const sub = await icmsPush.getSubscription();
  10. // Показать popup вручную
  11. icmsPush.showPrompt();
  12. // Скрыть popup
  13. icmsPush.hidePrompt();
  14.  

Payload уведомления

  1. {
  2. title: 'Заголовок', // до 65 символов
  3. body: 'Текст', // до 200 символов
  4. url: '/page', // ссылка при клике
  5. icon: '/icon.png', // иконка
  6. badge: '/badge.png', // бейдж
  7. tag: 'unique-id', // тег для renotify
  8. requireInteraction: false, // не закрывать автоматически
  9. silent: false, // без звука
  10. actions: [ // кнопки (Chrome/Edge/Firefox)
  11. { action: 'open', title: 'Открыть' },
  12. { action: 'dismiss', title: 'Закрыть' }
  13. ],
  14. vibrate: [100, 50, 100], // вибрация
  15. renotify: true // повторное уведомление
  16. }
  17.  

Улучшения и развитие

Высокий приоритет

  1. Интеграция с APNs (Apple Push Notification service)
    • Поддержка iOS Safari
    • Генерация Safari Push Package
    • Сертификаты APNs
    • Отдельный endpoint для Safari
  2. Проверка настроек «не беспокоить»
    • Учитывать настройки пользователя в профиле
    • Фильтровать получателей по настройкам уведомлений
  3. Повторная попытка при временных ошибках
    • При 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+

+2
maxisoft maxisoft 20 дней назад #

Купить можно автоматически если вдруг не пришел архив, напишите в ЛС или на почту support@maxicms.ru. Есть проблемы с работой почты поэтому заранее прошу прощение.

+1
rshabalin rshabalin 20 дней назад #

Архив получил спасибо!

+1
F_a_R_i_D F_a_R_i_D 20 дней назад #

Как человек и разработчик идеальный! 

Дополнение решило для меня многие проблемы. Спасибо! 

0
Def Def 19 дней назад #

На странице после оплаты почему-то не подгрузидись видимо стилиИзображение

+1
maxisoft maxisoft 19 дней назад #

Да есть проблема в работе сайте домен и NS на клаудфларе и периодически все идет не так. Пытаюсь решить эту проблему. Прошу прощение что не отправились сразу архивы я все проверяю в ручном варианте и все получат их. Прошу прощение за заминки.

+2
maxisoft maxisoft 19 дней назад #

Я немного ошибся в требованиях нужен php 8.2 для работы, всех кто купил и у вас стоит 7.4 отпишитесь в ЛС я сегодня завтра отправлю вам версию с поддержкой 7.4

+1
Def Def 19 дней назад #

Подписался в гугл хром. Статистика засчитала. 
Подписался в Яндекс браузере — в статистике не отобразилось. Учитывается IP адрес или браузеры?

+1
maxisoft maxisoft 17 дней назад #

Есть такая ошибка я прошу прощение выпал из потока жизни у нас тут провайдеры видать делают настройки блокировок инет 3 дня не работал даже на сайт инстант не смог зайти причем и впн не работал прям дурдом, ТГ все умер — остался только ВК и МАкс постараюсь завтра всем отправить апдейт компонента по ошибкам.

0
Pechora.Dev 🐻 Pechora.Dev 🐻 16 дней назад #

Во во такая же фигня, скоро будем обновления почтой России на CD-болванках рассылать 😁

+1
Def Def 16 дней назад #

CD?) Флоппи дисковод уже поставил)

0
Jestik Jestik 15 дней назад #

Шутки шутками, но в то же время сайт инстанта тоже плохо грузился из-за рубежа. Почти целый день были проблемы

0
Lora Lora 16 дней назад #

В самом телеграмм сделали vpn бот. Работает. Уже неделю пользуюсь. Правда для начала пришлось через простой vpn зайти, что бы бот запустить. Группа так и называется, Бесплатный Proxy для telegram. Там есть и платная и бесплатная версии.

+1
maxisoft maxisoft 14 дней назад #

отправил всем обновление что было сделано кроме правок ошибок 

## [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 обновлён с функцией отслеживания кликов
— Страница статистики теперь включает разбивку по устройствам/браузерам
— Форма отправки содержит живой предпросмотр уведомления
— Редактор шаблонов показывает доступные переменные

+1
Def Def 13 дней назад #

Спасибо!
Нашел уже недочет. Если во вкладке «Подписки» удалить подписавшегося, то выдает ошибка 500, а после обновления страницы выдает 404 в админке.

Изображение

Если не авторизован и подписываешься в Яндекс Браузере, то сначала кнопка превращается в серую и потом вновь зеленая и в админке нет подписчика.

В гугл хроме аналогично если авторизован тоже.

Изображение

+1
maxisoft maxisoft 13 дней назад #

с авторизованными есть проблема заработался и и сам себя обманул с доп проверками, прошу прощение что замику завтра постараюсь все исправить с учетом высказанного.

0
Def Def 6 дней назад #

В яндекс браузере почему-то после подписки повторно появляется окно после перезагрузки страницы. При этом статистика защитывает каждый такой клик по кнопке.

0
4erep 4erep 5 дней назад #

Аналогичная ситуация

Еще от автора

instantCMS MCP Server - обновление
Обновление функционала
Cookies UTM — модуль сохранения UTM-меток в cookies
Cookies UTM — это лёгкий модуль для сайта, который автоматически сохраняет UTM-метки из URL в cookies браузера пользователя.
iPush - push-уведомления, держите аудиторию рядом
Представьте: пользователь закрыл вкладку с вашим сайтом, ушёл по делам — и именно в этот момент у вас вышел новый материал или кто-то написал ему личн
🍪Мы используем файлы cookie для работы сайта. Читать подробнее.