以前在作一个微信游戏宣传页的时候,要调用长按识别二维码的功能,但作的过程当中遇到了两三个坑,后来稍微深刻探究了下。html
如下实测在iOS 版(iPhone)微信2.2 中有此bug,安卓版微信暂时没有发现有此bug。建议看下面的内容前先看这篇文章。前端
“众所周知”,在一些使用在微信内置浏览器的页面上要调用其长按识别二维码的功能,须要将二维码图片单独切出,img 标签形式展示。长按识别二维码 的原理Jeff 不甚了解,但却发现其有一个实际可识别区域上移的bug:对于二维码区域,实际可识别区域是总体上移64px,64px 的偏移量与二维码大小自己无关。git
下面是一个重现bug 的Demo 页面,请用iPhone 版微信扫描:github
红色的色块区域是我单独为了定位区域而写的,不是在二维码自己(具体能够查看上面Demo 的源代码),用手指长按你能够看到实际可识别二维码区域为红色部分:即总体可识别区域上移了64px,而往下拉看到不一样大小的二维码你会发现这个64px 的偏移量与二维码自己大小无关。友情提示:你能够用小拇指在边界区域长按以确认。浏览器
为何是神秘的64px 偏移量?答案是:64px 正好是微信内置浏览器标题栏+系统标题栏的高度。能够猜想的是,微信客户端在识别二维码的时候忽略了微信标题栏+系统状态栏的高度。微信
后来进一步排查的时候,发现二维码大到必定程度就没有“识别上移”的诡异现象了,大概是二维码大小在400px 以上的时候就没有(固然,这个是在iPad 版微信上测出来的),具体能够查看下面这个Demo 页面:测试
通过某种渠道与微信 iOS 开发人员的反馈沟通,肯定是微信的 bug,也的确是这个64px 的问题;据他们的说法目前已经修复,但可否在下一个版本中加入么,就不得而知了。url
解决方案的话有两个:spa
1)经过img增长padding 增大可接触面积;这个须要微调。code
2)为二维码图片自己增长透明底部背景,这也是咱们团队采用的方案。相似下图的样子,前端上用户是看不到的;但有个缺点就是若是用户保存二维码后则不是那么好看。
小标题说的“同一屏幕视窗”是指微信内置浏览器中在当前的手机屏幕上显示的可见范围,咱们发现,当同一同一屏幕视窗中存在两个或以上的二维码的时候,微信客户端就会识别错误,不管你按哪一个二维码长按识别,识别出来都是同一个目标。这个问题在iOS 版(iPhone)微信2.2及安卓版上均有之。
下面是一个演示Demo 页面,请用目标手机(iPhone 或安卓机上)微信扫描访问,而后长按识别二维码:
该页面一共有六个二维码,两两分组为三组,每组的二维码的信息分别是指向qq.com、baidu.com 的url。为了保证每次只有一组二维码在当前屏幕可视范围,页面特地将每组二维码距离拉得很大。每次请保持只有一组二维码在你当前屏幕范围内,而后请依次长按识别二维码。你会发现不管不管你按哪一个二维码长按识别,识别出来都是同一个目标。
而后再尝试最后一组二维码,尝试经过滚动页面使得某个二维码不在你的屏幕可见范围,再执行长按识别二维码。
经过上面的Demo 页面,其实咱们能够猜想微信中长按识别二维码的运行原理,就是你长按的时候至关于将当前手机屏幕截屏,识别截屏后的图片,这样一张图片有两个二维码图的时候固然只会识别出一个。顺着这个思路也能够解释上述坑一,由于截屏的图片固然包括了系统状态栏那部分,也就不难理解为何会有“识别上移”的诡异现象了。
解决方案的话就是不要将两个二维码共存在同一个页面中。
这个是后来偶然发现出来的,屡次执行长按二维码的功能会致使手机(iPhone)变卡。以前我作测试的时候也发现,屡次测试后竟然右键都识别出来是二维码图片(即没有出现“识别二维码”的按钮)。
原文发表于:http://devework.com/weixin-qrcode-bug2.html 略有修改。