Iphone localStorage "QUOTA_EXCEEDED_ERR" проблема - PullRequest
20 голосов
/ 31 января 2012

Я пытаюсь использовать клиентское хранилище, доступное в HTML5 (localStorage) для приложения Iphone, и я полностью осведомлен о « QUOTA », связанном с localStorage (который в настоящее время 5MB ).

Теперь проблема для моего приложения (данные ранее не хранились).попытка сохранить данные в localStorage приводит к QUOTA_EXCEEDED_ERR , хотя размер общих данных составляет менее 5 МБ (точнее ~ 4 КБ (можно найти с помощью веб-инспектора chrome в обычном браузере))

Может ли кто-нибудь поделиться каким-то осмыслением того, что, как данные весят 4 КБ, приводит к QUOTA_EXCEEDED_ERR , когда верхний предел для того же 5 МБ

Обратите внимание, что проблема происходит только для iPhone , для всех браузеров и даже iPhone Simulator не выдает сообщение об ошибке QUOTA_EXCEEDED_ERR

iPhone в данный момент является изображениемiPhone 4.

Ответы [ 5 ]

28 голосов
/ 17 февраля 2012

Зайдите в Настройки-> Safari и проверьте, включен ли приватный просмотр.Если это так, локальное хранилище не сможет ничего хранить.Вот некоторый базовый код для проверки локального хранилища:

if (!!window.localStorage) 
{
    localStorage.setItem(key, val);
};

Кроме того, как вы его настраиваете?Вы используете localStorage.setItem(key, val) или пытаетесь localStorage(key, val)?Возможно, проблема связана с неправильной настройкой

19 голосов
/ 19 октября 2012

У меня была та же проблема, и JoeCortopassi только отчасти прав: это вызвано включенным приватным просмотром.Код, приведенный в этом ответе, не сильно помогает.При тестировании на iPad Safari (ios5) я получил

console.log(!!window.localStorage); // true

. Как только я пытаюсь установить значение, я получаю исключение:

localStorage.setItem("test", "test") // Exception 22 is thrown

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

var localStorageSupported = function() {
  try {
    localStorage.setItem("test", "test");
    localStorage.removeItem("test");
    return true;
  } catch(e){
    return false;
  }
}
8 голосов
/ 15 марта 2013

Дело в том, что использование режима приватного просмотра в Safari для iOS <6 не приводит к пустым значениям <code>window.localStorage и window.sessionStorage, и поэтому проверки !!window.localStorage или !!window.sessionStorage будет недостаточно, и все, что вы вызываете из этих компонентов просто потерпит неудачу, выдав эту QUOTA_EXCEEDED_ERR ошибку.

На этих платформах частный режим, похоже, устанавливает квоту на ноль. Вот почему, чтобы действительно протестировать эти функции, так же, как это делает Modernizr, вам придется заключить его в оператор try ... catch.

Модернизр код:

var mod = 'modernizr';
/*...*/
tests['localstorage'] = function() {
    try {
        localStorage.setItem(mod, mod);
        localStorage.removeItem(mod);
        return true;
    } catch(e) {
        return false;
    }
};

Мы должны доверять веб-API, но достаточно осторожно.

3 голосов
/ 15 февраля 2012

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

try {
   // try to insert storage here
} catch ( err ) {
   for ( var i =0; i < storage.length ; i++ ) {
       console.log ( storage.key( i ) )
    }
}
3 голосов
/ 31 января 2012

Попробуйте удалить значение перед установкой нового:

localStorage.removeItem(key);
localStorage.setItem(key, val);

См. Также этот вопрос , как он выглядит аналогично.

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