Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
abills:docs:manual:sender:push [2016/03/23 16:28] anton [Для разработчиков] |
abills:docs:manual:sender:push [2017/07/04 16:34] (текущий) anton [Web Push API] |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ==== Google Cloud Messaging ==== | + | ==== Web Push API ==== |
- | Даный модуль позволяет отправлять Push уведомления клиентам, которые зарегистрированы через Google Cloud Platform.\\ | + | Данный модуль позволяет отправлять Push уведомления клиентам и администраторам через Web Push платформу.\\ |
+ | \\ | ||
+ | Клиент реализован на ServiceWorker, поэтому будет работать только на домене с валидным SSL (HTTPS) серитификатом. | ||
+ | \\ | ||
+ | Для отправки в Chrome нужен ключ Google API Platform Key.( Брать в [[https://console.cloud.google.com/| Google Cloud Console ]] ).\\ | ||
+ | Ключ нужно записать в ''libexec/config.pl'' **$conf{GOOGLE_API_KEY}**.\\ | ||
+ | \\ | ||
+ | Пуши в Firefox работают без ключа.\\ | ||
- | Сейчас есть возможность отправлять уведомления в [[https://chrome.google.com/webstore/detail/abills-stats/bndohjbbflmcmjkjfdogiliickdnnhfp|ABillS Stats]].\\ | + | После записи ключа создать файл манифеста ''cgi-bin/manifest.json''. |
+ | <code> | ||
+ | # cd /usr/abills/cgi-bin/ | ||
+ | # cp ../misc/gcm/manifest.json.default manifest.json | ||
+ | </code> | ||
- | Для работы нужен ключ Google API Platform Key.( Брать в [[https://console.cloud.google.com/| Google Cloud Console ]] ).\\ | + | Заменить ''%GCM_APPLICATION_NUMBER%'' на номер своего проекта в ''Google Cloud Console''. |
+ | <code> | ||
+ | # vim manifest.json | ||
+ | </code> | ||
- | Ключ нужно записать в ''libexec/config.pl'' **$conf{GOOGLE_API_KEY}**.\\ | + | Создать таблицы, в которых хранятся клиенты и сообщения |
+ | <code> | ||
+ | # mysql -D abills < db/Push.sql | ||
+ | </code> | ||
+ | |||
+ | После этого можно включить скрипты Push переменной конфигурации $conf{PUSH_ENABLED}. | ||
+ | Администраторы подписываются на Push уведомления на странице "Профиль".\\ | ||
+ | {{ :abills:docs:manual:sender:admin_push_subscribe.png?nolink |}} | ||
+ | \\ | ||
+ | Пользователям предложит подписаться сразу при входе в кабинет.\\ | ||
+ | {{ :abills:docs:manual:sender:client_push_subscribe.png?nolink |}} | ||
+ | \\ | ||
==== Для разработчиков ==== | ==== Для разработчиков ==== | ||
Пример использования: | Пример использования: | ||
<code> | <code> | ||
# Подключаем модуль | # Подключаем модуль | ||
- | require "Abills/modules/Msgs/GCM_Push.pm"; | + | use Abills::Sender::Core; |
- | GCM_Push->import(); | + | my $Sender = Abills::Sender::Core->new($db, $admin, \%conf, { |
- | my $Gcm = GCM_Push->new($db, $admin, \%conf); | + | SENDER_TYPE => 'Push' |
+ | }); | ||
# Отправляем сообщение | # Отправляем сообщение | ||
- | $Gcm->send_message({ | + | my $request_sent = $Sender->send_message({ |
- | UID => 2, | + | UID => 2, |
+ | TITLE => 'ABillS Push', | ||
MESSAGE => 'Hello, world sended via Push message' | MESSAGE => 'Hello, world sended via Push message' | ||
}); | }); | ||
+ | | ||
+ | # $request_sent == 1, если запрос к сервису Push завершился успешно. (но это не гарантирует доставку) | ||
</code> | </code> | ||
- | **Важно!!! В строке MESSAGE не должно быть двойных кавычек ** | + | ==== Детали реализации ==== |
+ | Сама схема работы WebPush хорошо расписана в [[https://developers.google.com/web/fundamentals/engage-and-retain/push-notifications/|документации для разработчиков Google]]. | ||
+ | |||
+ | В даном случае есть ServiceWorker в браузере, который отвечает за подписку и уведомление сервера о своей подписке.\\ | ||
+ | |||
+ | Сервер, получив даные о подписке записывает контакты в таблицу ''push_contacts'' (модуль ''Contacts'') и отдаёт клиенту ''contact_id'', который сохраняется внутри ''indexedDB'' в браузере \\ | ||
+ | |||
+ | Когда нужно отправить уведомление, модуль ''Push'' получает контакт из таблицы и отправляет запрос на ''Push-уведомление'' сервису Push. Если запрос завершился удачно, сообщение сохраняется в таблицу ''push_messages'' с некоторым TTL (24 часа). | ||
+ | |||
+ | Когда клиент получает ''Push-уведомление'' от Push-сервиса, он используя сохранённый ''contact_id'', получает с сервера ABillS сообщение для этого ''contact_id''. После отправки сообщения клиенту, оно удаляется из таблицы. | ||
+ | |||
+ | Дневной периодик функцией ''msgs_clear_push_messages'', удаляет сообщения которые так и не были доставлены.\\ | ||
+ | Для модуля ''Notepad'' есть [[abills:docs:manual:periodic:periodic#plagin_notepad|billd плагин]], для рассылки напоминаний через Push. |