Laravel 刷新后OneSignal注册失败

Laravel 刷新后OneSignal注册失败,laravel,vuejs2,push-notification,push,onesignal,Laravel,Vuejs2,Push Notification,Push,Onesignal,我正在Laravel/Vue应用程序中使用OneSignal。我已将其包含在文档中所述的中: <script src="https://cdn.onesignal.com/sdks/OneSignalSDK.js" async=""></script> <script> var OneSignal = window.OneSignal || []; OneSignal.push(function() {

我正在Laravel/Vue应用程序中使用OneSignal。我已将其包含在文档中所述的
中:

<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>

var OneSignal=window.OneSignal | |[];
OneSignal.push(函数(){
OneSignal.init({
appId:“{{env('ONESIGNAL_APP_ID')}”
});
OneSignal.showNativePrompt();
});
if(导航器中的“serviceWorker”){
navigator.serviceWorker.register(“/OneSignalSDKWorker.js”)
.然后(函数(){
console.log(“服务人员已注册”);
})
.catch(函数(错误){
console.log('服务工作者注册失败:',错误);
});
}否则{
console.log('不支持服务工作人员');
}
我也有自己的服务人员,所以我也遵循了这里的文档

硬重置后发生的情况是安装了service worker,一切正常,但一旦我刷新页面,我会得到:

OneSignalPageSDKES6.js?v=151102:1未捕获(承诺中)InvalidStateError:当前环境不支持此操作。 在Function.getServiceWorkerRef()处 在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)

我不知道那是什么意思?什么是“当前环境”?从哪里开始调试?我已经试着把控制台日志放在它周围,但是它没有给我带来任何结果…

您可以通过查看库的源代码开始调试。 在您的例子中,您的库是用于浏览器的OneSignal SDK

让我们开始吧

我们可以看到,此错误是由
getServiceWorkerRef
函数(已定义)引发的,错误消息是由
InvalidStateReason
枚举引发的:

案例InvalidStateReason.UnsupportedEnvironment:
super(`当前环境不支持此操作。`);
打破
如果您查看第一个链接文件,您将看到
getserviceworkref
OneSignal开发人员留给那些敢于冒险开发其源代码的人的注释:

else if(workerState===ServiceWorkerActiveState.Bypassed){
/*
如果页面绕过缓存进行硬刷新,则没有服务工作者
将控制页面。
我们是否尝试重新安装现有的工作程序并不重要;仍然没有
安装后,服务人员将控制页面。
*/
抛出新的InvalidStateError(InvalidStateReason.UnsupportedEnvironment);
}
如您所见,当服务工作者处于“旁路”状态时,会引发错误。你可能会问,那是什么?让我们看看
ServiceWorkerActiveState
枚举:

/**
*服务工作者处于活动状态,但不控制页面。如果
*页面通过缓存进行硬刷新,缓存也会绕过服务
*工人。
*/
旁路='旁路',
看起来,当浏览器“硬刷新”页面时,它绕过了服务工作者,而OneSignal在这种情况下无法正确初始化。出现硬刷新的原因有很多(据我所知),以下是其中一些原因:

  • 如果多次单击“刷新”按钮(通常在短时间内连续刷新几秒钟可能会触发此操作)
  • 如果在DevTools中禁用了缓存
  • 如果服务器设置了
    无缓存
硬重置后发生了什么


我不知道你所说的“硬重置”到底是什么意思,但这听起来好像会引发这个问题。我建议您关闭浏览器,然后访问您正在使用的页面,而不使用“重置”功能-理论上,service worker应该用于连续访问时的缓存,这将确保OneSignal能够正常工作。

那么这是否意味着我不能执行cmd+shift+R,因为service worker将永远无法注册,我也无法依赖应用程序始终提供的功能?如果是这样的话,这是一个很大的扯淡…据我所知,如果服务人员没有“控制权”,OneSignal将无法正确初始化-当它被硬刷新绕过时,它将失去“控制权”。您应该向OneSignal支持部门提出请求,或者在他们的GitHub存储库中提出问题。我已联系支持部门了解可能存在的问题。我会给你回复的,谢谢@Norgul有没有关于这个问题的最新消息?@demsey他们的官方解释是这是他们的正常行为。硬重新加载绕过工作进程并导致该错误。所以没办法。老实说,我对服务很失望。。。