2015-07-10 13 views
15

Mamy aplikację internetową działającą na Facebooku (tj. Działającą w iFrame w innej domenie). Jeśli użytkownik Safari ma domyślnie ustawione pliki cookie i dane witryny sieci Web, "Zezwól na odwiedzane przeze mnie strony", dane przechowywane przez localStorage.setItem działają jak sessionStorage, tj. Nie są dostępne poza bieżącą sesją użytkownika (tj. Po zamknięciu użytkownika Zakładka). Jeśli zmieniamy ustawienie na "Zawsze zezwalaj", działa ono tak samo jak w Chrome, IE itd.Safari localStorage nie jest zachowywany między sesjami

Bezpośrednio po próbie, przeglądaliśmy przeglądarkę w domenie naszej aplikacji (https://ourappname.appspot.com) bezpośrednio i działa dobrze tam. A także powinna to być odwiedzana strona internetowa, ale po powrocie do gry na Facebooku problem nadal istnieje.

Należy zauważyć, że wywołanie setItem działa poprawnie, po prostu getItem nie zwraca niczego w kolejnej sesji. (Tak więc nie jest tak, gdy użytkownik korzysta z przeglądania prywatnego, a wywołanie setItem samo kończy się błędem przekroczenia limitu.)

Co musimy zrobić, aby wspierać Safari, aby nasza aplikacja działająca na Facebooku mogła używać localStorage jako przeznaczone, gdzie dane przetrwają między sesjami?

+0

Dziwne, właśnie testowałem w Safari 8.0.7 (10600.7.12) za pomocą opcji "Zezwalaj na odwiedzane przeze mnie witryny". Ustawiłem klucz localStorage, a następnie zamknąłem przeglądarkę (z ⌘ + Q) i kiedy ponownie otworzyłem przeglądarkę i użyłem localStorage.getItem, było tam. – daviddoran

+0

@daviddoran dzięki. Czy testowałeś witrynę działającą w iFrame, która była inną domeną niż witryna najwyższego poziomu? Zmienię moje pytanie, aby było to bardziej jasne. – leontx

Odpowiedz

3

Wciąż czekam na odpowiedź od Apple, ale można bezpiecznie powiedzieć, że utknęliśmy w tym zachowaniu. Tak więc odpowiedź Anubhava jest dokładna, ale wciąż potrzebowaliśmy rozwiązania.

W ramach pracy stworzyliśmy nowe punkty końcowe na naszym serwerze, które utrzymują/przywracają stan gry. Używamy tego tylko w Safari, dla wszystkich innych przeglądarek nadal utrzymujemy stan naszej gry w localStorage.

Istnieje niewielka kara za wydajność dla użytkownika. I niewielki koszt serwera. To nie jest seksowne rozwiązanie, ale teraz nasza aplikacja na płótnie na Facebooku obsługuje Safari.

+0

Słyszałeś kiedyś o tym? Wpadłem też na ten problem. Mój scenariusz jest bardzo podobny (iFrame, itp.). –

+2

@WesleyWorkman Brak nowych informacji od czasu opublikowania tej odpowiedzi i moich komentarzy. To było nasze obejście i jest produkowane od kilku miesięcy i działa dobrze. – leontx

7

To błąd w Safari lub funkcji zabezpieczeń.

Odwiedzasz FaceBook, a nie swoją stronę. Twoja aplikacja ma element iframe, który narusza model zabezpieczeń, jeśli pozwala odczytać dane z przeglądarki. Zastanów się, czy strona konkurencji nie odczytała danych, które zrobiła/nie ustawiła. To stanowiłoby wyciek informacji.

Safari robi to dobrze w tym względzie.

Najlepiej w trybie "Zezwalaj z odwiedzanych stron internetowych", żadna przeglądarka nie powinna umożliwiać ramkom iframe ustawienia danych na localStorage; nawet jeśli każda domena ma własne piaskownice pamięci masowej.

To, co mnie martwi, to dlaczego w ogóle pozwalają pisać do localStorage z iframe (w trybie "Zezwalaj tylko na odwiedzane witryny")? To może być błąd - atak na podróbkę informacji umożliwiający błąd.

Myślę, że to dlatego, że wyjątki bezpieczeństwa zostały usunięte z localStorage w przypadku nie pochodzącego od tej samej strony pochodzenia żądania. W związku z tym przeglądarka Safari może nie wyświetlać błędów, ale może po cichu zawieść (w niektórych przypadkach). Prawdopodobnie dlatego twoje połączenie setItem się powiodło.

W tym momencie, przy podanych informacjach, podejrzewam, że pan nie ma szczęścia z powodu programistów Safari po standard na literę.

+0

dzięki za rozważną odpowiedź. Wygląda na to, że jeśli użytkownik przejdzie bezpośrednio na naszą stronę, nasza strona będzie mogła odczytać/zapisać localStorage. Wydaje się, że ta część może być błędem? I moje główne pytanie dotyczące tego, co musimy zrobić ... daj mi znać, jeśli znasz jakieś obejście. Wydaje mi się, że większość aplikacji canvas na Facebooku musiała znaleźć jakieś obejście tego problemu? – leontx

Powiązane problemy