【问题标题】:Progressive Web App: offline cache does not work on Android, it works on Chrome dev ToolsProgressive Web App:离线缓存在 Android 上不工作,在 Chrome 开发工具上工作
【发布时间】:2018-01-25 18:27:25
【问题描述】:

我有一个简单的 PWA,可以在网上正常工作。我还测试了 Chrome 开发工具中的离线行为,并且 service worker 完美地完成了它的工作。但是当我从我的 Android 手机运行该应用程序时,它无法离线运行,因为离线时缓存存储不再存在。

这是服务人员:

var dataCacheName = 'myappData-v3n';
var cacheName = 'myapp-3n';
var filesToCache = [
  '/meteosurf/',
  '/meteosurf/index.html',
  'scripts/hammer.min.js',
  'images/play_white.svg', 
  'images/stop_white.svg',
  'images/back_white.svg',
  'images/forward_white.svg',
  'images/sfondo.jpg',
  'images/ic_refresh_white_24px.svg',
  'scripts/meteo-zoom.js',
  'scripts/meteosurf_200.js',
  'scripts/jquery3-2-1.min.js',
  'scripts/jqueryui1-12-1.min.js',
  'styles/inline_01.css',
  'styles/meteosurf_200.css',
  'styles/jqueryui-smoothness.css',
  'styles/images/ui-bg_glass_65_ffffff_1x400.png',
  'styles/images/ui-icons_454545_256x240.png',
  'images/icons/icon-64x64.png',
];

self.addEventListener('install', function(e) {
  console.log('[ServiceWorker] Install');
  e.waitUntil(
    caches.open(cacheName).then(function(cache) {
      console.log('[ServiceWorker] Caching app shell');
      return cache.addAll(filesToCache);
    })
  );
});

self.addEventListener('activate', function(e) {
  console.log('[ServiceWorker] Activate');
  e.waitUntil(
    caches.keys().then(function(keyList) {
      return Promise.all(keyList.map(function(key) {
        if (key !== cacheName && key !== dataCacheName) {
          console.log('[ServiceWorker] Removing old cache', key);
          return caches.delete(key);
        }
      }));
    })
  );
  return self.clients.claim();
});


self.addEventListener('fetch', function(event) {
  console.log('Fetch event for ', event.request.url);
  event.respondWith(
    caches.match(event.request).then(function(response) {
      if (response) {
        console.log('Found ', event.request.url, ' in cache');
        return response;
      }
      console.log('Network request for ', event.request.url);
      return fetch(event.request)

    }).catch(function(error) {

      // TODO 6 

    })
  );
});

当通过 Chrome 开发工具在其 url 上测试应用时,它也会离线响应。但由于它无法在手机上运行,​​我将设备连接到 Chrome 并进行了调试。这是手机在线时的缓存:

但是如果我在 service worker 窗格中检查 Offline 标志并刷新页面,缓存就会消失(见下面的截图)!

看起来缓存不是持久离线的!!发生了什么事?

谢谢。

编辑

如果在 Chrome 上运行,它可以在移动设备上运行。离线问题仅在从“主页”图标运行时才会出现,作为 PWA。

【问题讨论】:

  • 您的手机上的 Chrome 版本是什么?
  • 59.0.3071.125 - Android 7.0.0

标签: javascript service-worker progressive-web-apps


【解决方案1】:

我已经解决了,如果有用户发现自己处于相同的情况,我会详细说明问题。

问题是我在 manifest.json 中输入了 Google Analytics 的起始网址:

 "start_url": "/meteosurf/?utm_source=mobile&utm_medium=device&utm_campaign=standalone",

离线时,应用程序不知道该做什么,所以它显示“无连接”屏幕。

为了修复它,我在 service worker fetch 函数中添加了一个错误函数,将应用程序重定向到 index.html。这样:

self.addEventListener('fetch', function(event) {
  console.log('Fetch event for ', event.request.url);
  event.respondWith(
    caches.match(event.request).then(function(response) {
      if (response) {
        console.log('Found ', event.request.url, ' in cache');
        return response;
      }
      console.log('Network request for ', event.request.url);
      return fetch(event.request)

    }).catch(function(error) {

      return caches.match('index.html');

    })
  );
});

【讨论】:

  • 我发现,当我通过 install 事件缓存我的应用程序后,当我单击 Service Worker 窗格中的 offline 框时,Service Worker 本身似乎被删除。如果没有 service worker,我的应用显然无法从缓存中加载。我想知道这是否与您的经验一致,因为您似乎已经从缓存中加载了 shell。
  • 这是一个有趣的发现,它是我问题的根源:在测试离线功能时不要使用CRTL+SHIFT+F5 Hard Reload。来了解一下,它一直在工作,但我(习惯性地)重新加载导致服务工作者和缓存被清除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 2016-04-11
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 2018-05-28
相关资源
最近更新 更多