在我的hydbrid应用程序(Phonegap)中,我试图以非常标准的方式写入localStorage:
window.localStorage.setItem("proDB", JSON.stringify(data));
或
window.localStorage["proDB"] = JSON.stringify(data);
但它在iPad 2(iOS 7.1)上的Safari上不起作用。
它不起作用,整个应用停止。
以下是此ipad的userAgent:
你能帮助我吗?
由于
答案 0 :(得分:8)
请检查您是否在Safari中启用了私人浏览功能。在Safari私密浏览模式下,您获得的配额为零。因此,对localStorage.setItem
的所有调用都将超出配额错误。我个人认为这是Safari的一个巨大错误(正如许多网站所打破的那样),但它就是这样,所以我们必须找到解决方法。我们可以通过以下方式实现:
如果您需要详细信息,请继续阅读:)
1:检测功能性本地存储
我目前正在使用此代码来检测本地存储是否可用,如果不是,则回退到垫片:
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');
}
编辑:自写这篇文章以来,我已经打包了功能检测代码。如果您使用的是NPM,可以安装 storage-available ,如下所示:
npm install --save storage-available
然后你可以在你的代码中使用它:
if (require('storage-available')('localStorage')) {
// Yay!
}
else {
// Awwww.....
}
<强> 2。回到垫片
一旦我们检测到问题,处理问题的最简单方法是回退到其他一些不会在每次写入时都抛出错误的对象。
memorystorage 是我在Web Storage API之后编写的一个小库,但只是将所有内容存储在内存中。因为它使用相同的API,所以您可以将它用作localStorage的替代品,并且一切都将正常运行(尽管没有数据可以在页面重新加载后继续存在)。它是开源的,所以请随意使用。
背景信息
有关MemoryStorage和一般此问题的详细信息,请阅读关于此主题的博文:Introducing MemoryStorage。
答案 1 :(得分:0)
我使用swift2.2
通过以下逻辑设置了本地存储密钥值let jsStaring = "localStorage.setItem('Key', 'value')"
self.webView.stringByEvaluatingJavaScriptFromString(jsStaring)
答案 2 :(得分:-1)
您的第一个setItem示例是正确的。我不相信你可以做第二个选项(localStorage [“someKey”] =“someValue”)。坚持第一个。
你提到混合 - 它是PhoneGap还是其他一些框架?应用程序中的哪个位置调用localStorage.setItem?如果是PhoneGap,请确保在尝试访问localStorage之前先通过onDeviceReady加载了所有内容:
<script type="text/javascript">
// Wait for PhoneGap to load
document.addEventListener("deviceready", onDeviceReady, false);
// PhoneGap is ready
function onDeviceReady() {
window.localStorage.setItem("key", "value");
}
</script>
此外,如果应用程序冻结/停止工作,根据我的经验,这是因为代码中某处您正在访问未定义的对象。也许通过检查localStorage是否未定义并记录它来尝试一些调试?您是否100%确定“setItem”行是否失败? Console.log是你的朋友,证明一下! :)
if (localStorage === undefined) {
console.log("oops, localStorage not initialized yet.");
}
else {
window.localStorage.setItem("proDB", JSON.stringify(data));
console.log("localStorage available.");
}