19

Mac の Safari には、デフォルトで がBlock cookies設定さFrom third parties and advertisersれています。

埋め込まれた swf が別のドメインのものである場合、SharedObject の動作が停止します。

この問題は新しいものではありません: Safari サードパーティ 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 を使用してこのプロセスを簡素化し、クリック イベントのリスナーを作成しています。ランディング ページの残りの 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 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 に答える
1

ごく最近の経験から言えば、これは Mac 上の Safari の問題ではなく、問題として経験したこともありません。

設定がサードパーティからの Cookie をブロックしていると述べました。SharedObject ストレージはサードパーティからのものではなく、アクセスしているサイト (ファーストパーティ?) からのものです。ですから、それが問題になることは決してないと思います。

Flash Player 設定パネルを使用して、ユーザーは を無効にするSharedObject(またはストレージ容量を制限する) ことができます。したがって、一般に、アプリは が利用できない場合を処理する必要SharedObjectがあります。

ただし、ほとんどのユーザーは を認識しておらず、SharedObject無効にできると思います。

于 2012-07-24T16:29:08.690 に答える
1

私はこの方法で解決しましたが、server2 にセッション変数を保持するとアプリケーションのスケーラビリティが低下するため、HTML5 localstorage を使用して Web サービスを安静にする方がよいでしょう。ここで、サードパーティの 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);
?>

PS window.open は一種のポップアップのように表示されるため、広告ブロッカーまたはブラウザーの設定に問題がある可能性があります。

于 2015-01-10T21:26:31.977 に答える
0

setTimeout や safari.xxx ページの 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 に答える