HTML5 localStorage 无法在 Android WebView 上运行
HTML5 localStorage not working on Android WebView
我正在使用 Buzztouch 为客户制作移动应用程序,因此 html 页面不在应用程序中,它们是通过 JSON 从服务器加载的.
客户希望在应用程序上有一个屏幕,用户可以在其中将详细信息输入时间表并将其存储在 phone。
我正在尝试使用 localStorage 执行此操作,并已设置所有权限等,但在尝试读取或写入页面上的 localstorage 时出现以下错误:
"SecurityError: Failed to read the 'localStorage; property from 'Window': Access is denied for this document."
这是华硕 Memopad 运行 Android 版本 5.
清单文件中的权限如下:
<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代码,它的目的是检查本地存储是否可用,如果已设置则载入一个项目。
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 部分。
这个错误实际上不是由于缺少任何 Java 端权限造成的,这是由于较新的 WebView 版本改进了网络安全模型。在没有看到实际代码的情况下很难判断应用程序出了什么问题,但我的猜测是您可能正试图从不同来源的页面访问 localStorage。例如。如果您使用 loadData
作为初始页面,然后从服务器加载其他部分,则该代码可能有不同的来源。
我终于解决了这个问题。
无论我尝试过什么,我让它工作的唯一方法是将 html 文件包含在应用程序中,而不是通过 Buzztouch 的控制面板进行操作,然后将其加载。
此 html 文件现在可以正确加载并且没有 localStorage 错误。
我正在使用 Buzztouch 为客户制作移动应用程序,因此 html 页面不在应用程序中,它们是通过 JSON 从服务器加载的.
客户希望在应用程序上有一个屏幕,用户可以在其中将详细信息输入时间表并将其存储在 phone。
我正在尝试使用 localStorage 执行此操作,并已设置所有权限等,但在尝试读取或写入页面上的 localstorage 时出现以下错误:
"SecurityError: Failed to read the 'localStorage; property from 'Window': Access is denied for this document."
这是华硕 Memopad 运行 Android 版本 5.
清单文件中的权限如下:
<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代码,它的目的是检查本地存储是否可用,如果已设置则载入一个项目。
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 部分。
这个错误实际上不是由于缺少任何 Java 端权限造成的,这是由于较新的 WebView 版本改进了网络安全模型。在没有看到实际代码的情况下很难判断应用程序出了什么问题,但我的猜测是您可能正试图从不同来源的页面访问 localStorage。例如。如果您使用 loadData
作为初始页面,然后从服务器加载其他部分,则该代码可能有不同的来源。
我终于解决了这个问题。
无论我尝试过什么,我让它工作的唯一方法是将 html 文件包含在应用程序中,而不是通过 Buzztouch 的控制面板进行操作,然后将其加载。
此 html 文件现在可以正确加载并且没有 localStorage 错误。