Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【长期】微信浏览器相关兼容性问题 #3

Open
zhongxia245 opened this issue Aug 12, 2019 · 3 comments
Open

【长期】微信浏览器相关兼容性问题 #3

zhongxia245 opened this issue Aug 12, 2019 · 3 comments
Labels

Comments

@zhongxia245
Copy link
Owner

zhongxia245 commented Aug 12, 2019

做H5页面,最经常的投放渠道就是自己 APP 的 Webview 和 微信渠道了,微信浏览器呢,又存在一些兼容性问题,需要注意下。 这里记录一下微信浏览器相关的兼容性问题。

@zhongxia245
Copy link
Owner Author

zhongxia245 commented Aug 12, 2019

2019-08-12 15:31:16

微信浏览器页面返回不刷新的问题

现象

业务流程如下:
下单页面a => 支付页面b (第三方) => 支付成功,返回下单页面a ,a 根据接口返回数据,更改订单状态。

存在的问题?
因为支付页面 b 使用 history.go(-n) (n动态计算出来的) 的方式返回跳转支付的那个页面。

返回 页面 a 后,发现订单状态还是未支付状态。 原因是微信浏览器缓存问题,导致页面没有刷新

问题原因

因为微信内置的 webview 做了缓存的处理(IOS,Android 缓存的效果还不一样)。

没有找到微信浏览器具体的缓存机制是什么样的

测试 DEMO地址:https://wechat-history-demo.izhongxia.now.sh/
但是经一番测试发现以下结论(测试机型较少,不保证所有机型都这样)

方式 IOS Android
history.go / history.back 不执行 JS,因此也不重新请求接口 执行 JS,但GET 接口被缓存
location.replace 执行 JS,接口没有缓存 执行 JS,接口没有缓存

微信版本 7.0.5
IOS 测试机型: Iphone7 / 12.3.1
Android 测试机型:一加手机,型号忘记了

解决方案

使用 location.replace 代替 history.back 和 history.go 。

如果是物理按键的返回,目前没有想到好的办法,有待研究下

@zhongxia245
Copy link
Owner Author

解决微信浏览器缓存问题

现象

用户打开页面,看到的还是老版本的页面内容

原因

因为微信浏览器缓存的问题,因此用户再次打开页面,加载的还是早期缓存下来的js 和 css。(这里可能代码报错,因为数据接口返回数据变了)

解决方案

  1. 给静态资源文件名加上 hash 值
  2. html 文件也可能被缓存,因此需要在 nginx 里面对 html 文件加上不可被缓存 {expires-1;}的配置

这篇文章写了很多尝试后不可行的点子,以及最终的解决方案,有兴趣可以看下 《简书-我想转行之----微信浏览器缓存》

@zhongxia245
Copy link
Owner Author

zhongxia245 commented Nov 12, 2019

android 微信浏览器内 location.reload 缓存问题

场景是这样的,调用接口后刷新页面,使用 location.reload() 页面。
在 android 微信浏览器内,虽然页面刷新了,但是 JS 代码不重新执行。 猜测是微信缓存问题,经常一段查找,找到下面这个解决方案。

在 android vivo 手机内测试过,没有问题, IOS微信浏览器 本身没问题,不做处理

/**
 * 页面刷新
 * FIX: android 微信浏览器内,location.reload 不起作用
 */
export const reloadPage = () => {
  if (is.android() && INAPP.weixin) {
    let href = window.location.pathname + window.location.search
    let hasQuery = href.indexOf('?') > 0
    href += (hasQuery ? '&' : '?') + 't=' + new Date().getTime()
    href += window.location.hash
    window.location.replace(href)
  } else {
    window.location.reload()
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant