问题描述
我在Laravel / Vue应用中使用OneSignal。如文档所述,我已将其包含在<head>
中:
<script src="https://cdn.onesignal.com/sdks/OneSignalSDK.js" async=""></script>
<script>
var OneSignal = window.OneSignal || [];
OneSignal.push(function() {
OneSignal.init({
appId: "{{ env('ONESIGNAL_APP_ID') }}"
});
OneSignal.showNativePrompt();
});
</script>
<script>
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/OneSignalSDKWorker.js')
.then(function () {
console.log('Service worker registered');
})
.catch(function (error) {
console.log('Service worker registration failed:',error);
});
} else {
console.log('Service workers are not supported.');
}
</script>
我也有自己的服务人员,所以我也遵循这里的文档。
硬重置后发生的事情是安装了Service Worker,并且一切正常,但是一旦刷新页面,我就会得到:
OneSignalPageSDKES6.js?v = 151102:1未捕获(已承诺)InvalidStateError:当前环境不支持此操作。 在Function.getServiceWorkerHref(https://cdn.onesignal.com/sdks/OneSignalPageSDKES6.js?v=151102:1:41510) 在xe。 (https://cdn.onesignal.com/sdks/OneSignalPageSDKES6.js?v=151102:1:144028) 在Generator.next() 在r(https://cdn.onesignal.com/sdks/OneSignalPageSDKES6.js?v=151102:1:716)
我不知道那是什么意思?什么是“当前环境”?从哪里开始调试?我曾经尝试过将控制台日志放到它周围,但是却无处可...... p
解决方法
您将通过查看库的源代码开始调试。
在您的情况下,您的库是用于浏览器的OneSignal SDK。
让我们这样做吧!
我们可以看到此错误由getServiceWorkerHref
函数(已定义为here)引发,错误消息由InvalidStateReason
枚举为driven:
case InvalidStateReason.UnsupportedEnvironment:
super(`The current environment does not support this operation.`);
break;
如果您查看第一个链接文件,则会在getServiceWorkerHref
上看到注释,OneSignal开发人员留给了那些敢于冒险使用其源代码的人:
else if (workerState === ServiceWorkerActiveState.Bypassed) {
/*
if the page is hard refreshed bypassing the cache,no service worker
will control the page.
It doesn't matter if we try to reinstall an existing worker; still no
service worker will control the page after installation.
*/
throw new InvalidStateError(InvalidStateReason.UnsupportedEnvironment);
}
如您所见,当服务工作者处于“绕过”状态时,会引发错误。您可能会问是什么?让我们看一下ServiceWorkerActiveState
枚举below,in the same file:
/**
* A service worker is active but not controlling the page. This can occur if
* the page is hard-refreshed bypassing the cache,which also bypasses service
* workers.
*/
Bypassed = 'Bypassed',
似乎,当浏览器“硬刷新”页面时,它绕过了服务程序,并且OneSignal在发生这种情况时无法正确初始化。硬刷新的发生可能有多种原因-据我所知,其中有一些原因:
- 如果您多次单击刷新按钮(通常在短时间内连续几秒钟刷新可能会触发此操作)
- 如果您在DevTools中禁用了缓存
- 如果服务器设置了
no-cache
标头
硬重置后发生了什么
我不知道您所说的“硬重置”到底是什么意思,但这听起来会触发此问题。我建议您关闭浏览器,然后在不使用“重置”功能的情况下访问正在处理的页面-从理论上讲,应该使用Service Worker进行连续访问的缓存,这将确保OneSignal可以正常工作。