localStorage setItem在ipad上不起作用

在我的hydbrid应用程序(Phonegap)中,我试图以非常标准的方式写入localStorage:

window.localStorage.setItem("proDB", JSON.stringify(data)); 

要么

 window.localStorage["proDB"] = JSON.stringify(data); 

但它在iPad 2(iOS 7.1)上的Safari上不起作用。

它不起作用,整个应用程序停止。

这是ipad的userAgent: 在此处输入图像描述

你可以帮我吗 ?

谢谢

请检查您是否在Safari中启用了私人浏览function。 在Safari私密浏览模式下,您将获得零配额。 因此,对localStorage.setItem所有调用都将抛出超出配额的错误。 我个人认为这是Safari的一个巨大错误(正如许多网站所打破的那样),但它就是这样,所以我们必须找到解决方法。 我们可以这样做:

  1. 检测我们是否具有functionlocalStorage
  2. 如果没有,可以回到一些替代品。

如果你想要详细信息请继续阅读:)

1:检测function本地存储

我目前正在使用此代码来检测本地存储是否可用,如果不是,则回退到垫片:

 var DB; try { var x = '_localstorage_test_' + Date.now(); localStorage.setItem(x, x); var y = localStorage.getItem(x); localStorage.removeItem(x); if (x !== y) {throw new Error();} // check we get back what we stored DB = localStorage; // all fine } catch(e) { // no localstorage available, use shim DB = new MemoryStorage('my-app'); } 

编辑:自写这篇文章以来,我已经打包了function检测代码。 如果您使用的是NPM,则可以安装存储 –如下所示:

 npm install --save storage-available 

然后你可以在你的代码中使用它,如下所示:

 if (require('storage-available')('localStorage')) { // Yay! } else { // Awwww..... } 

2.回到垫片

一旦我们检测到问题,处理问题的最简单方法是回退到其他一些不会在每次写入时抛出错误的对象。

memorystorage是我编写的一个小库,它遵循Web Storage API,但只是将所有内容存储在内存中。 因为它使用相同的API,所以您可以将其用作localStorage的替代品,并且一切都将正常运行(尽管没有数据可以在页面重新加载后继续存在)。 它是开源的,所以请随意使用。

背景信息

有关MemoryStorage和此问题的更多信息,请阅读关于此主题的博客文章: MemoryStorage简介 。

我使用swift2.2通过以下逻辑设置了本地存储密钥值

 let jsStaring = "localStorage.setItem('Key', 'value')" self.webView.stringByEvaluatingJavaScriptFromString(jsStaring) 

你的第一个setItem示例是正确的。 我不相信你可以做第二个选项(localStorage [“someKey”] =“someValue”)。 坚持第一个。

你提到混合 – 它是PhoneGap还是其他一些框架? 应用程序中的哪个位置调用localStorage.setItem? 如果是PhoneGap,请确保在尝试访问localStorage之前先通过onDeviceReady加载了所有内容:

  

此外,如果应用程序冻结/停止工作,根据我的经验,这是因为代码中的某个位置正在访问未定义的对象。 也许通过检查localStorage是否未定义并记录它来尝试一些调试? 您是否100%确定“setItem”行是否失败? Console.log是你的朋友,certificate一下! 🙂

 if (localStorage === undefined) { console.log("oops, localStorage not initialized yet."); } else { window.localStorage.setItem("proDB", JSON.stringify(data)); console.log("localStorage available."); }