我们的应用由https://myserver.com/myapp
提供服务(由IIS在虚拟应用程序中提供)从https://myserver.com/myapp返回的HTML是:
<html>
<!-- This file is served as a virtual application from https://myserver.com/myapp-->
<head>
<script src="/myapp/file.js"></script>
</head>
<body>
</body>
要注册服务人员,我需要添加如下所示的子文件夹
// This does not work since the app is served from /myapp
navigator.serviceWorker.register("/sw.js") // Fail, will try loading https://myServer.com/sw.js
// This works (registration successful)
navigator.serviceWorker.register("/myapp/sw.js") // This will register the sw.
当我尝试使用serviceworker时,会发生问题,即正在等待就绪事件:
// Inside of file.js
navigator.serviceWorker.ready.then(...) // Will not fire
我猜发生了什么事,因为服务工作人员“认为”它是从名为“ MyApp”的子文件夹中安装的,所以就绪事件没有触发,但是当file.js运行并尝试使用服务工作人员时,它看起来像例如file.js是从根目录提供的,因此不在serviceworker的范围内。
关于如何处理此问题的任何想法?我尝试使用scope参数,但我认为这仅是用于限制范围,而不是扩展范围。
{ scope: '/' } // Will fail with outside root error
{ scope: '/MyApp' } // Works, but still no ready event
我确定我在这里遗漏了一些东西,但我不知道它是什么。
答案 0 :(得分:0)
我找到了一种解决方法,但仍然不确定为什么不准备就绪。
navigator.serviceWorker.ready.then(function(reg){...}) // Will not fire
// Instead, assume registred and active, then this is a workaround
navigator.serviceWorker.getRegistrations().then(function ([reg]) {...})
答案 1 :(得分:0)
@Larsi答案指向正确的方向。给出一个更完整的例子
navigator.serviceWorker.getRegistrations().then(registration => {
registration[0].showNotification(your-title, your-options);
});