Iphone localStorage“QUOTA_EXCEEDED_ERR”问题

时间:2012-01-31 09:21:23

标签: iphone ios html5 local-storage

我尝试将HTML5(localStorage)中提供的客户端存储用于Iphone应用程序,我完全了解localStorage的“ QUOTA ”(目前 5MB < /强>)。

现在问题出在我的应用程序上(之前没有存储数据)。尝试将数据存储在localStorage中导致 QUOTA_EXCEEDED_ERR 虽然整体数据的大小小于5 MB(精确到~4.5b(在普通浏览器中使用chrome web inspector找到))

任何人都可以分享一下这个数据如何权衡4Kb导致 QUOTA_EXCEEDED_ERR 当相同 5MB的上限

请注意,问题仅针对iPhone 所有浏览器,甚至 iPhone模拟器也未提示QUOTA_EXCEEDED_ERR错误< / p> iPhone目前的图片是iPhone 4。

5 个答案:

答案 0 :(得分:28)

进入设置 - &gt; Safari并检查隐私浏览是否已启用。如果是,本地存储将无法存储任何内容。以下是为您检查本地存储的一些基本代码:

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

另外,你是如何设置它的?您使用localStorage.setItem(key, val)还是尝试localStorage(key, val)?您的问题可能来自设置不正确

答案 1 :(得分:19)

我遇到了同样的问题,而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;
  }
}

答案 2 :(得分:8)

事实是在Safari for iOS上使用隐私浏览模式&lt; 6不会清空window.localStoragewindow.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;
    }
};

我们必须信任Web API,但要非常小心。

答案 3 :(得分:3)

尝试在设置新值之前删除该值:

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

另见this question,因为它看起来很相似。

答案 4 :(得分:3)

本地存储配额与域绑定,如果您有其他页面使用数据存储,则可能会将其填满。当你得到异常时,迭代密钥以找出存储器中的什么。

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