РЕДАКТИРОВАТЬ: Подтверждено, этот обходной путь больше не работает в Safari 5.1 на Mac. Обсуждается здесь: Safari сторонний cookie-трюк iframe больше не работает?
Я не знаю, каков ваш вариант использования, но в нашем приложении у нас есть экран приветствия с кнопкой «Разрешить доступ», которая открывает диалог разрешений. Когда пользователь нажимает «Разрешить доступ», я использую его, чтобы открыть новое окно, которое устанавливает сеанс и немедленно закрывается (это было предложено в вопросе, связанном выше). После того, как пользователь разрешил доступ, вы можете просто перезагрузить страницу? В нашем случае это не требуется, так как вся связь с сервером осуществляется с помощью AJAX.
Я использую второе решение, и у меня нет проблем с ним, вот мой код (с использованием jQuery):
/**
* Hack for Safari cross-domain cookies. See:
* http://anantgarg.com/2010/02/18/cross-domain-cookies-in-safari/
*/
$(document).ready( function() {
var isSafari = (/Safari/.test(navigator.userAgent));
if (isSafari) {
var iframe = $( "<iframe />" );
iframe.attr( "id", "cookieframe" );
iframe.attr( "name", "cookieframe" );
iframe.hide();
var form = $( "<form />" );
form.attr( "id", "cookieform" );
form.attr( "target", "cookieframe" );
form.attr( "enctype", "application/x-www-form-urlencoded" );
form.attr( "action", "startsession.php" );
form.attr( "method", "post" );
$("body").append( iframe );
$("body").append( form );
form.submit();
}
} );
В startsession.php я только начинаю сеанс:
<?php session_start();