Safari / IOS Сервисный работник Safari пропустить ожидание не работает - PullRequest
1 голос
/ 07 февраля 2020

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

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

Кажется, это нормально работает в chrome, но в Safari и IOS Safari это не так. Я не уверен, что я перебираю что-то здесь, или, может быть, есть альтернатива, чтобы заставить это работать во всех браузерах.

ServiceWorker. js

var staticCacheName = "django-pwa-v" + new Date().getTime();

self.addEventListener('install', function(event) {

  event.waitUntil(
    caches.open(staticCacheName).then(function(cache) {
      return cache.addAll([
        '/'
      ]);
    }).then(function() {
      return self.skipWaiting();
    })
  );
});

// Clear cache on activate
self.addEventListener('activate', event => {
    event.waitUntil(
        caches.keys().then(cacheNames => {
            return Promise.all(
                cacheNames
                    .filter(cacheName => (cacheName.startsWith("django-pwa-")))
                    .filter(cacheName => (cacheName !== staticCacheName))
                    .map(cacheName => caches.delete(cacheName))
            );
        })
    );
    return self.clients.claim();
});

addEventListener('message', messageEvent => {
  if (messageEvent.data === 'skipWaiting') return skipWaiting();
});

addEventListener('fetch', event => {
  event.respondWith((async () => {
    if (event.request.mode === "navigate" &&
      event.request.method === "GET" &&
      registration.waiting &&
      (await clients.matchAll()).length < 2
    ) {
      registration.waiting.postMessage('skipWaiting');
      return new Response("", {headers: {"Refresh": "0"}});
    }
    return await caches.match(event.request) ||
      fetch(event.request);
  })());
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...