刷新后 OneSignal 注册失败

Nor*_*gul 3 push push-notification laravel onesignal vuejs2

我在我的 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>
Run Code Online (Sandbox Code Playgroud)

我也有自己的 service worker,所以我也遵循了这里的文档。

硬重置后发生的事情是安装了 Service Worker 并且一切正常,但是一旦我刷新页面,我就会得到:

OneSignalPageSDKES6.js?v=151102:1 Uncaught (in promise) InvalidStateError: 当前环境不支持此操作。在 Xe处的 Function.getServiceWorkerHref ( https://cdn.onesignal.com/sdks/OneSignalPageSDKES6.js?v=151102:1:41510 )。(https://cdn.onesignal.com/sdks/OneSignalPageSDKES6.js?v=151102:1:144028) at Generator.next () at r (https://cdn.onesignal.com/sdks/OneSignalPageSDKES6.js? v=151102:1:716)

我不知道这是什么意思?什么是“当前环境”?从哪里开始调试?我试过在它周围放置控制台日志,但是它让我无处可去......

erm*_*mik 5

您可以通过查看库的源代码来开始调试。

在您的情况下,您的库是用于浏览器的 OneSignal SDK。

我们开工吧!!!

我们可以看到这个错误是由getServiceWorkerHref函数抛出的(定义在这里),错误信息是由枚举驱动InvalidStateReason

      case InvalidStateReason.UnsupportedEnvironment:
        super(`The current environment does not support this operation.`);
        break;
Run Code Online (Sandbox Code Playgroud)

如果您查看第一个链接文件,您会看到getServiceWorkerHrefOneSignal 开发人员为那些敢于探索其源代码的人留下的注释:

    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);
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,当 Service Worker 处于“Bypassed”状态时会引发错误。那是什么,你可能会问?让我们看看下面的ServiceWorkerActiveState枚举,在同一个文件中

  /**
   * 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',
Run Code Online (Sandbox Code Playgroud)

看起来,当浏览器“硬刷新”页面时,它绕过了服务工作者,并且在发生这种情况时 OneSignal 无法正确初始化。硬刷新的发生有多种原因——以下是其中一些(据我所知):

  • 如果你多次点击刷新按钮(通常短时间内连续几秒刷新可能会触发这个)
  • 如果您在 DevTools 中禁用了缓存
  • 如果服务器设置了no-cache标头

硬重置后会发生什么

我不知道你所说的“硬重置”是什么意思,但这听起来像是会触发这个问题。我建议您关闭浏览器,然后在不使用“重置”功能的情况下访问您正在处理的页面——理论上,服务工作者应该用于缓存连续访问,这将确保 OneSignal 可以正常工作。

  • 我已经联系了支持人员以了解可能出现的问题。我会尽快回复您,谢谢 (2认同)