Pull to refresh

Уведомления в браузере и пример того, как их можно использовать с пользой

Reading time 6 min
Views 72K


Вероятно, вы все уже слышали про технологию «Веб-push» в составе Push API и Notifications API. Я уверен, что среди вас есть те, кто возлагает надежды на эту технологию, как на новый канал коммуникации с пользователем. И я не исключаю возможность, что данную статью будут читать основатели тех немногочисленных стартапов, которые всерьёз занялись окучиванием технологии «Веб-push» для рекламы и маркетинга. Сегодня я вам расскажу, о том как можно использовать данную технологию.

Современные веб стандарты подарили нам возможность посылать пользователю уведомления. Это такие всплывающие сообщения в правом нижнем углу экрана, хотя местоположение зависит от используемого браузера, а повлиять на расположение сообщения разработчик напрямую не может. И вот эти сообщения всплывают значит и показывают какую-то информацию. Информацию заведомо нужную пользователю, так как нельзя распространить эти уведомления на аудиторию, которая на них не подписана. И всё вроде бы логично, но пользователи упорно жмут кнопку «Отказаться», когда им предлагают подписаться на получение таких уведомлений. Попробуем разобраться почему так происходит.

Технология «веб-push» буксует на одном месте и это очевидно. Помимо раздражающего фактора наличия самого уведомления, которое стремительным, ослепительно белым аэропланом врывается на поверхность рабочего стола, есть ещё одна причина. Это использование технологии не по назначению. Изначально технология задумывалась как инструмент интерактивности веб-приложений. Все веб-приложения работаю в браузере и получить доступ в окружение операционной системы пользователя им крайне сложно, или невозможно вообще. Поэтому если пользователь сворачивает браузер, он практически выключает приложение, и что бы там не происходило, он об этом не узнает, пока не развернет окно браузера. Технология уведомлений позволяет обратить внимание пользователя на приложение даже когда браузер свернут. Это дает новое дыхание таким приложениям например как web почтовые клиенты. Но некоторым людям захотелось использовать этот канал связи для интернет-маркетинга и рекламы. Предполагается, что пользователи добровольно будут подписываться на такого рода рассылки.

Но так или иначе технология существует и её надо осваивать. Настал тот момент, когда я решил встроить уведомления на сайт. Как оказалось, технология (Web Push API и Notification API) достаточно простая и естественно появилось желание поэкспериментировать. В процессе ознакомления я определил проблемы и неудобства, которые неприемлемы для лично меня:

Со стороны пользователя
  • неадекватная система подписки/отписки на уведомления
  • нет доступа к истории уведомлений
  • нет пользовательских настроек, например, что-то типа режима «не беспокоить»

Со стороны отправителя уведомлений
  • отсутствие контроля за уведомлениями и базой пользователей
  • отсутствие статистики по активности клики/просмотры

Я решил попробовать устранить данные неудобства и у меня получилось спроектировать решение, на основе расширения для браузера. Архитектура клиент-серверная и расширение выступает в роли клиента. Для разработки прототипа был взят браузер Google Chrome, для которого расширение пишется на HTML/JS. Панель управления выполнена на PHP. Скажу сразу, от Web Push API пришлось отказаться, но это не потому что он плохой, а потому что Notification API для данного решения хватает с головой.

Собственно, для начала было сделано расширение для браузера, которое умеет бегать на сервер и спрашивать есть ли для него сообщения (ссылка на код расширения в конце статьи). Если сообщения есть, то в зависимости от настроек пользователя, появляются уведомления на рабочем столе. Так же пользователь может получить доступ к списку активных уведомлений в любое время нажав на иконку расширения в браузере. Есть опция «Не беспокоить», которая позволяет отключать уведомления, но оставляет возможность пользователю получить доступ к пришедшим уведомлениям через кнопку расширения. Так же вне зависимости от настроек на кнопке расширения присутствует индикация наличия непрочитанных сообщений.

Установка расширения выполнена в inline стиле, благодаря чему подписка на уведомления сводится к двум кликам мышкой. Необходимо разместить кнопку, при нажатии на которую пользователю будет предложено установить расширение. Данную кнопку можно разместить в любом месте сайта. Также кнопку подписки можно прятать если расширение уже установлено. Вот пример посадочной страницы подписки на уведомления, который я сделал для приложения Пример посадочной страницы подписки



