Safari ITP 2.0存储访问API-麻烦嵌套hasStorageAccess中的requestStorageAccess-非嵌套作品

时间:2018-12-19 00:08:11

标签: javascript cookies iframe safari webkit

我目前正在尝试实现调用存储访问API,但是在hasStorageAccess中嵌套对requestStorageAccess的调用时遇到了麻烦。

这是代码的概述-这是相当标准的:

  requestStorageAccessAndServe() {
    let thisObject = this;
    var promise = document.hasStorageAccess();
      promise.then(
        function (hasCookieAccess) {
          if (!hasCookieAccess) {
            document.requestStorageAccess().then(
                function successful() {
                  // reload iframe to run with cookie access
                  window.location.reload();
                },
                function fail() {
                  thisObject.serveContent();  // Code goes into here
                });
          } else {
            thisObject.serveContent();
          }
        },
        function (reason) {
          thisObject.serveContent();
        }
      );

  }

单击按钮触发此方法时,我总是会陷入该“失败”功能,而没有出现提示要求存储访问权限的提示。

令人惊讶的是,这个非嵌套的代码可以完美地工作:

  requestStorageAccessAndServe() {
    let thisObject = this;
    let hasCookieAccess = !!document.cookie;
    if (!hasCookieAccess) {
      document.requestStorageAccess().then(
          function successful() {
            window.location.reload();
          },
          function fail() {
            thisObject.serveContent();
      });

    } else {
      thisObject.serveContent();
    }
  }

此代码有效-它会在第一个请求上重新加载iframe,然后在另一个重新加载请求后提供数据,但是通过执行!! document.cookie来检查cookie的访问是非常棘手的(如果其中没有cookie数据该怎么办首先),而我更想了解这里出了什么问题。有人知道吗?

对于一个可能的解决方案,有什么办法可以强制解决document.hasStorageAccess(),所以我不需要嵌套它?

编辑:

强迫诺言解决也无济于事。参见代码示例:

  async requestStorageAccessAndServe() {
    let thisObject = this;
    let hasCookieAccess = await document.hasStorageAccess();
    if (!hasCookieAccess) {
      document.requestStorageAccess().then(
          function successful() {
            window.location.reload();
          },
          function fail() {
            thisObject.serveContent();
      });

    } else {
      thisObject.serveContent();
    }
  }

仍然进入“失败”功能...

1 个答案:

答案 0 :(得分:0)

这里的问题是requestStorageAccess()需要调用用户意图。通过将其嵌套在hasStorageAccess()承诺中,可以掩盖用户意图(单击),并且Safari会自动拒绝该请求。

为解决此问题,我在iframe加载时解析了hasStorageAccess(因为它不需要用户意图),将此结果存储在一个类变量中,然后如果解析为false,则在单击时检查requestStorageAccess。