Подтвердить что ты не робот

Проблема Iphone localStorage "QUOTA_EXCEEDED_ERR"

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

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

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

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

iPhone в настоящее время - это iPhone 4.

4b9b3361

Ответ 1

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

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

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

Ответ 2

У меня была такая же проблема, и 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;
  }
}

Ответ 3

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

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

Код Modernizr:

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

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

Ответ 4

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

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

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

Ответ 5

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

try {
   // try to insert storage here
} catch ( err ) {
   for ( var i =0; i < storage.length ; i++ ) {
       console.log ( storage.key( i ) )
    }
}