Android - PWA не открывается в автономном режиме с работником службы - PullRequest
0 голосов
/ 13 декабря 2018

При разработке Progressive-Web-App возникла следующая проблема:

Автономный режим прекрасно работает без участия обслуживающего работника, но НЕ работает с

  • Без Service-Worker a2hs (добавлено на главный экран) PWA правильно запускается в "standalone" -Mode.
  • После добавления Service-Worker (a2hs + Установлено / Web-APK) PWA открывает новую вкладку вновый Chrome-Window.

Chrome-PWA-Audit:

Chrome PWA Lighthouse Test

login_mobile_tablet.jsf / includeработник службы:

<script>
    if ('serviceWorker' in navigator) {
        navigator.serviceWorker.register('../serviceWorker.js', {scope: "/application/"})
          /* also tried ".", "/", "./" as scope value */
            .then(function(registration) {
                console.log('Service worker registration successful, scope is: ', registration.scope);
            })
            .catch(function(error) {
                console.log('Service worker registration failed, error: ', error);
            });
    }
</script>

serviceWorker.js:

var cacheName = 'pwa-cache';

// A list of local resources we always want to be cached.
var filesToCache = [
    'QS1.xhtml',
    'pdf.xhtml',
    'QS1.jsf',
    'pdf.jsf',
    'login_pages/login_mobile_tablet.jsf',
    'login_pages/login_mobile_tablet.xhtml'
];

// The install handler takes care of precaching the resources we always need.
self.addEventListener('install', function(event) {

    event.waitUntil(
        caches.open(cacheName).then(function(cache) {
            return cache.addAll(filesToCache);
        })
    );
})

// The activate handler takes care of cleaning up old caches.
self.addEventListener('activate', event => {
    event.waitUntil(self.clients.claim());
});

// The fetch handler serves responses for same-origin resources from a cache.
self.addEventListener('fetch', event => {

    // Workaround for error:
    // TypeError: Failed to execute 'fetch' on 'ServiceWorkerGlobalScope': 'only-if-cached' can be set only with 'same-origin' mode
    // see: https://stackoverflow.com/questions/48463483/what-causes-a-failed-to-execute-fetch-on-serviceworkerglobalscope-only-if
    if (event.request.cache === 'only-if-cached' && event.request.mode !== 'same-origin')
        return;

    event.respondWith(
        caches.match(event.request, {ignoreSearch: true})
            .then(response => {
                return response || fetch(event.request);
            })
    );
});

manifest.json:

{
   "name":"[Hidden]",
   "short_name":"[Hidden]",
   "start_url":"/application/login_pages/login_mobile_tablet.jsf",
   "scope":".",
   "display":"standalone",
   "background_color":"#4688B8",
   "theme_color":"#4688B8",
   "orientation":"landscape",
   "icons":[
      {
         "src":"javax.faces.resource/images/icons/qsc_128.png.jsf",
         "sizes":"128x128",
         "type":"image/png"
      },
      {
         "src":"javax.faces.resource/images/icons/qsc_144.png.jsf",
         "sizes":"144x144",
         "type":"image/png"
      },
      {
         "src":"javax.faces.resource/images/icons/qsc_152.png.jsf",
         "sizes":"152x152",
         "type":"image/png"
      },
      {
         "src":"javax.faces.resource/images/icons/qsc_192.png.jsf",
         "sizes":"192x192",
         "type":"image/png"
      },
      {
         "src":"javax.faces.resource/images/icons/qsc_256.png.jsf",
         "sizes":"256x256",
         "type":"image/png"
      },
      {
         "src":"javax.faces.resource/images/icons/qsc_512.png.jsf",
         "sizes":"512x512",
         "type":"image/png"
      }
   ]
}

Были рассмотрены следующие вопросы / ответы, но решение не найдено:

1 Ответ

0 голосов
/ 18 января 2019

Техническая справка
Момент, когда вы добавляете своего Service-Worker (наряду со всеми другими требованиями PWA), ваше приложение создается как настоящий PWA - с установкой Web-APK.Поэтому вам также необходимо использовать Default-HTTPS-Port 443. Убедитесь, что вы используете действительный HTTPS-сертификат.
Перед добавлением Service-Worker этого обязательного требования не было, поэтому ваш PWA НЕ был установлен и, следовательно, требовалось меньше других требований.отображаться в "standalone-mode".
Обидно, что это нигде не задокументировано ... и нам пришлось «выяснить» это самим.

Краткий список обязательных требований для«Installable Web-APK»:
(поскольку мы не смогли найти полный список, я пытаюсь включить все точки)

  • Зарегистрированный сервисный работник (реализация по умолчанию, как у вас,достаточно)
  • manifest.json (ваш действительный)
  • https с действующим сертификатом
  • https default-port (443, например, https://yourdomain.com/test/)
  • ... в остальном просто проверьте Chrome Audit Tool (СОВЕТ: вам не нужно выполнять все требования - ваш web-apk должен работать при переключении на https-default-port)
...