Проблема 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.
Ответы
Ответ 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 ) )
}
}