新手跳坑指南《四十九》微信缓存

2017-01-10

问题描述:使用微信扫描二维码后,提示版本不足,需要升级至更高版本;

可能的原因:微信缓存:(建议使用一些方法来避开缓存问题,这点同学们可以自行研究,研究结果可以回复在这里)

解决方法:在手机内删除应用缓存数据;如何删除请百度搜索,安卓和ios是不同的;我个人是安卓机,删除应用缓存很简单;


假如不行,请删除应用缓存后,删除应用,重装应用;暂时未找到其他解决方案,假如你有,可以回复在这里;


附录:
微信开发需要注意的地方

这两天,在公司完善一个功能。可以说是手机版上的邀请好友功能。说白了就是一个简单的分销,邀请好友有佣金提成的。这个功能,同事已经做好PC版的了,手机版的没做。我就参考ta那个PC版,做了一个手机端,在微信上的。

做好之后,在本地测试,功能正常运行。在测试服务器上跑,也可以。但传到正式服务器,就运行不了。检查了好几次,代码没问题,并且在测试服务器测试,功能没问题。但是在正式服务器就是没法生成我需要的那段标识码。

后来,经过努力排查,发现在微信分享过去,也就是在手机端,微信点开的话,那个url会自动带一段微信的标识码,从而导致,我那个功能生成的标识码错误,功能无法正常运行。

然而,修改了这段bug之后,我以为可以了。但是在正式服务器再次测试,还是不行。调试了好久,后来跟同事探讨发现是微信的那个变态缓存原因。

最后,总结一下,记录这篇文章主要是为了说下微信开发需要注意的两点(而不是为了阐述技术细节)。

注意微信URL会自动带一段微信的标识
注意微信的缓存机制

以后在开发微信接口类功能,调试找Bug的时候,可以参考下这两方面来进行排查。


附录二:
浏览器缓存原理

浏览器缓存分为强缓存和协商缓存。

浏览器加载页面的简单流程如下:

  • 浏览器根据这个资源的header判断是否命中强缓存,若命中则直接加载本地缓存中的资源,不会发请求到服务器。

  • 若未命中强缓存,则浏览器会发送资源请求给服务器,服务器来判断浏览器本地缓存是否失效。若仍可使用,则服务器不会返回资源信息,浏览器继续从缓存中加载资源。

  • 若未命中协商缓存,则服务器会将完整的字眼返回给浏览器,浏览器加载新资源,并更新缓存。

强缓存

通过HTTP响应头中的Expires和Cache-Control来控制。Expires返回一个绝对时间,代表此资源的失效时间;而Cache-Control是相对时间,代表资源的有效期(秒)。两者可同时启用,但Cache-Control的优先级更高。若命中强缓存,在chrome开发者工具中可看到http的返回码是200,但size列会显示from cache。

协商缓存

浏览器将请求发送给服务器,服务器会根据HTTP请求头中的Last-Modify/If-Modify-Since或ETag/If-None-Match来判断是否命中协商缓存。若命中,则返回码为304,浏览器从缓存中加载资源。

Last-Modify/If-Modify-Since 浏览器第一次请求资源时,服务器返回头会加上Last-Modify,标识资源最后的修改时间,再次请求资源时,浏览器请求头会包含If-Modify-Since,其值为上次请求返回的Last-Modify,服务器根据资源的最后修改时间来判断是否命中缓存。

ETag/If-None-Match 返回的是一个校验码,ETag可保证每一个资源是唯一的,资源变化都会导致ETag变化。服务器根据浏览器请求头中的If-None-Match来判断是否命中缓存。

答疑
  • 既然有Cache-Control,为何还要使用Expires呢?
    答:因为Cache-Control在HTTP1.0中部分不支持。

  • 既然ETag的方式可以完全保证资源是否更新,那为何还需要使用Last-Modify的方式呢?
    答:出于性能考虑,生成ETag需要消耗服务器的资源。

ETag扩展说明

会根据文件大小,文件最后修改时间等因子来生成,理论上会重复,但是概率很小可以忽略。
在分布式系统中多台机器的文件必须保持Last-Modify一致,以免负载均衡的时候会导致比对失败;
在分布式系统中尽量关闭ETag,因为每台机器生成的ETag都不一样。

浏览器行为对缓存的影响
  • 当ctrl+F5强刷网页时,会跳过强缓存和协商缓存,直接从服务器加载;

  • 当f5刷新网页时,跳过强缓存,但是会检查协商缓存。




0
收藏