Расширение можно удалить стандартным способом, т.е. так же, как и любое другое расширение для браузера, но для удобства, дополнительно добавлена кнопка для удаления. На случай самоликвидации отправителя, существует способ удаленно деинсталлировать расширение со всех устройств пользователей, послав в заголовке сообщения секретную команду, где вы ещё такое найдёте :).
if (obj[i]['title']=='666') {
     chrome.management.uninstallSelf();
}

Что касается серверной части, то тут мы имеем небольшую админку написанную на PHP для внесения уведомлений в БД и шлюз для приема запросов от пользователей и соответственно выдачу уведомлений из БД. Этот же шлюз используется для сбора статистики и пишет всё в ту же БД.



Вот пример того как сервер отдает JSON для уведомлений (установлен лимит в 3 сообщения).
//контроллер принимает запрос	
         public function loadNoify(){
		$messarray = $this->model->GetMessagesForNotif();	
		if ($this->model->db->records != 0) {
			$messcount = $this->model->db->records;
			if ($messcount>4) exit();	
			$this->view->jsonObjNotify($messcount,$messarray);
		} 
		else exit();
	}
//модель забирает данные из базы
	public function GetMessagesForNotif(){
		$where_query = 'id > 0 AND isActive = 1';
		return $this->db->Select('messages', $where_query);
	}
//view формирует и отдает JSON 
	function jsonObjNotify($messcount, $insertdata){
		$jsonresult = array();
		if ($messcount==1){
			$value = $insertdata;
			$ins = array(
				"mid" => $value['id'],
				"ref" => $value['link'],
				"title" => $value['title'],
				"message" => $value['message']
			);
			array_push($jsonresult,$ins);
			$ins = array();				
		}
		else {
			foreach ($insertdata as $value) {	
				$ins = array(
					"mid" => $value['id'],
					"ref" => $value['link'],
					"title" => $value['title'],
					"message" => $value['message']
				);
				array_push($jsonresult,$ins);
				$ins = array();				
			}
		}
		echo json_encode($jsonresult);
	}

А вот так формирую JSON для отображения в расширении. Тут отдаём HTML снипет:
public function loadMess(){
		$messarray = $this->model->GetMessagesForExt();	
		if ($this->model->db->records != 0) {
			$messcount = $this->model->db->records;
			if ($messcount>4) {
				$jsonresult = array();	
				$ins = array(	
				'id' => 0,				
				'data' => '<div class="info">Слишком много сообщений :(</div>'
				);
				array_push($jsonresult,$ins);
				echo json_encode($jsonresult);
				exit();
			} 	
			$template = 'app/template/extention_m.php';
			$this->view->jsonObj($messcount,$template,$messarray);
		} 
		else {
			$jsonresult = array();	
			$ins = array(	
			'id' => 0,
			'data' => '<div class="info">К сожалению сообщений нет, но как только они появятся, вы увидите уведомление.</div>'
			);
		array_push($jsonresult,$ins);
		echo json_encode($jsonresult);
		}
	}

Формируем HTML снипет extention_m.php:
$data.='<div class="info" id="'.$value["id"].'"><span id="'.$value["id"].'" class="close-thik"></span><b>'.$value["title"].'</b><br>'.$value["message"].' <a id="'.$value["id"].'" href="'.$value["link"].'">подробнее...</a></div>';

Осталось рассказать про статистику. Я много делать не стал. В свою базу добавляю по минимуму. С остальным хорошо справляется Google Analytics. Просто при публикации расширения я указал Google Analytics ID и могу получать всю информацию о просмотрах и переходах по ссылкам, которые содержатся в уведомлениях.

Вот таким способом мне удалось оптимизировать технологию веб-push уведомлений и сделать её более удобной (по крайней мере для себя). Учитывая широкие возможности браузерных расширений, в данное приложение можно добавить более богатый функционал.

В завершение, как доказательство возможности применения Notification API в реальных задачах, хочу сказать, что мной написано два действительно важных приложения, одно из которых может оповещать о температуре в серверной, а второе присылает уведомления, если на маршрутизатор ядра логинится кто-то из админов.

Здесь само расширение для браузера Chrome , о котором говрится в статье.

P.S. Важно! Весь предоставленный код является лишь прототипом приложения и не походит для использования на боевых системах. Код не оптимизирован и не проверялся на безопасность. Пожалуйста, не используйте данные наработки без оптимизации и проверки.
Tags:
Hubs:
+6
Comments 60
Comments Comments 60

Articles