Iphone localStorage“QUOTA_EXCEEDED_ERR”问题

Posted

技术标签:

【中文标题】Iphone localStorage“QUOTA_EXCEEDED_ERR”问题【英文标题】:Iphone localStorage "QUOTA_EXCEEDED_ERR" issue 【发布时间】:2012-02-23 00:40:23 【问题描述】:

我尝试将 html5 (localStorage) 中可用的客户端存储用于 Iphone Application ,并且我完全了解与 localStorage 关联的“QUOTA”(当前为 5MB)。

现在问题出在我的应用程序上(以前没有存储数据)。尝试将数据存储在 localStorage 会导致 QUOTA_EXCEEDED_ERR,尽管整体数据的大小小于 5 MB(准确地说约为 4Kb(在普通浏览器中使用 chrome Web 检查器找到))

任何人都可以分享一些关于数据重 4Kb 是如何导致 QUOTA_EXCEEDED_ERR 的上限时相同 5MB

请注意,此问题仅适用于 iPhone所有浏览器,甚至 iPhone 模拟器 都不会提示 QUOTA_EXCEEDED_ERR 错误

iPhone 当前图片是 iPhone 4。

【问题讨论】:

进一步调查发现上述错误不会在 iPhone 3S 中重现。所以看来 iPhone 4 的 ios 有问题。但是有些东西让我不相信这一点,因为谷歌在上面提到的 iPhone 4 中使用 localStorage for gmail 工作正常,所以如果 iPhone 4 的 iOS 出现问题,那么 localStorage 如何为 gmail 工作。任何人都可以分享这一点。 粘贴导致上述错误的代码 在下面查看我的答案。可能是您的手机启用了隐私浏览,或者您使用了错误的本地存储设置器 使用a feature detect that tests for this specific issue。如果存储不可用,请考虑使用 memoryStorage 填充 localStorage。 免责声明:我是链接包的作者 【参考方案1】:

我遇到了同样的问题,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】:

事实是,在 iOS 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;
    
;

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

【讨论】:

【参考方案3】:

进入设置->Safari 并检查隐私浏览是否开启。如果是,本地存储将无法存储任何内容。下面是一些检查本地存储的基本代码:

if (!!window.localStorage) 

    localStorage.setItem(key, val);
;

还有,你是怎么设置的?您是使用localStorage.setItem(key, val),还是尝试localStorage(key, val)?您的问题可能来自设置不正确

【讨论】:

,是的,你是对的,问题是在 iPhone 中启用了隐私浏览,禁用它工作正常,但可以分享一些关于为什么在启用隐私浏览的模拟器中同样的工作以及 localStorage 如何适用于 Gmail在 iPhone 上,即使在“启用”中进行私人浏览,无论如何,但答案确实有效,感谢您的帮助 哇,非常感谢这个答案,我永远不会朝这个方向看! 你说得对,localStorage 无法在 Safari 私有模式下存储任何内容,但代码 sn-p 无法检测到这一点。 window.localStorage 即使在 Safari 处于私有模式时也会返回一个 Storage 对象。 在使用 iphone 4s 和移动 safari(无隐私浏览)时看到相同的行为。不能设置超过 2.5MB 的任何内容。不知道是什么原因造成的,使用库:amplifyjs.com/api/store【参考方案4】:

本地存储配额与域相关,如果您有其他页面使用数据存储,它们可能会填满它。当您遇到异常时,迭代这些键以找出存储中的内容。

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

【讨论】:

@Temmu ,实际上并不是试图在空的 localStorage 上存储一个简单的键值对(第一次像这样) localStorage.setItem("error","QUOTA_EXCEEDED_ERR") 结果在上面错误肯定存储的值远小于5MB甚至4KB 我的意思是,可能有一些其他页面或 web 应用程序来自同一个域,而不是您的应用程序以及正在填充存储空间的其他应用程序。 @Temmu ,应用程序中实现 localStorage 的唯一页面【参考方案5】:

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

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

另请参阅this question,因为它看起来很相似。

【讨论】:

除此之外还有其他解决方案

以上是关于Iphone localStorage“QUOTA_EXCEEDED_ERR”问题的主要内容,如果未能解决你的问题,请参考以下文章

localStorage UIWebView iPhone / iPad 保存或读取不起作用.. 有时?

LocalStorage 在带有 os 10 的 iphone/ipad 中无法正常工作

PhoneGap 的 LocalStorage 限制

quota 详解---quota 是什么

quota 详解---quota 是什么

linux 磁盘配额(quota)