webview第二次加载带#的url 调用loadUrl()不会刷新的坑

最近在做项目的时候发现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;
}

你可能感兴趣的:(Android,webview,ios,android)