18

Safari na komputerze Mac ma domyślnie ustawiony Block cookies na From third parties and advertisers.blokowanie plików cookie stron trzecich - obejście (aplikacje Facebook itp.)

Zatrzymuje obiekt SharedObject, jeśli osadzony plik swf pochodzi z innej domeny.

Ten problem nie jest nowy: Safari 3rd party cookie iframe trick no longer working?

Czy ktoś znalazł rozwiązanie (inne następnie przechodzącą identyfikator sesji przez GET params/post na każde żądanie)?

UWAGA: nie mam dostępu do strony, która jest osadzanie swf, więc nie ma sposobu, aby zmienić ten kod HTML lub umieścić dowolny JavaScript, itp

Odpowiedz

1

mogę powiedzieć z niedawnym doświadczeniem że to nie jest problem z Safari na Macu, nigdy też nie miałem z tym problemu.

Wspomniałeś, że ustawienie blokuje pliki cookie od podmiotów trzecich: magazyn SharedObject nigdy nie pochodzi od firmy zewnętrznej, ale pochodzi z odwiedzanej witryny (strona 1?). Więc nie sądzę, że kiedykolwiek będzie to problemem.

Za pomocą panelu ustawień Flash Player użytkownik może wyłączyć SharedObject (lub ograniczyć ilość wolnego miejsca). Zasadniczo Twoja aplikacja powinna obsługiwać przypadek, w którym SharedObject jest niedostępny.

Jednak uważam, że większość użytkowników nie zna SharedObject i może je wyłączyć.

+0

Właśnie ustawiłem ustawienie Blokuj pliki cookie innych firm (Win7 Safari) i SharedObject nie działa tak, jak powinno. Wkrótce dostanę ślady i zaktualizuję ten wpis. –

+0

Interesujące ... to ustawienie nie jest domyślne, ale prawda? Inną rzeczą, która blokuje dostęp do udostępnionego obiektu, jest przeglądanie "prywatne" lub "incognito" (gdzie przeglądarka przechowuje pliki cookie tylko dla tej konkretnej sesji). Chrome ma do tego opcję. –

+1

Powinienem to sprawdzić we własnej przeglądarce (Safari 5.1.7, Mac): w Preferencjach, na karcie Prywatność, ustawienie "Zablokuj pliki cookie" jest ustawione tak, aby blokować pliki cookie "od firm zewnętrznych i reklamodawców". Jest to wartość domyślna (nie sądzę, że kiedykolwiek ją zmieniłem). Ale w moim przypadku dostęp do SharedObject działa dobrze po zablokowaniu plików cookie innych firm. –

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 

Źródło: http://www.reizbombardement.de/archives/safari-5-1-4-enforces-cookie-policy

// UPDATE 23 lipca 2013

To brzydko sposób ustalania tego problemu pracował aż Safari 6.

proszę zobaczyć @Fabio Antunes i @ncubica komentarze poniżej.

// UPDATE 23 lipca 2013 przez Fabio Antunes

Oto mój kod

na stronie docelowej będziemy mieli krótki opis aplikacji oraz przycisk mówiąc coś w stylu „enter”. Używam jquery, aby uprościć ten proces, tworząc detektor zdarzenia kliknięcia, po prostu wstawię kod javascript, ponieważ zakładam, że masz już resztę kodu HTML strony docelowej:

$(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); 
}); 

To otworzy małe okno o wymiarach 500 na 250 pikseli, wyśrodkowane na ekranie.

Kod mam na małym oknie to:

<?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

Czy to nie spowoduje wyskakującego okienka, ponieważ użytkownik nie kliknął, aby go uruchomić? Dodatkowo otwierasz nowe okno, które nie ma w sobie nic, dla mnie to nie jest akceptowalne rozwiązanie produkcyjne. – Abadaba

+1

Obecnie jest to jedyny sposób na sprawne działanie. Bardzo złe obejście, ponieważ Safari ma również zablokowane "okna pop-up". @Abadaba, jeśli znajdziesz lepsze rozwiązanie, udostępnij. FYI: Facebook Apps – wenbert

+1

Dzięki, pozbyłem się tego samego problemu :) –

10

Safari ma nadal blokować cookies z domen, które nie odwiedziły w górnym oknie.

Aby obejść ten problem, liczymy ($ _ COOKIES) w PHP i kierujemy przeglądarkę na stronę w naszej domenie, której zadaniem jest po prostu przesłać przeglądarkę z powrotem do miejsca, z którego pochodzi. To brudna sztuczka, która oznacza, że ​​niektórzy użytkownicy zostaną niepotrzebnie przeniesieni, a potem z powrotem, ale wtedy sieć jest pełna brudnych sztuczek.

Jeśli nie możesz ustawić top.location.href na stronie w domenie, która wymaga ustawienia plików cookie, lub nie możesz zmienić strony we wspomnianej domenie, mogę śmiało powiedzieć, że musisz korzystać z sesji opartych na adresie URL.

Jednak alternatywną opcją (która wciąż wymaga możliwości utworzenia strony w domenie) jest żądanie, aby użytkownik kliknął plik SWF, można następnie wywołać window.open i wskazać adres URL utworzonej strony. Wystarczy, że załaduje się pomyślnie, a następnie użytkownik (lub nawet JS na samej stronie popup) może zamknąć popup. Następnie możesz ustawić pliki cookie.


Tworzę aplikacje na Facebooku, które żyją wewnątrz elementów iframe, które cierpią z powodu tego problemu. Każda aplikacja musi zostać dostarczona z tą poprawką.

+0

Czy mógłbyś wyjaśnić to samo, ale dla obejścia aplikacji na Facebooku? – maximus

0

Wystarczy dodać czystszy sposób bez setTimeout i czy jQuery na stronie safari.xxx. Działa dobrze z najnowszym ios (8.1.2), wiem, że dla wersji 8.1.0 wystąpił błąd, który powodował zamknięcie okna/karty.

Oto kod:

<% 
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> 

popup nie jest problemem w moim przypadku, ponieważ rozpoczyna się od kliknięcia przez użytkownika.

1

Rozwiązałem to w ten sposób, ale lepiej jest użyć HTML5 localstorage i uczynić serweżery restful, ponieważ przechowywanie zmiennych sesji w serwerze2 sprawia, że ​​twoja aplikacja nie jest dobrze skalowalna. Tutaj kod, którego używałem do rozwiązania problemu z ciasteczkami innych firm. Zasadniczo goście serwera1 udają się najpierw do serwera2, aby wziąć "monetę: D" i nagle wracają do serwera1. W ten sposób zmienne sesji serwera2 są dostępne we wszystkich nawigacjach. www.yourserver.com/index.html strona

<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 są postrzegane jako rodzaj wyskakującego okienka, więc możesz mieć problem z blokowaniem reklam lub ustawieniami przeglądarki.

Powiązane problemy