【发布时间】:2019-11-11 10:15:03
【问题描述】:
我的 Angular 6 应用程序使用 Service Worker 时遇到问题。
它不会自动更新,而且我每周都会制作新版本,因此我的用户经常会过时。
这是我的 app.component.ts
import { Component } from '@angular/core';
import { DataService } from 'src/services/data.service';
import { SwUpdate } from '@angular/service-worker';
declare var M: any;
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'MyApp';
public modalUpdate:any;
constructor(public dataService: DataService, public updates:SwUpdate) {
updates.available.subscribe(event => {
console.log('current version is', event.current);
console.log('available version is', event.available);
localStorage.setItem("version",event.current.appData["version"]);
localStorage.setItem("versionHash",event.current.hash);
updates.activateUpdate().then(() => this.modalUpdate.open());
});
updates.activated.subscribe(event => {
localStorage.setItem("activatedVersion",event.previous.appData["version"]);
localStorage.setItem("activatedVersionHash",event.previous.hash);
console.log('old version was', event.previous);
console.log('new version is', event.current);
});
}
updateApp(){
window.location.reload();
console.log("se está actualizando");
}
ngOnInit() {
this.modalUpdate = new M.Modal(document.querySelector('#modalUpdate'));
}
}
但似乎永远不会触发 updateApp 方法。当我通过访问 /ngsw/status 看到 NGSW 调试信息时,我看到:
NGSW Debug Info:
Driver state: NORMAL ((nominal))
Latest manifest hash: none
Last update check: never
=== Idle Task Queue ===
Last update tick: never
Last update run: never
Task queue:
Debug log:
所以它说从未更新或检查过更新(正如我所读)
这是我的 ngsw-config.json
{
"index": "/index.html",
"assetGroups": [
{
"name": "MyApp",
"installMode": "prefetch",
"updateMode": "prefetch",
"resources": {
"files": [
"/*.html",
"/*.css",
"/*.js",
"/assets/fonts/**"
]
}
},
{
"name": "games",
"installMode": "prefetch",
"updateMode": "prefetch",
"resources": {
"files": [
"/assets/games/fk/**"
]
}
},
{
"name": "assets",
"installMode": "lazy",
"updateMode": "prefetch",
"resources": {
"files": [
"/assets/**"
],
"urls": [
"https://f001.backblazeb2.com/file/**",
"https://picsum.photos/**"
]
}
}
]
}
#modalUpdate 元素是一个带有触发 updateApp 功能的按钮的模态元素,它永远不会起作用(似乎永远不会触发 updates.available 和 updates.activated)。
当用户直接从 Chrome 打开页面并刷新它时,页面会更新,但我需要应用程序在不打开浏览器的情况下自行刷新,有时甚至从浏览器刷新,即使它已加载新版本,它又回到了以前的版本。
应该是每次加载应用都会自动更新,所以我不知道为什么缓存从不刷新。
我几乎绝望了。我应该怎么做,或者我做错了什么?
非常感谢。
【问题讨论】:
-
顺便说一句,当应用程序更新到最新版本时,它会在一段时间后恢复到以前的版本
-
很难说,去你的生产应用并检查这个 URL 是否有任何错误
/ngsw/state -
@Ploppy NGSW 调试信息:驱动程序状态:正常((名义))最新清单哈希:无 最后更新检查:从不 === 空闲任务队列 === 最后更新滴答声:从不 上次更新运行:从不任务队列:调试日志:
-
最有可能在更新后: 1. 您的用户加载他们的缓存版本 2. 当他们使用网站超过几秒钟时,更新在后台发生 3. 下次他们打开网站,他们应该会看到您的更新。 - 检查您是否观察到这种情况。在我观察到这一点之前,我认为我的也没有更新。
-
我用更好的措辞进行了编辑。几周来我一直在寻找解决方法,但没有找到。
标签: angular angular6 service-worker progressive-web-apps angular-service-worker