我目前正在开发一个带有 Capacitor 的应用程序,因为它使用内部 https 服务器将文件提供给 WebView 而不是文件协议,这应该允许我使用服务工作者,但遗憾的是这似乎并不能事实就是如此,即使据我了解,我想做的一切都在规范范围内。
主要脚本代码:
navigator.serviceWorker.register('sw.js');
服务人员代码:
console.log("I'm a service worker");
我得到什么
获取脚本时发生未知错误。 无法加载资源:net::ERR_CONNECTION_REFUSED localhost/:1 未捕获(承诺中) TypeError: 无法注册 ServiceWorker: 获取脚本时发生未知错误。
我期望得到什么
我是服务人员
另一方面,当我尝试使用完全相同的请求获取服务工作者时,它工作得很好。
代码:
fetch("https://localhost:4634/sw.js", {
"credentials":"omit",
"headers": {},
"referrer":"https://localhost:4634/sw.js",
"referrerPolicy":"no-referrer-when-downgrade",
"body":null,
"method":"GET",
"mode":"cors"
}).then(res => {
return res.text();
}).then(text => {
console.log(text);
});
我得到的回报:
console.log("I'm a service worker");
如果有人知道我做错了什么,或者如果这仍然不符合规范,请告诉我
您的错误消息表明
register
无法将 'sw.js'
识别为合格类型。
有几件事你可以尝试。
navigator.serviceWorker.register('/sw.js', {
scope: '/',
updateViaCache: 'none'
})
sw.js
响应标头。它们应该包括:Cache-Control: no-store
Content-Type: application/javascript
Service-Worker-Allowed: /
如果 Capacitor 不生成这些标头,那么您可能必须使用代理服务器来处理
sw.js
,然后再将响应传递给 WebView。