解决WebView写入localstorage但首次加载取不到值的问题

本文是解决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);
相关推荐
IT_Octopus12 小时前
IntelliJ 本地日志路径自定义:`-DLOG_PATH=./logs` 为什么总“不听话“
java·log4j·intellij-idea
长征coder13 小时前
【无标题】
java·性能优化
新时代牛马14 小时前
PCI与PCIe 硬件原理、配置空间/BAR 与 Linux 驱动完整篇:从 LTSSM、TLP 到 ECAM 与probe
java·linux·服务器
Bs_MoneyMagnet14 小时前
基于springboot+vue的医疗健康便民服务平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring
sunshine22 girl15 小时前
Java学习一 环境配置2 Idea的入门使用和maven配置,项目启动脚本配置
java·maven
有点。15 小时前
*C++哈夫曼树与哈夫曼编码
java·c++·servlet
bug总结16 小时前
uniapp vue3全局方法注册使用
前端·javascript·uni-app
CRMEB系统商城16 小时前
CRMEB标准版系统(Java)v3.1正式发布
java·spring·微信小程序·php·教育电商
写后端的胖头鱼16 小时前
【高频面试题】Java 基础类型 + 包装类 + String 互相转换
java·开发语言
weixin_4604435616 小时前
企业考试系统从.NET迁移到Java+Linux:数据库迁移、接口兼容与灰度切换实践
java·煤矿培训考试系统·煤矿在线考试系统·煤矿安全培训·煤矿考试系统·一人一档