刷新后OneSignal注册失败 您将通过查看库的源代码开始调试

问题描述

我在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可以正常工作。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...