19

Mac 上的 Safari默认Block cookies设置为From third parties and advertisers

如果嵌入的 swf 来自不同的域,它会阻止 SharedObject 工作。

这个问题并不新鲜: Safari 3rd 方 cookie iframe 技巧不再起作用?

有没有人找到解决方案(除了在每个请求中通过 GET/POST 参数传递会话 ID)?

注意:我无法访问嵌入 swf 的站点,因此无法更改该 HTML 或放置任何 JavaScript 等。

4

6 回答 6

12
function setCookie(){
   if ( navigator.userAgent.indexOf('Safari') != -1 &&
        navigator.userAgent.indexOf('Chrome') == -1 ){
      window.open('safari.php','','width=200,height=100' );
   }
}

// then we set the cookie in safari.php

资料来源:http ://www.reizbombardement.de/archives/safari-5-1-4-enforces-cookie-policy

//更新 2013 年 7 月 23 日

这种解决此问题的糟糕方法在 Safari 6 之前一直有效。

请参阅下面的@Fabio Antunes 和@ncubica 评论。

//更新 2013 年 7 月 23 日,作者 Fabio Antunes

这是我的代码

在登陆页面上,我们将有一个关于应用程序的简短描述和一个按钮,上面写着“进入”之类的内容。我正在使用 jquery 来简化此过程,为单击事件创建一个侦听器,我将只放置 javascript 代码,因为我假设您已经拥有着陆页的其余 html 代码:

$(document).on("click", "#bt-landing", function(){
var left = (screen.width/2)-(500/2);
            var top = (screen.height/2)-(250/2);
            window.open('URL_FOR_THE_PHP_THAT_WILL_CREATE_THE_SESSION', '_blank', 'width=500,height=250,toolbar=0,location=0,menubar=0, top='+top+', left='+left);
});

这将打开一个小窗口,大小为 500 x 250 像素,以屏幕为中心。

我的小窗口代码是这样的:

<?php setcookie("safari_cookie", "1");?>
    <html>
        <head>
            <meta charset="utf-8">
            <title>THE NAME OF YOUR APP OR SOMETHING THAT THE USER WE'LL READ AND ASSUME THAT THIS SMALL WINDOW IS RELIABLE</title>
        </head>
        <body>
        <script type="text/javascript">
        $(document).ready(function(){
           setTimeout(function(){window.close()},1000);
        })
        </script>
        </body>
    </html
于 2012-07-25T02:23:03.823 回答
11

Safari仍然会阻止来自顶部窗口中它没有访问过的域的 cookie

为了解决这个问题,我们在 PHP 中计算 ($_COOKIES) 并将浏览器定向到我们域上的一个页面,该页面的工作是将浏览器简单地发送回它的来源。这是一个肮脏的把戏,这意味着一些用户会不必要地离开然后又回来,但是,网络上充满了肮脏的把戏。

如果您无法设置top.location.href需要设置 cookie 的域上的页面,或者您无法更改所述域上的页面,那么我可以自信地说您需要使用基于 URL 的会话。

但是,另一种选择(仍然需要能够在域上创建页面)是请求用户单击您的 SWF,然后您可以触发window.open并使 URL 指向您创建的页面。它所需要做的就是加载成功,然后用户(甚至弹出页面本身的JS)可以关闭弹出窗口。然后,您可以设置 cookie。


我开发了 Facebook 应用程序,这些应用程序存在于 iframe 中,遇到了这个问题。每个应用程序都必须附带此修复程序。

于 2013-07-16T15:35:02.210 回答
1

根据最近的经验,我可以说这不是 Mac 上的 Safari 的问题,我也从未经历过它的问题。

您提到该设置阻止来自第三方的 cookie:SharedObject 存储永远不会来自第三方,它来自您正在访问的站点(第一方?)。所以我认为这永远不会成为问题。

使用 Flash Player 设置面板,用户可以禁用SharedObject(或限制存储空间量)。所以一般来说,你的应用程序应该处理SharedObject不可用的情况。

但是,我认为大多数用户都没有意识到SharedObject他们可以禁用它。

于 2012-07-24T16:29:08.690 回答
1

您可能需要使用跨域策略文件才能使 swf 正常工作。

http://kb2.adobe.com/cps/142/tn_14213.html

于 2013-07-22T20:41:59.217 回答
1

我已经以这种方式解决了,但最好使用 HTML5 localstorage 并使 web 服务变得安静,因为在 server2 中保存会话变量会使您的应用程序无法很好地扩展。这是我用来解决第 3 方 cookie 问题的代码。基本上 server1 的客人首先去 server2 以获取“硬币:D”,然后他突然回到 server1。这样,server2 的会话变量在所有导航中都是可用的。www.yourserver.com/index.html 页面

<script src="js/jquery.cookie.js" type="text/javascript"></script>
<script src="js/mobile-detect.js" type="text/javascript"></script>
<script>
var md = new MobileDetect(window.navigator.userAgent);
if (md.userAgent()=='Safari') {
    var firstsafariuser = $.cookie('safari-user');
    if (firstsafariuser != 'true') {
        $.cookie('safari-user', true);
        location.href='http://www.yourserver2.com/coin.php?frompage='
        +location.href.replace(location.hash,"")+'&hashtags='+location.hash.substr(1);
    }
}
</script>

www.yourserver2.com/coin.php

<?php
session_start(); 
if (isset($_GET["frompage"])&&$_GET["frompage"]!=null){
    $url=$_GET["frompage"];
} else {
    $url='http://www.yourserver.com';
}
if (isset($_GET["hashtags"])&&$_GET["hashtags"]!=null){
    $hash='#'.$_GET["hashtags"];
} else {
    $hash='';
}
header('Location:'.$url.$hash);
?>

PS window.open 被视为一种弹出窗口,因此您可能会遇到广告拦截器或浏览器设置的问题。

于 2015-01-10T21:26:31.977 回答
0

只是为 safari.xxx 页面添加一个没有 setTimeout 和/或 jquery 的更简洁的方式。适用于最新的 ios (8.1.2),我知道 8.1.0 存在窗口/选项卡无法关闭的错误。

这是代码:

<%
request.getSession(true); //or anyway to set the cookie depending on your language (jsp here)
%>

<script type="text/javascript">
    window.addEventListener("load", window.close);
</script>

在我的情况下,弹出窗口不是问题,因为它是由用户单击启动的。

于 2014-12-29T04:14:10.023 回答