К списку статей

Разработан новый механизм обновлений для https-сайтов

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

Итак, по порядку:

В чем проблема с HTTPS?

Наверное все в курсе, что основной программой, управляющей пушами на стороне получателя (в браузере) является сервисворкер (по-умолчанию он называется serviceworker.js). Этот файл является обязательным для запуска пуш-сервиса и должен постоянно лежать на вашем сайте и быть доступным для посетителей. 

Если вы вносите логику в свой пуш-сервис, дорабатываете какие то функции, то весь этот JS-код, все изменения выкладываются в serviceworker.js.

А теперь вопрос: а если вы, как разумный человек, пользуетесь сторонним сервисом для пуш-рассылок типа push.world, то когда push.world разрабатывает новый функционал, то как его обновить в serviceworker.js на вашем сайте? Ведь вам физически надо выложить обновлённый файл к себе на сайт.

Первый вариант решения (не работает)

Конечно же можно с выходом нового функционала скачивать каждый раз serviceworker и выкладывать на сайт, но в 2017 году так не делается и это очень неудобно.

первый вариант не подходит — это очень неудобно.

Второй вариант решения (не работает)

Ещё можно сделать так:

importScripts("https://admitadcom.push.world/https.serviceworker.js?v="+ +new Date)},{}]},{},[1]);

В самом сервисворкере написать, чтоб он ходил и обновлял код с самого сервиса push.world.

Но оказалось, что второй вариант тоже не подходит. Дело в том, что браузер подписчика не видит изменений в файле ни на бит и не запрашивает никаких обновлений. И вся эта конструкция с importScripts () просто не задействуется и сервисворкер не обновляется. Полный провал.

Вопрос остаётся открытым: Что сделать, чтобы при добавлении новых функций в push.world — у клиентов с HTTPS, кто хостит сервисворкер у себя обновлялся функционал при этом без ручного вмешательства?

Решение найдено

И мы его уже реализовали. 

Суть решения простая и изящная: push.world теперь предоставляет не 1, а 2 файла сервисворкера для размещения на https-сайтах. Во встроенном embed-коде веб-страницы же ссылка даётся только на один из них.

Например 

serviceworker: “/serviceworker.js?v=” + +new Date

Теперь, когда push.world выпускает новый функционал, то во встроенном коде страницы адрес размещения сервисворкера меняется с одного на второй. 

Например

serviceworker: “/serviceworker-update.js?v=” + +new Date

Соответственно браузер получателя пушей видит, что адрес воркера изменился, переключается на него и скачивает новый сервисворкер вместе с запуском функции 

importScripts("https://admitadcom.push.world/https.serviceworker.js?v="+ +new Date)},{}]},{},[1]);

И таким образом получает новый код сервисворкера.

Решение уже в релизе. Скачайте оба файла serviceworker чтобы обновления на ваш https-сайт приходили своевременно.