2017-01-28 8 views
0

У меня есть веб-приложение, которое работает и полагается на рабочих сервисов, чтобы держать все кэшированные файлы в проверке и убедиться, что пользователи находятся в правильной версии приложения.Задержка обновления служебного работника

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

Могу ли я заставить устройство проверять сервисного работника на какие-либо новые изменения, а не ждать, пока приложение проверяет меня?

Спасибо!

ответ

1

Существует два основных момента, которые необходимо уточнить для мгновенного обновления вашего ПО.

Вскоре

  1. Позвоните своему sw.jsтакже из более часто посещаемых страниц, чем индекс страницы вашего приложения.
  2. Используйте метод skipWaiting(), чтобы активировать ваш SW мгновенно.

Подробнее

1) navigator.serviceWorker.register вызова метода

Следует отметить, что новый verison от SW будет проверяться только на navigator.serviceWorker.register() вызова.

И обычно метод register() будет вызываться только на одной из ваших страниц. Если это так, вы должны добавить эту команду ко всем вашим страницам. Потому что, если пользователь просто открывает другое приложение, не закрывая PWA, а затем возвращается в ваше приложение, скажем, через 2 часа, он избежит страницы индекса приложения, где вероятно ваш register().

Итак, мое предложение - разместить его на многих страницах, если не каждый. Даунсайд клиентов будет делать гораздо больше звонков на sw.js. Потенциал роста клиентов будет получать последнюю версию SW без потери времени.

2) Активация службы информацию работнику

activate событий службы работника не будет вызываться, когда SW больше не имеет никакого активного clients. Таким образом, новая версия будет активирована только после каждого экземпляра приложения, но одна из них закрыта, а оставшаяся вкладка обновляется/одна вкладка снова открывается. См. quote from MDN по вопросу:

.. новая версия установлена ​​в фоновом режиме, но еще не активирована. Он активируется только тогда, когда больше не загружаются страницы, которые все еще используют старого рабочего. Как только больше нет , такие страницы все еще загружаются, активируется новый рабочий.

И решение этой можно было бы использовать метод skipWaiting() в сочетании с Clients.claim()

Пример использования тех взяты из MDN. Click to see more about it on that page:

self.addEventListener('install', function(event) { 
    event.waitUntil(self.skipWaiting()); 
}); 
self.addEventListener('activate', function(event) { 
    event.waitUntil(self.clients.claim()); 
}); 
+0

Спасибо за сказанное выше, дело в том, что приложение представляет собой единую веб-страницу. Таким образом, у меня есть код, запускающий каждую загрузку, проблема в том, что рабочий сервис не проверяет немедленно при повторном открытии - не уверен, может ли это быть из-за того, что оболочка приложения кэшируется вместе с рабочим? –

+0

Хорошо, тогда раздел * # 1 * не имеет отношения к вашей ситуации. Но вы внедрили решение на * # 2 *? Если так, то может произойти что-то еще. Когда вы обновляете кеш, он снова переустанавливает содержимое кеша. Итак, если у вас много кэшированных файлов, и если у клиента медленное соединение, потребуется некоторое время, чтобы загрузить все активы. И только после того, как все предметы будут загружены и вставлены в кеш, SW будет активирован. Если вы не указали выше, я могу взглянуть на вашу PWA, если она общедоступна. –