HTML5 localStorage.setItem не работает на iOS 8 — Safari для мобильных устройств

localStorage.setItem не работает на мобильной версии iOS 8.3.

Кто-нибудь сталкивался с этой проблемой?
Вот код:

var storage = window.localStorage;
storage.setItem('test',45);
alert(storage.getItem('test'));

person Mandy    schedule 05.05.2015    source источник


Ответы (2)


Раньше мы могли использовать что-то вроде:

if ('localStorage' in window && window.localStorage !== null) {
    alert('can use');
}else{
    alert('cannot use');
}

or

if (localStorage === undefined) {... }

Однако в iOS 8.3+, когда пользователь отключает файлы cookie, этот код выдает необработанную ошибку JavaScript. А когда пользователь переходит в режим приватного просмотра, такое же сообщение об ошибке появляется при попытке записи в localStorage.

SecurityError: DOM Exception 18: была предпринята попытка нарушить политику безопасности пользовательского агента.



Временное решение

Чтобы избежать нежелательных ошибок JavaScript из-за этого конкретного поведения iOS, одно из предложений состоит в том, чтобы заключить его в блоки try catch. (по крайней мере пока)

try{
  if ('localStorage' in window && window.localStorage !== null) {
    localStorage.setItem('testLocalStorage', 'testLocalStorage');
    if (localStorage.getItem('testLocalStorage') !== 'testLocalStorage') {
        localStorage.removeItem('testLocalStorage');
        //for private browsing, error is thrown before even getting here
        alert('can read CANNOT write'); 
    }else{
        localStorage.removeItem('testLocalStorage');
        alert('can use');
    }
  }else{
    alert('CANNOT use');
  }
}catch(ex){
  alert('CANNOT use reliably');
}

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



Возможная краткая форма

try {
    localStorage.setItem('testLocalStorage', 'testLocalStorage');
    localStorage.removeItem('testLocalStorage');
    alert('supported');
} catch(ex) {
    alert('unsupported');
}



Что мы можем использовать вместо этого

Для сценариев, в которых localStorage не поддерживается, возможные альтернативы включают сеансы сервера (на основе параметров URL-адреса, если файлы cookie не поддерживаются) или переменную window.name для хранения сериализованных данных.

Или, если вы проектируете и создаете одностраничное приложение, возможно, вам вообще не нужно хранить данные в глобальном пространстве имен.

person J Little    schedule 20.09.2016

Вы должны проверить, доступен ли localStorage с помощью кода, подобного if ('localStorage' in window && window.localStorage !== null) { ..., прежде чем использовать его.

person Christophe Roussy    schedule 05.05.2015
comment
Я хочу решить проблему, чтобы не избежать ее. Есть ли аналогичная функция для замены localStorage? - person Mandy; 06.05.2015
comment
Я не эксперт по сафари на ios, может куки? - person Christophe Roussy; 06.05.2015
comment
@Mandy Проверьте это - stackoverflow. com/questions/13208878/ - person griffon vulture; 07.05.2015