Модуль доступен в редакциях БУС Эксперт и выше, а так же во всех редакциях Корпоративного портала.
Что за модуль и зачем он нужен
Первым кто начал его использовать был модуль "Веб-мессенджер", благодаря модулю P&P появилась возможность реализовать действительно мгновенные сообщения, без необходимости ждать 60 секунд между опросами сервера.
В последней версии КП 14 (и Битрикс24) использование модуля стало
Его использует "Мобильное приложение", модули "Голосования и опросы", "Главный модуль" (для живых счетчиков), "Блоги" (для живых комментариев) и другие.
Оперативность получения актуальной информации и скорость реакции на неё, сильно изменило работу с порталом и это заслуга модуля "Push & Pull".
Модуль "Push & Pull" работает в двух режимах:
- постоянное подключение к специальному серверу "
- в режиме опроса сервера (60-20-10);
Первый режим рекомендуемый, от него вы получите настоящую интерактивность, но от вас потребуется настроить сервер очередей или взять готовую сконфигурированную виртуальную машину.
Второй режим используется, когда по каким то причинам невозможно использовать первый, в таком случае модуль будет каждые 60 секунд стучатся на сервер и проверять есть ли данные, если есть то следующий хит будет через 10 секунд, если данных больше нет хит будет через 20 секунд, потом каждые 60 секунд, тем самым будет создан эффект интерактивности.
Самое главное, не смотря на то, какой способ выберет клиент на своем сайте (сервер очередей или опрос сервера) работа с модулем останется одинаковой (кроме работы с общим каналом).
Само API делится на PHP и JS часть, ниже опишу ключевые методы для работы с ним.
[spoiler]
PHP методы
Для начала работы вам необходимо подключить модуль
if (!CModule::IncludeModule('pull')) return false; |
RegisterModuleDependences("pull", "OnGetDependentModule", "your_module", "CYourModulePullSchema", "OnGetDependentModule" ); |
class CYourModulePullSchema { public static function OnGetDependentModule() { return Array( 'MODULE_ID' => "your_module", 'USE' => Array("PUBLIC_SECTION") ); } } |
'USE' => Array("PUBLIC_SECTION") |
'USE' => Array("PUBLIC_SECTION", "ADMIN_SECTION") |
Pull: отправка данных определенному пользователю
Проверка, включен ли сервер очередей, нужен если логика вашего приложения требует только мгновенных оповещений (например вызов абонента в Online ATC)
CPullOptions::GetNginxStatus() |
CPullStack::AddByUser($recipientId, Array( 'module_id' => 'test', 'command' => 'check', 'params' => Array(), )); |
module_id - модуль который отправляет команду
command - команда которая будет обработана в JS
params - любой набор данных, который будет обработан в JS
Pull Shared: отправка данных всем пользователям (в общий канал "Сервера очередей" )
CPullStack::AddShared(Array( 'module_id' => 'test', 'command' => 'check', 'params' => Array(), )); |
command - команда которая будет обработана в JS
params - любой набор данных, который будет обработан в JS
Внимание: вызов этого метода в конфигурации без сервера очередей, не приведет к отправке сообщений, т.к. общий канал есть только у сервера очередей.
ОСОБОЕ ВНИМАНИЕ: данный метод отправляет данные всем пользователям, передавать там секретный данные нельзя их увидят все.
Pull Watch: отправка данных подписанным пользователям
ВНИМАНИЕ: в целях безопасности, пользователи не имеют возможности подписываться на канал через JS, что бы например не получить возможности читать чужую закрытую статью и тд, по этому в теге подписки нельзя использовать параметры из $_GET, $_POST, $_REQUEST, что бы злоумышленник не смог подписаться на контент который ему запрещен.
Подписка на команды
CPullWatch::Add($userId, $tag); |
$tag - идентификатор подписки
Внимание: Подписка действует 30 минут, по истечению этого времени пользователь отписывается от получения команд, продлить можно повторным вызовом команды или с помощью JS API которые описаны ниже.
Удаление подписки
CPullWatch::Delete($userId, $tag); |
$tag - идентификатор подписки (если не указать, пользователь будет отписан от всех подписок)
Отправка данных подписанным пользователям
CPullWatch::AddToStack($tag, Array( 'module_id' => 'test', 'command' => 'check', 'params' => Array(), )); |
module_id - модуль который отправляет команду
command - команда которая будет обработана в JS
params - любой набор данных, который будет обработан в JS
Push: отправка Push уведомлений на телефон
Проверка, включена ли данная опция в настройках, если включена вы можете отправлять Push уведомления
CPullOptions::GetPushStatus() |
$CPushManager = new CPushManager(); $CPushManager->AddQueue(Array( 'USER_ID' => 1, 'MESSAGE' => 'Тестовое сообщение' 'TAG' => 'IM_MESS_1', 'SUB_TAG' => 'IM_MESS', )); |
MESSAGE - текст сообщения (максимум 255 символов)
TAG и SUB_TAG не обязательный параметры, нужны если вам необходимо будет их удалить перед отправкой.
Так же вы можете передать ключ SEND_IMMEDIATELY = Y для отправки сообщения без задержки, если это требует ваша логика.
Внимание: пользователь должен быть подписан на пуш уведомления, это происходит автоматически после входа на портал через мобильное приложение.
Удаление пуш уведомления по основному тегу
CPushManager:: DeleteFromQueueByTag($userId, $tag); |
CPushManager:: DeleteFromQueueBySubTag($userId, $subTag); |
JS методы
Что бы получать команды от сервера, вам необходимо сделать "ловушку" на JS (доступно с pull 14.1.0)
Ловушка для страниц десктопной версии (все события кроме событий online):
BX.addCustomEvent("onPullEvent-moduleName", BX.delegate(function(command,params){ console.log('Events of moduleName', command, params); }, this)); |
BX.addCustomEvent("onPull-moduleName", BX.delegate(function(data){ console.log('Events of moduleName', data.command, data.params); }, this)); |
BX.addCustomEvent("onPullEvent-main", function(module_id,command,params) { if (command == 'check') { console.log('Command from module MAIN - its work!'); } }); |
Если ваша логика требует сбора всех событий, то формат немного отличается: (доступно на любой версии pull)
Ловушка для страниц десктопной версии (все события кроме событий online):
BX.addCustomEvent("onPullEvent", BX.delegate(function(module_id,command,params){ console.log(module_id, command, params); }, this)); |
BX.addCustomEvent("onPull", BX.delegate(function(data){ console.log(data.module_id, data.command, data.params); }, this)); |
BX.addCustomEvent("onPullEvent", function(module_id,command,params) { if (module_id == "test" && command == 'check') { console.log('Work!'); } }); |
Для получения данных об онлайне ( список онлайн пользователей на текущий момент, авторизация пользователя, выход пользователя )
Необходимо подписываться на событие onPullOnlineEvent (доступно с pull 14.1.0)
BX.addCustomEvent("onPullOnlineEvent", function(command,params) { if (command == 'user_authorize') { } else if (command == 'user_logout') { } else if (command == 'online_list') { } }); |
Продление подписки на тег (Pull Watch)
BX.PULL.extendWatch('tag'); |
После вызова метода, он автоматически будет продлевать данную подписку, пока пользователь находится на странице.
Вы сможете
PUSH уведомления в мобильном приложении - отлично, а если я хочу с сайта отправлять PUSH уведомления клиентам пришедшим на сайт с мобильного устройства, это возможно?
Обычный браузер не умеет подписывать на пуши.
У меня вопрос по отправке Push уведомлений на телефон
Как сделать такую же автоматическую подписку телефона на редакции "Малый бизнес" для отправки push уведомлений?
Для сохранения таких данных в малом бизнесе кажется надо использовать компонент bitrix:mobileapp.auth, имеется getToken в \bitrix\js\mobileapp\bitrix_mobile.js, но как это работает пока не разобрался
В данный момент идет разработка такого функционала, по мере готовности об этом напишет
Есть какая-либо документация по отправке пуш-уведомлений?
Очень не хочется GCM подключать
Уже появилось API отправки пуш-уведомлений для пользовательских приложений?
Не подскажите где с ним можно ознакомитсья?
По логике работы приложения клиенты могут работать с приложением без авторизации, как отправить push сообщение не авторизованному пользователю мобильного приложения?
Если будет пример кода то просто идеально, к сожалению документация пока куцая.
- постоянное подключение к специальному серверу "
- в режиме опроса сервера (60-20-10);
Первый режим рекомендуемый, от него вы получите настоящую интерактивность...
Для чего нужно постоянное соединение с сервером на документации ?
Может ли модуль"Push & Pull" работать в разных разделах сайта в разных режимах ?
На время переходного периода (как любит говорить Антон Долганин про пользователей которые не спешат обновляться) вы можете поступить следующим образом:
CPullWatch::Delete($userId, $tag);
Выдает ошибку (нет такого метода)
Fatal error: Call to undefined method CPullWatch::Delete()
Использую последнюю версию битрикса. Специально скачал свежию демоверсию.
А метод нужен, т.к. при закрытии браузера подписка не удаляется.
Открываю браузер, подписываюсь на тег, тут же жду событие. Работает.
Закрываю браузер. Открываю ту же страницу в другом - событие не приходит.
Перед использованием АПИ нужно подключить модуль - CModule::IncludeModule('pull'); - если это не помогло, свяжитесь с технической поддержкой.
У меня есть специальная страница мониторинга, на которой что-то обновляется, когда наступает событие.
После захода на страницу приходится ждать 60 секунд, когда что-то произойдет. Это чудовищно неудобно.
Как заставить модуль сразу обновляться раз в 10 секунд или еще чаще?
--------
Я бы просто хотел выставить время опроса сервера раз в 3 секунды на этой специальной странице и не усложнять с 60-20-10.
можете поставить таймаут каждые 30 секунд вызывать этот метод
Где
Работает как-то однобоко, т.е. если пользователь не авторизован, то console.log('its work!'); не отработает. Для авторизованных пользователей все норм.
В чем может быть проблема? А точнее, как подписать неавторизованного пользователя на канал?
BX.addCustomEvent("onPullEvent", BX.delegate(function(module_id,command,params){ console.log(module_id, command, params);}, this));
ПУСТО!!!
Насколько я понимаю, теперь в браузерах есть возможность подписываться на уведомления.