MacのSafariにはBlock cookies
に設定 From third parties and advertisers
デフォルトで。
埋め込まれたswfが別のドメインからのものである場合、SharedObjectが機能しなくなります。
この問題は新しいものではありません: SafariサードパーティのCookie iframeトリックが機能しなくなりましたか?
誰かが解決策を見つけましたか(それ以外の場合は、各リクエストのGET/POSTパラメータを介してセッションIDを渡します)?
注:swfを埋め込んでいるサイトにアクセスできないため、そのHTMLを変更したりJavaScriptを配置したりする方法はありません。
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日更新
この問題を修正するこのくだらない方法は、Safari6まで機能していました。
以下の@FabioAntunesと@ncubicaのコメントをご覧ください。
// 2013年7月23日更新FabioAntunes
これが私のコードです
ランディングページには、アプリの簡単な説明と「Enter」のようなボタンがあります。 jqueryを使用してこのプロセスを簡略化し、クリックイベントのリスナーを作成します。ランディングページの残りのhtmlコードが既にあると想定しているため、JavaScriptコードを配置します。
$(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 250pxの小さなウィンドウが開きます。
私が小さなウィンドウ用に持っているコードはこれです:
<?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
Safari トップウィンドウでアクセスしていないドメインからのCookieは引き続きブロックされます。
これを回避するために、PHPで($ _COOKIES)をカウントし、ブラウザを元の場所に戻すだけの仕事をしているドメイン上のページにブラウザを誘導します。これは汚いです。トリックとは、一部のユーザーが不必要に離れてから戻ってしまうことを意味しますが、その後、Webは汚いトリックでいっぱいになります。
Cookieを設定する必要のあるドメインのページにtop.location.href
を設定できない場合、またはそのドメインのページを変更できない場合は、URLベースのセッションを使用する必要があると自信を持って言えます。
ただし、別のオプション(ドメインでページを作成できる必要があります)は、ユーザーがSWFをクリックするように要求することです。その後、window.open
をトリガーして、作成したページをURLで指すようにすることができます。正常にロードするだけで、ユーザー(またはポップアップページ自体のJS)がポップアップを閉じることができます。その後、Cookieを設定できます。
私はこの問題を抱えているiframe内にあるFacebookアプリを開発しています。この修正プログラムを使用して、すべてのアプリを出荷する必要があります。
ごく最近の経験から、これはMac上のSafariの問題ではなく、問題として経験したこともないと言えます。
設定がサードパーティからのCookieをブロックしているとおっしゃいました。SharedObjectストレージはサードパーティからのものではなく、アクセスしているサイト(ファーストパーティ?)からのものです。ですから、それが問題になることはないと思います。
Flash Player設定パネルを使用して、ユーザーはSharedObject
を無効にする(またはストレージスペースの量を制限する)ことができます。したがって、一般的に、アプリはSharedObject
が利用できない場合を処理する必要があります。
ただし、ほとんどのユーザーはSharedObject
を認識しておらず、無効にできると思います。
Swfを正しく機能させるには、クロスドメインポリシーファイルを使用する必要がある場合があります。
私はこの方法で解決しましたが、server2でセッション変数を保持するとアプリケーションのスケーラビリティが低下するため、HTML5ローカルストレージを使用してWebサービスを安らかにする方がよいでしょう。これが、サードパーティのCookieの問題を解決するために使用したコードです。基本的にserver1のゲストは「コイン:D」を取るために最初にserver2に行き、突然彼は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);
?>
P.S. window.openは一種のポップアップのように見えるため、広告ブロッカーやブラウザの設定に問題がある可能性があります。
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>
私の場合、ポップアップはユーザーからのクリックによって開始されるため、問題にはなりません。