18

Mac上的Safari默认设置为Block cookies,设置为From third parties and advertisers阻止第三方Cookie - 解决方法(facebook应用程序等)

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

此问题不是新: Safari 3rd party cookie iframe trick no longer working?

有没有人找到了解决(其他然后使会话ID通过GET/POST PARAMS在每个请求)?

注: 我的网站,这是嵌入SWF进不去了,所以没有办法改变HTML或把任何JavaScript等

回答

1

我可以从非常最近的经验说这对于Mac上的Safari来说不是问题,我也没有把它当成问题。

您提到的设置是阻止来自第三方的Cookie:SharedObject存储永远不是来自第三方,它来自您访问的网站(第一方?)。所以我不认为这将是一个问题。

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

但是,我认为大多数用户并不知道SharedObject,他们可以禁用它。

+0

我刚刚设置为阻止第三方cookie(Win7 Safari),并且SharedObject不能正常工作。我会得到一些痕迹并尽快更新这篇文章。 – 2012-07-24 17:16:45

+0

有趣的是,该设置不是默认的,但对吗?此外,阻止访问共享对象的另一件事是“私人”或“隐身”浏览(浏览器仅在该特定会话中保留Cookie)。 Chrome有这样做的选项。 – 2012-07-24 18:20:55

+1

我应该在我自己的浏览器(Safari 5.1.7,Mac)中进行检查:在首选项中的隐私选项卡上,“阻止Cookie”设置设置为阻止来自第三方和广告商的Cookie。这是默认值(我认为我没有改变它)。但在我的情况下,访问SharedObject在阻止第三方cookie时工作得很好。 – 2012-07-24 18:25:34

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

// UPDATE 23 2013

固定用于工作,直到Safari浏览器6

请参阅@Fabio安栋梁这个问题的这种蹩脚的方式@ncubica下面的评论。

// UPDATE 2013年7月23日由法比奥·安图内斯

这里是我的代码

在着陆页,我们将有关于应用程序和一个按钮,说像“输入”的简要说明。我正在使用jquery来简化这个过程,为click事件创建一个监听器,我只是把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 
+1

这不会触发弹出窗口阻止程序,因为用户没有点击发起这个?此外,你打开一个没有任何内容的新窗口,对我来说这似乎不是一个可以接受的生产解决方案。 – Abadaba 2012-08-09 20:08:56

+1

目前,这是我可以使事情可靠运作的唯一方式。非常糟糕的解决方法,因为Safari也会阻止“弹出窗口”。 @Abadaba如果你遇到更好的解决方案,请分享。 FYI:Facebook Apps – wenbert 2012-08-09 22:54:04

+1

谢谢,我摆脱了我的同样的问题:) – 2012-11-28 10:54:12

10

Safari浏览器确实还从它并没有在上面的窗口访问域阻止Cookie。

要解决这个问题,我们在PHP中计数($ _ COOKIES),并将浏览器定向到我们域中的一个页面,该页面的任务就是将浏览器简单地发送回来。这是一个肮脏的伎俩,这意味着一些用户将不必要地移动,然后回来,但是,网络充满了肮脏的伎俩。

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

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


我开发了Facebook应用程序,这些应用程序存在于内部iframe中,而这些应用程序存在这个问题。每个单独的应用程序必须随此修补程序一起发货。

+0

可否请你解释一下,但对于java的Facebook游戏应用程序解决方法? – maximus 2016-04-11 17:27:18

0

我想补充一个更清洁的方式,而不setTimeout和jQuery的或为safari.xxx页面。适用于最新的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> 

,因为它是由用户点击发起的弹出是不是在我的案件的问题。

1

我已经用这种方式解决了,但最好使用HTML5 localstorage,并使webservices更加平静,因为在server2中保存会话变量会使您的应用程序不能很好地扩展。 这里是我用来解决第三方cookie问题的代码。服务器1的客人基本上首先进入服务器2以便接受“硬币:D”并突然他回到服务器1。通过这种方式,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); 
?> 

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