本文是解决Android写localstorage的问题。
在android中,native经常需要和h5页面进行交互,比如将本地token写入h5,然后h5中的js获取token进行api请求。
写入localstorage的方法很标准,即在webview的onPageFinished中注入并调用一段js即可。
java
viewBinding.webViewHide.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
viewBinding.webViewHide.evaluateJavascript("window.localStorage.setItem('Authorization','" + WXApp.getInstance.tokenValue + "');", null);
viewBinding.webViewHide.evaluateJavascript("window.localStorage.setItem('userid','" + WXApp.getInstance.userId + "');", null);
viewBinding.webViewHide.evaluateJavascript("window.localStorage.setItem('Tenant-Id','" + WXApp.getInstance.schoolId + "');", null);
}
});
但是这样做有个问题,就是dom数据注入是在页面加载完毕之后进行,而页面加载完毕,页面中的js也就基本执行完毕了,所以页面中原有的js执行获取数据是获取不到的。
一种解决方法就是在h5内判断token是否为空,如果是则重新刷新页面。因为token为空是在首次加载页面时发生的,所以也只有在首次加载页面时会重新刷新,只有首次加载页面成功,写入localstorage,后面获取localstorage都不会失败了。
componentWillMount() {
if (token === null) {
token = localStorage.getItem("token")
if (token === null) {
window.location.reload()
}
}
}
还有一种方法就是加载页面前,隐式的创建一个webview并访问目标根url,将localstorage预先写入。注意,根目标url一定要以/结尾,比如 http://www.a.com/
java
private void hideWebView(){
WebSettings settings = viewBinding.webViewHide.getSettings();
// 启用LocalStorage
settings.setDomStorageEnabled(true);
settings.setDatabaseEnabled(true);
settings.setJavaScriptEnabled(true);//允许使用jst
viewBinding.webViewHide.loadUrl(mUrl);
viewBinding.webViewHide.setWebViewClient(new WebViewClient() {
public void onFormResubmission(WebView paramAnonymousWebView, Message paramAnonymousMessage1, Message paramAnonymousMessage2) {
paramAnonymousMessage2.sendToTarget();
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
viewBinding.webViewHide.evaluateJavascript("window.localStorage.setItem('Authorization','" + WXApp.getInstance.tokenValue + "');", null);
viewBinding.webViewHide.evaluateJavascript("window.localStorage.setItem('userid','" + WXApp.getInstance.userId + "');", null);
viewBinding.webViewHide.evaluateJavascript("window.localStorage.setItem('Tenant-Id','" + WXApp.getInstance.schoolId + "');", null);
initWebView();
}
});
}
还有一个问题,js注入数据之后,页面空白,
启用LocalStorage
java
settings.setDomStorageEnabled(true);