Сафари localStorage не сохранялся между сеансами

У нас есть веб-приложение, которое работает в Facebook (т.е. работает в iFrame в другом домене). Если у пользователя Safari есть файлы cookie и данные веб-сайта, установленные по умолчанию, "Разрешить с веб-сайтов, которые я посещаю", данные, которые мы храним через localStorage.setItem, действуют как sessionStorage, то есть недоступны за пределами текущего сеанса пользователя (т.е. После закрытия пользователя вкладку). Если мы изменим настройку на "Всегда разрешать", она отлично работает, как в Chrome, IE и т.д.

В качестве теста мы попытались перевести браузер в наш домен приложения (https://ourappname.appspot.com), и он отлично работает. А также тогда это должен быть действительно посещаемый веб-сайт, но, возвращаясь к игре в Facebook, проблема все еще существует.

Обратите внимание, что вызов setItem преуспевает, просто он не возвращает ничего в последующем сеансе. (Так что это не нравится, когда пользователь является частным Просмотр, а сам вызов setItem терпит неудачу с ошибкой с превышением квоты.)

Что нам нужно сделать для поддержки Safari, чтобы наше приложение, работающее в Facebook, могло использовать localStorage, как предполагалось, где данные будут выживать между сеансами?

Ответы

Ответ 1

Я все еще жду ответа от Apple, но я уверен, что мы придерживаемся такого поведения. Поэтому ответ Анубхава является точным, но нам все еще нужно решение.

Итак, как работа, мы создали новые конечные точки на нашем сервере для сохранения/восстановления состояния игры. Мы используем это только для Safari, для всех других браузеров мы все еще сохраняем состояние игры в localStorage.

Для пользователя существует небольшое ограничение производительности. И небольшая стоимость сервера. Не сексуальное решение, но теперь наше приложение canvas для Facebook поддерживает Safari.

Ответ 2

Это либо ошибка в Safari, либо функция безопасности.

Вы посещаете FaceBook, а не свой сайт. Ваше приложение находится в iframe, которое нарушит модель безопасности, если она позволит вам читать любые данные из браузера. Подумайте, прочитал ли сайт конкурента данные, которые он сделал/не установил. Это будет представлять собой утечку информации.

Safari хорошо справляется с этой задачей.

В идеале, в режиме "Разрешить доступ к сайтам, которые я посещаю" ни один браузер не должен позволять iframes устанавливать данные в localStorage; даже если у каждого домена есть свои собственные хранилища-песочницы.

Что беспокоит меня, почему они даже позволяют вам писать в localStorage из iframe вообще (в режиме "Разрешить только для сайтов, которые я посещаю" )? На самом деле это может быть ошибка - атака с обманом информации, позволяющая сделать ошибку.

Я думаю, это потому, что исключения безопасности были исключены из localStorage в случае не-стороннего происхождения запроса. Таким образом, Safari, возможно, не будет вызывать ошибки, но пусть это будет терпеть неудачу (в некоторых случаях). Вероятно, почему ваш вызов setItem преуспевает.

На данный момент, с данной информацией, я подозреваю, сэр, вам не повезло из-за программистов Safari, следующих за в письме.