我正在使用 Buzztouch 为客户端制作移动应用程序,因此 html 页面不在应用程序内,它们是通过 JSON 从服务器加载的。
客户希望应用程序上有一个屏幕,用户可以在其中将详细信息输入时间表并将其存储在手机上。
我尝试使用 localStorage 来执行此操作,并设置了所有权限等,但在尝试读取或写入页面上的 localstorage 时出现以下错误:
“安全错误:无法从‘窗口’读取‘localStorage;属性:此文档的访问被拒绝。”
这是在运行 Android 版本 5 的 Asus Memopad 上。
以下是清单文件中的权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
以下是 webView 设置:
webView.getSettings().setDatabaseEnabled(true);
webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/");
webView.getSettings().setDomStorageEnabled(true);
我在运行 Android 2.3 版本的旧版 Android 平板电脑上尝试过完全相同的代码,但没有收到此错误,localStorage 工作正常。
我也在 iPhone 上尝试过,效果很好。
我什至尝试将代码复制到标准网页上,它在平板电脑上的浏览器中运行良好,但 webView 仍然不喜欢它。
我在网上查了好几个小时,到目前为止还没有找到解决方案。
有任何想法吗?
UPDATE:
这是一些 jQuery 代码,它的目的是检查本地存储是否可用,如果设置了则加载项目。
try {
if(typeof(Storage) !== "undefined") {
try {
if(localStorage.getItem("storage") !== null) {
storage = JSON.parse(localStorage.getItem("storage"));
}
} catch(e) {
$("#error").html($("#error").html() + " " + e + "<br>");
$("#error").css("display", "block");
}
} else {
$("#log").html("HTML5 Storage is not working.");
}
} catch(e) {
$("#error").html($("#error").html() + " " + e + "<br>");
$("#error").css("display", "block");
}
这就是加载时抛出错误的原因,因为它位于 $(document).ready 部分。