我正在使用Buzztouch为客户制作移动应用程序,因此html页面不在应用程序中,它们是通过JSON从服务器加载的。
客户希望在应用程序上有一个屏幕,用户可以在其中输入时间表中的详细信息并将其存储在手机上。
我正在尝试使用localStorage执行此操作,并设置了所有权限等,但在尝试读取或写入页面上的localstorage时出现以下错误:
“SecurityError:无法从'Window'读取'localStorage;属性:此文档拒绝访问。”
这是在运行Android版本5的华硕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平板电脑上尝试了完全相同的代码,运行Android版本2.3,我没有收到此错误,localStorage工作正常。
我也尝试使用iPhone,但效果很好。
我甚至尝试将代码复制到标准网页上,它在平板电脑上的浏览器中运行良好,但webView仍然不喜欢它。
我在网上看了几个小时,到目前为止我还没有找到解决办法。
有什么想法吗?
更新
以下是一些jQuery代码,它用于检查localstorage是否可用,并在项目设置时加载。
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部分。
答案 0 :(得分:0)
此错误实际上不是由于缺少任何Java端权限,而是由于新WebView版本的Web安全模型的改进。在没有看到实际代码的情况下很难说出应用程序出错了什么,但我的猜测是你可能试图从不同来源的页面访问localStorage。例如。如果您使用loadData
作为初始页面,然后从服务器加载其他部分,则该代码可能具有不同的来源。
答案 1 :(得分:0)
我终于设法解决了这个问题。
无论我尝试什么,我能让它工作的唯一方法是在应用程序中包含html文件,而不是通过Buzztouch的控制面板进行,并加载它。
此html文件现在正确加载且没有localStorage错误。