我目前正在使我的代码与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信息0x069100 Safari技术预览:(WebKit)[com.apple.WebKit:ResourceLoadStatisticsDebug]无法授予存储由于example.com的cookie被第三方阻止,因此可以访问上下文,并且尚未以第一方的身份收到用户交互。
但是当我在第一方上下文中访问它并重新加载页面时,没有其他原因导致对requestStorageAccess的调用失败。如果有人有任何想法,请告诉我您建议我尝试调试的问题。
谢谢!
您是否以第一方身份与您的网站进行交互(点击/单击/填写表格)?仅仅拜访是不够的。用户必须与具有与请求存储访问的域相同的eTLD + 1的网页进行交互。
示例:1)service.example被ITP划分为具有跟踪能力的类别。2)用户访问来自service.example或* .service.example的页面并与之交互。3)当用户点击service.example的iframe时,service.example在othersite.example下调用Storage Access API。