对于我的具体情况,我通过使用 window.postMessage() 并消除任何用户交互来解决该问题。请注意,这仅在您可以以某种方式在父窗口中执行 js 时才有效。通过让它包含来自您的域的 js,或者如果您可以直接访问源代码。
在 iframe(域-b)中,我检查 cookie 的存在,如果未设置,将向父级(域-a)发送 postMessage。例如;
if (navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1
&& document.cookie.indexOf("safari_cookie_fix") < 0) {
window.parent.postMessage(JSON.stringify({ event: "safariCookieFix", data: {} }));
}
然后在父窗口(域-a)中监听事件。
if (typeof window.addEventListener !== "undefined") {
window.addEventListener("message", messageReceived, false);
}
function messageReceived (e) {
var data;
if (e.origin !== "http://www.domain-b.com") {
return;
}
try {
data = JSON.parse(e.data);
}
catch (err) {
return;
}
if (typeof data !== "object" || typeof data.event !== "string" || typeof data.data === "undefined") {
return;
}
if (data.event === "safariCookieFix") {
window.location.href = e.origin + "/safari/cookiefix"; // Or whatever your url is
return;
}
}
最后在您的服务器 (http://www.domain-b.com/safari/cookiefix) 上设置 cookie 并重定向回用户来自的位置。下面的例子是使用 ASP.NET MVC
public class SafariController : Controller
{
[HttpGet]
public ActionResult CookieFix()
{
Response.Cookies.Add(new HttpCookie("safari_cookie_fix", "1"));
return Redirect(Request.UrlReferrer != null ? Request.UrlReferrer.OriginalString : "http://www.domain-a.com/");
}
}