当前位置: 首页 > news >正文

微信内置浏览器 长按识别二维码 功能的两三个坑与解决方案

这篇文章是上一篇的延伸与总结,做的一个微信游戏宣传页上要调用长按识别二维码的功能,做的过程中遇到了两个坑,后来在组里分享会上分享了入坑经历,然后再度发现一个坑。本文就是在分享会上发言总结而成。

坑一:iOS 版微信长按识别二维码无法正常识别的bug

以下实测在iOS 版(iPhone)微信2.2 中有此bug,安卓版微信暂时没有发现有此bug。 “众所周知”,在一些使用在微信内置浏览器的页面上要调用其长按识别二维码的功能,需要将二维码图片单独切出,img 标签形式展现。长按识别二维码 的原理Jeff 不甚了解,但却发现其有一个实际可识别区域上移的bug: 对于二维码区域,实际可识别区域是整体上移64px,64px 的偏移量与二维码大小本身无关

下面是一个重现bug 的Demo页面,请用iPhone 版微信扫描:


红色的色块区域是我单独为了定位区域而写的,不是在二维码本身(具体可以查看上面Demo 的源代码),用手指长按你可以看到实际可识别二维码区域为红色部分:即整体可识别区域上移了64px,而往下拉看到不同大小的二维码你会发现这个64px 的偏移量与二维码本身大小无关。友情提示:你可以用小拇指在边界区域长按以确认。


为什么是神秘的64px 偏移量?答案是:64px 正好是微信内置浏览器标题栏+系统标题栏的高度。可以猜测的是,微信客户端在识别二维码的时候忽略了微信标题栏+系统状态栏的高度。

后来进一步排查的时候,发现二维码大到一定程度就没有“识别上移”的诡异现象了,大概是二维码大小在400px 以上的时候就没有(当然,这个是在iPad 版微信上测出来的),具体可以查看下面这个Demo页面:


人在微信实习,所以后面经过与微信 iOS 开发人员的反馈沟通,确定是微信的 bug,也的确是这个64px 的问题;据他们的说法目前已经修复,但能否在下一个版本中加入么,就不得而知了。

解决方案的话有两个:

1)通过img增加padding 增大可接触面积;这个需要微调。

2)为二维码图片本身增加透明底部背景,这也是我们团队采用的方案。类似下图的样子,前端上用户是看不到的;但有个缺点就是如果用户保存二维码后则不是那么好看。

坑二:两(多)张两张二维码无法在同一屏幕视窗中共存

小标题说的“同一屏幕视窗”是指微信内置浏览器中在当前的手机屏幕上显示的可见范围,我们发现,当同一同一屏幕视窗中存在两个或以上的二维码的时候,微信客户端就会识别错误,无论你按哪个二维码长按识别,识别出来都是同一个目标。这个问题在iOS 版(iPhone)微信2.2及安卓版上均有之。

下面是一个演示Demo页面,请用目标手机(iPhone 或安卓机上)微信扫描访问,然后长按识别二维码:


该页面一共有六个二维码,两两分组为三组,每组的二维码的信息分别是指向qq.com、baidu.com 的url。为了保证每次只有一组二维码在当前屏幕可视范围,页面特意将每组二维码距离拉得很大。每次请保持只有一组二维码在你当前屏幕范围内,然后请依次 长按识别二维码。你会发现无论无论你按哪个二维码长按识别,识别出来都是同一个目标。

然后再尝试最后一组二维码,尝试通过滚动页面使得某个二维码不在你的屏幕可见范围,再执行长按识别二维码。

通过上面的Demo 页面,其实我们可以猜测微信中长按识别二维码的运行原理,就是你长按的时候相当于将当前手机屏幕截屏,识别截屏后的图片,这样一张图片有两个二维码图的时 候当然只会识别出一个。顺着这个思路也可以解释上述坑一,因为截屏的图片当然包括了系统状态栏那部分,也就不难理解为什么会有“识别上移”的诡异现象了。

解决方案的话就是不要将两个二维码共存在同一个页面中。

坑三:多次执行长按二维码的功能会导致内存泄露,手机会变卡

多次执行长按二维码的功能会导致手机(iPhone)变卡。之前我做测试的时候也发现,多次测试后居然右键都识别出来是二维码图片(即没有出现“识别二维码”的按钮)。


http://www.xdnf.cn/news/836371.html

相关文章:

  • Apache学习之二、HTTPD的负载均衡
  • 一文带你了解SLB、F5、Nginx负载均衡
  • 工作流设计参考(包括PHP实现)
  • Android Studio CPU 性能剖析器
  • WIN7无线经常断线-间歇性地掉线-解决方法
  • VC6.0详细教程
  • 炒股入门与技巧
  • contos系统基础配置
  • 网络编程socket accept函数的理解
  • 【2024版】最新6款漏洞扫描工具来了!(附下载)看完这一篇就够了_windows漏洞扫描工具
  • 串口和TCP互相转发工具
  • java编程思想pdf高清
  • 网络设备主备配置系列2:netscreen防火墙双机主备
  • MUI框架-01-介绍-准备-创建项目
  • NHibernate配置
  • 逻辑门图解—与门、或门、非门、与非门、或非门、异或门、同或门
  • PHP实现数据进行四舍五入的4种方法
  • 制作高质量SVG的最佳工具,这些编辑软件你需要知道!
  • 【MySQL】——数据库设计概述与需求分析
  • Linux驱动程序的数据封装
  • Myeclipse下载与破解
  • vscode使用‘koroFileHeader‘插件生成注释
  • USB转串口设备实现PC端与开发板连通
  • insert into 语句的四种写法
  • 摩托罗拉XOOM解锁,刷入Recovery,XOOMROOT,卡刷ROM最全最实用的教程
  • C/C++和python中的指针区别【含代码】
  • 一文读懂大厂面试的操作系统面试题目(超详细整理,线程,进程,死锁)
  • BF算法(暴⼒算法)-- 模式匹配算法
  • 《鸟哥Linux私房菜》学习笔记
  • 异步调用的理解