Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
abills:docs:manual:sender:push [2016/04/19 15:49]
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/​Push.pm";​ +  ​use Abills::​Sender::​Core
-  Push->​import()+  my $Sender ​Abills::​Sender::​Core->​new($db,​ $admin, \%conf, { 
-  my $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.