最近在做项目的时候发现Android和IOS的webview重新加载都会存在这种情况。看log是已经跳转到相应url并且也加到堆栈中,但就是没有刷新
我们要做的是把链接http://127.0.0.1:10280/#/thirdApp?appId=1BA1AF9E8A955
经过原生拦截url之后再拼接authCode成为 http://127.0.0.1:10280/#/thirdApp?appId=1BA1AF9E8A955&authCode=2990 并且重新load,这时候发现网页地址改变但是并没有刷新页面,于是调用webView.reload()发现又对最初的链接做了跳转(我估计reload是去刷新堆栈顶部的链接)
为了让它正常刷新我也参考网上说的做了以下尝试:
webView.loadUrl(url);
webView.loadUrl("javascript:window.location.reload(true)");
或者
webView.loadUrl("javascript:window.location.replace(${url})");
发现都不生效,因为前面的路由地址(path)其实是没有改变的,浏览器认为他的hash地址没改变所以不会去刷新(不理解的话可以参考URL中#号的含义 - wanghetao - 博客园)
这时候有如下方案去解决:
1.让vue去监听后面query(H5管#后边叫query,而Android则是?后#前叫query,具体的uri规则大家不清楚的话可以参考 Uri详解之——Uri结构与代码提取 - 一点点征服 - 博客园 )的变化,vue的router就是这样的原理(这种做法咨询前端同学给的答复是可以实现,但是如果这个页面是来自三方的就不行)
2.请求参数(query)加上一个时间戳,强行请求新页面,参考如下代码:
/**
* 解析带#的链接,在前面的query处加上时间戳(解决webView只跳转不刷新问题)
* @param page 链接地址
* @return
*/
public static String parseRouter(String page) {
String pageUrl = null;
Uri uri = Uri.parse(page);
String fragment = uri.getFragment();
String query = uri.getQuery();
if (fragment != null) {
// 如果#后面的地址带问号(?) 就用&连接符
String connector = fragment.contains("?") ? "&" : "?";
if (query != null) {
pageUrl = page.substring(0, page.indexOf("#")) + "&time=" + System.currentTimeMillis() + "#" + fragment + connector;
} else {
pageUrl = page.substring(0, page.indexOf("#")) + "?time=" + System.currentTimeMillis() + "#" + fragment + connector;
}
}
return pageUrl;
}