刷新后 OneSignal 注册失败

Posted

技术标签:

【中文标题】刷新后 OneSignal 注册失败【英文标题】:OneSignal registration fails after refresh 【发布时间】:2020-08-30 16:07:45 【问题描述】:

我在我的 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 Uncaught (in promise) 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)

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

【问题讨论】:

【参考方案1】:

您将通过查看库的源代码开始调试。

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

让我们这样做吧!!!

我们可以看到这个错误是由getServiceWorkerHref函数(定义为here)抛出的,错误信息是drivenInvalidStateReason枚举:

      case InvalidStateReason.UnsupportedEnvironment:
        super(`The current environment does not support this operation.`);
        break;

如果您查看第一个链接文件,您会看到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);
    

如您所见,当服务人员处于“已绕过”状态时会引发错误。那是什么,你可能会问?再来看看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 标头

硬重置后会发生什么

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

【讨论】:

这是否意味着我不能执行 cmd+shift+R 因为服务工作者将永远不会被注册并且我不能依赖于我的应用程序始终可用的功能?如果是这样,这是一大堆公牛...... 据我所知,如果服务工作者没有“控制”,OneSignal 将无法正确初始化——当它被硬刷新绕过时,它会失去“控制” .您应该向 OneSignal 支持提出请求,或者在我链接的他们的 GitHub 存储库上提出问题,要求澄清。 我已经联系了支持人员,看看可能是什么问题。我会尽快回复你,谢谢 @demsey 他们的官方解释是这是他们的正常行为。硬重载会绕过工作人员并导致该错误。 This link pasted。所以没有办法解决它。老实说,我对服务感到失望......

以上是关于刷新后 OneSignal 注册失败的主要内容,如果未能解决你的问题,请参考以下文章

登陆界面代码

Django注册:由于缺少参数,注册失败后重定向

注册远程通知失败

eyeBeam1.5网络电话注册码激活后 注册SIP账号设定失败:出现注册错误403-Forbidden 怎么解决知道的告诉谢

secureCRT注册机多次连接失败,怎么办?

域名转移失败一般是啥原因?