如何调试Safari ITP 2.0 requestStorageAccess失败

时间:2018-09-04 20:29:46

标签: javascript cookies iframe safari webkit

我目前正在使我的代码与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调用失败...'”,而没有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的调用失败。如果有人有任何想法,请告诉我您建议我尝试调试的问题。

谢谢!

2 个答案:

答案 0 :(得分:7)

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

但是我也想为那些为Safari ITP苦苦挣扎的人们提供一些更具体的步骤,因为它花了很长时间才弄清所有规则。

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

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

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

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

答案 1 :(得分:1)

您是否以第一方身份与您的网站进行互动(点击/点击/表单输入)?仅仅拜访是不够的。用户必须与具有与请求存储访问权限的域相同的eTLD + 1的网页进行交互。

示例: 1)service.example被ITP划分为具有跟踪能力的类别。 2)用户访问来自service.example或* .service.example的页面并与之交互。 3)service.example在用户点击service.example的iframe时在othersite.example下调用Storage Access API。