Chrome 移动设备上的 PWA 仅返回缓存版本的数据 HTTP 响应



我有一个Angular 7渐进式Web应用程序(PWA,Service Worker)。

我的应用程序是向 api 发出 http 请求以获取页面的数据。 与服务工作者一起缓存数据,以便下次用户进入页面时,他将看到缓存的数据,直到他/她从 http 响应中获取最新数据。

问题出在Android上的Chrome Mobile中。它只返回缓存的 http 响应,而不返回新数据。所有其他浏览器和操作系统都返回新数据。

这是我的ngsw.json文件:

{
"configVersion": 1,
"timestamp": 1553131016147,
"index": "/index.html",
"assetGroups": [
{
"name": "app",
"installMode": "prefetch",
"updateMode": "prefetch",
"urls": [
"/favicon.ico",
"/index.html",
"/main.888b10bbc9ea06b8a9bf.js",
"/polyfills.9f595158f842acad6b37.js",
"/runtime.2f29e12616932f0ed037.js",
"/styles.d2478451b17ed7e705c5.css"
],
"patterns": []
},
{
"name": "assets",
"installMode": "lazy",
"updateMode": "prefetch",
"urls": [],
"patterns": [
"https:\/\/maxcdn\.bootstrapcdn\.com\/font-awesome\/4\.7\.0\/css\/font-awesome\.min\.css"
]
}
],
"dataGroups": [
{
"name": "api",
"patterns": [
"\/api"
],
"strategy": "freshness",
"maxSize": 100,
"maxAge": 259200000,
"timeoutMs": 5000,
"version": 1
}
],
"hashTable": {
"/favicon.ico": "7c6a9b4e1370b6ee9386e16fba9ca4738b9e7037",
"/index.html": "fdf70f70c0f37aaa11b990ac0cf32839480b69a4",
"/main.888b10bbc9ea06b8a9bf.js": "abcc804a2ffbd57187d759a7c18b82963ac03d8c",
"/polyfills.9f595158f842acad6b37.js": "4eb96258211620bfe371478144b69844117f5120",
"/runtime.2f29e12616932f0ed037.js": "21109b3561b5a6c3ed51bc3015962f05da8e57b3",
"/styles.d2478451b17ed7e705c5.css": "29fb80dd9fc36fbb4ee107f15fd24dd7400ea255"
},
"navigationUrls": [
{
"positive": true,
"regex": "^\/.*$"
},
{
"positive": false,
"regex": "^\/(?:.+\/)?[^/]*\.[^/]*$"
},
{
"positive": false,
"regex": "^\/(?:.+\/)?[^/]*__[^/]*$"
},
{
"positive": false,
"regex": "^\/(?:.+\/)?[^/]*__[^/]*\/.*$"
}
]
}

相关的代码部分位于dataGroups下,所有带有/api前缀的url,正如您所看到的,我正在使用freshness策略,根据Angular的服务工作者配置页面: https://angular.io/guide/service-worker-config

新鲜度优化数据货币,优先获取 从网络请求的数据。仅当网络超时时, 根据超时,请求是否回退到缓存。这是 对于频繁更改的资源很有用;例如,帐户 平衡。

但在这种情况下,情况似乎恰恰相反 Android 上的 Chrome Mobile。

你们中是否有人遇到过这种情况,可以指出我正确的方向?

根据我对角度服务工作者如何工作的理解是:

如果指定了freshness策略,则服务工作进程将等待使用timeout键(不是 timeoutMs)指定的时间,以便网络在指定的时间内做出响应,如果网络未在指定的时间内响应,则响应将由服务工作线程从缓存的数据发送。

在您的情况下,android 设备的互联网速度可能较低,因此不会在指定的超时间隔内获取数据,因此您可以获取缓存的数据。通过增加超时来检查应用程序。


以防万一你需要这个。

我发现缓存 API 请求非常不可靠,我不清楚何时才能获得更新的数据。(是的,当 maxSize 或 maxAge 超过指定值或超时已超过时,但仍然没有明确的方法可以确定我可以获得新数据。

每当我想从服务器获取新数据时,我都会从浏览器中清除属于ngswapi 调用的所有缓存数据。我为同样的东西写了这个脚本。如果需要,请看一看。

caches.keys().then((keys) => {
keys.forEach((eachCacheName) => {
let regExPat = /^(ngsw).*api.*/;
if (regExPat.test(eachCacheName)) {
caches.open(eachCacheName).then((eachCache) => {
eachCache.keys().then((requests) => {
requests.forEach((eachRequest) => { eachCache.delete(eachRequest); });
});
});
}
});
});

最新更新