【问题标题】:How to debug Safari ITP 2.0 requestStorageAccess failure如何调试 Safari ITP 2.0 requestStorageAccess 失败
【发布时间】:2019-02-09 22:02:22
【问题描述】:

我目前正在努力使我的代码与Safari ITP 2.0 兼容。在 onClick 触发的方法中,我的代码类似于以下代码:

if (document.hasStorageAccess && document.requestStorageAccess) {
  console.log('On Safari 12');
  document.hasStorageAccess().then(
      function successful(hasAccess) {
        console.log('Testing if hasAccess');
        if (hasAccess) {
          console.log('Access granted already');
        } else {
          console.log('Requesting access');
          document.requestStorageAccess().then(
              function successful() {
                console.log('Access request was a success');
                window.location.reload();
              },
              function fail() {
                console.log('Storage Access API call failed...');
              });
        }
      },
      function rejected(reason) {
        console.log('hasStorageAccess failed: ', reason);
      });
}

但是,运行它会得到日志语句“'Storage Access API call failed...'”而没有来自 Safari 的提示 - 更令人沮丧的是它以前工作但现在又开始失败了。有什么方法可以调试 requestStorageAccess 调用失败的原因吗?

我尝试按照the instructions 启用 ITP 调试模式日志,我确实从中得到了一些用处。它给了我一次这个错误:

2018-09-04 15:15:40.930157-0700 0x110c87 信息 0x0
69100 Safari 技术预览:(WebKit) [com.apple.WebKit:ResourceLoadStatisticsDebug] 无法授予存储 访问 example.com,因为它的 cookie 在第三方中被阻止 上下文,并且它没有作为第一方接收用户交互。

但是当我在第一方上下文中访问它并重新加载页面时,我没有进一步的理由说明对 requestStorageAccess 的调用失败。如果有人有任何想法,请告诉我您的建议我尝试调试问题。

谢谢!

【问题讨论】:

    标签: javascript cookies iframe safari storage-access-api


    【解决方案1】:

    有更新的调试说明:https://stackoverflow.com/a/61532464/13443904

    但我也想为那些在 Safari ITP 中苦苦挣扎的人提供一些更具体的步骤,因为弄清楚所有规则需要很长时间。

    1) 不要在 hasStorageAccess 中嵌入 requestStorageAccess。这会丢失提示 requestStorageAccess 所需的用户交互(按钮单击)。

    2) hasStorageAccess 和 requestStorageAccess 是承诺。确保任何后续操作都嵌套在 Promise 的成功闭包中(即,如果您有提交按钮,请不要在完成请求 requestStorageAccess 之前让它提交表单)。

    3) 您必须先设置第一方 cookie 并在子域的顶级窗口中进行用户交互,然后才能通过子域的 iframe 中的用户交互请求第三方 cookie 的 StorageAccess。在主域/父窗口中设置 cookie/交互不算数。

    4) Safari Technology Preview 中的测试使重置 ITP 选项更容易 - 只需清除历史记录并退出/重新打开,您就应该重新开始。 Safari 似乎永远坚持这些价值观。

    【讨论】:

      【解决方案2】:

      您是否作为第一方与您的网站进行了交互(点击/点击/表单输入)?仅仅参观是不够的。用户必须与与请求存储访问的域具有相同 eTLD+1 的网页进行交互。

      示例: 1) service.example 由 ITP 以跟踪能力分类。 2) 用户从 service.example 或 *.service.example 访问页面并与之交互。 3)当用户点击service.example的iframe时,service.example调用othersite.example下的Storage Access API。

      【讨论】:

      • 我在访问时已经这样做了,谢谢你的想法。我最关心的是如何调试这样的问题,而不是如何调试我目前遇到的具体问题(我想我主要解决了这个问题)。
      • 调试信息就是这么说的;无法授予存储访问权限,因为请求域尚未作为第一方接收用户交互。您还想调试其他东西吗?
      • 对不起,如果我的帖子难以理解。我收到该错误消息,我通过转到第一方域并单击它来解决问题,然后当我返回带有 iframe 的页面时,我仍然无法 requestStorageAccess,没有更多错误消息。跨度>
      猜你喜欢
      • 1970-01-01
      • 2019-05-19
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 2011-09-02
      • 2017-12-17
      相关资源
      最近更新 更多