我有一个非常基本的webview应用程序代码:
package com.budget.noname.budget;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String data = "<p id='v'></p><script>x=3; y=5; m=0; document.getElementById('v').innerHTML = m;</script>";
WebView simpleWebView=(WebView) findViewById(R.id.simpleWebView);
WebSettings webSettings = simpleWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setAllowContentAccess(true);
webSettings.setAllowFileAccess(true);
webSettings.setDomStorageEnabled(true);
//simpleWebView.loadUrl("file:///android_asset/index.htm");
simpleWebView.loadDataWithBaseURL(null, data, "text/html", "UTF-8", "");
}
}
如果我将我的webapp(index.htm)放在assets文件夹中并加载它,它可以很好地工作,但我的代码可供任何关心提取.apk的人使用。
我试图将代码粘贴到String上并使用loadDataWithBaseURL加载它。它几乎也有效。问题是:如果我尝试访问localStorage,代码就会中断。那是为什么?
示例:
String data = "<script>x=localStorage.getItem('name');</script>";
不起作用!!!虽然,正如我所说,如果我从资源文件夹加载相同的代码,它的工作原理。
答案 0 :(得分:2)
就像已经stated here before:
只允许在某些网页上访问
localStorage
"Web-safe"
计划,例如http:
,https:
和file:
。它不起作用 例如about:
和data:
方案,或任何自定义方案 可能正在使用。
如果您查看the loadDataWithBaseURL()
's docs,我们可以看到baseUrl
param的以下声明:
字符串:用作网页基本网址的网址。如果
null
默认为 &#39;about:blank
&#39;
这解释了为什么只有您的file:///
示例有效,并且还意味着您必须将有效内容传递给此参数。您可以加载所需的任何URL,例如:
webView.loadDataWithBaseURL("http://google.com", data, "text/html", "UTF-8", "");
甚至http://localhost:80
也会让它发挥作用。
但是,这不会使localStorage
值可用于WebView
的其他实例(默认情况下,它们不会在Android上进行对话)。一个常见的选择是使用另一个为您抽象的库,例如AndroidLocalStorage,例如